Понимание SQL
Шрифт:
SELECT snum, comm FROM Salespeople;
sname | comm |
Peel | 0.12 |
Serres | 0.13 |
Motika | 0.11 |
Rifkin | 0.15 |
Axelrod | 0.10 |
Таблица 3.2: Выбор определенных столбцов
Могут иметься таблицы которые имеют большое
Даже если столбцы таблицы, по определению, упорядоченны, это не означает что вы будете восстанавливать их в том же порядке. Конечно, звездочка (*) покажет все столбцы в их естественном порядке, но если вы укажете столбцы отдельно, вы можете получить их в том порядке котором хотите. Давайте рассмотрим таблицу Порядков, содержащую дату приобретения(odate), номер продавца(snum), номер порядка(onum), и суммы приобретения(amt):
SELECT odate, snum, onum, amt
FROM Orders;
Вывод этого запроса показан Таблице 3.3.
SELECT odate, snum, onum, amt FROM Orders;
odate | snum | onum | amt |
10/03/1990 | 1007 | 3001 | 18.69 |
10/03/1990 | 1001 | 3003 | 767.19 |
10/03/1990 | 1004 | 3002 | 1900.10 |
10/03/1990 | 1002 | 3005 | 5160.45 |
10/03/1990 | 1007 | 3006 | 1098.16 |
10/04/1990 | 1003 | 3009 | 1713.23 |
10/04/1990 | 1002 | 3007 | 75.75 |
10/05/1990 | 1001 | 3008 | 4723.00 |
10/06/1990 | 1002 | 3010 | 1309.95 |
10/06/1990 | 1001 | 3011 | 9891.88 |
Рисунок 3.3: Реконструкция столбцов
Как вы можете видеть, структура информации в таблицах - это просто основа для активной перестройки структуры в SQL.
DISTINCT (ОТЛИЧИЕ) - аргумент который обеспечивает Вас способом устранять двойные значения из вашего предложения SELECT. Предположим что вы хотите знать какие продавцы в настоящее время имеют свои порядки в таблице Порядков. Под порядком (здесь и далее) будет пониматься запись в таблицу Порядков, регистрирующую приобретения сделанные в определенный день определенным заказчиком у определенного продавца на определенную сумму). Вам не нужно знать, сколько порядков имеет каждый; вам нужен только список номеров продавцов (snum). Поэтому Вы можете ввести:
SELECT snum
FROM Orders;
для получения вывода показанного в Таблице 3.4
SELECT snum FROM Orders;
snum |
1007 |
1001 |
1004 |
1002 |
1007 |
1003 |
1002 |
1001 |
1002 |
1001 |
Таблица 3.4: SELECT
Для получения списка без дубликатов, для удобочитаемости, вы можете ввести следующее:
SELECT DISTINCT snum
FROM Orders;
Вывод для этого запроса показан в Таблице 3.5.
Другими словами, DISTINCT следит за тем, какие значения были ранее, так что бы они не были продублированы в списке. Это - полезный способ избежать избыточности данных, но важно что бы при этом вы понимали что вы делаете. Если вы не хотите потерять некоторые данные, вы не должны безоглядно использовать DISTINCT, потому что это может скрыть какую-то проблему или какие-то важные данные. Например, вы могли бы предположить что имена всех ваших заказчиков различны. Если кто-то помещает второго Clemens в таблицу Заказчиков, а вы используете SELECT DISTINCT cname, вы не будете даже знать о существовании двойника. Вы можете получить не того Clemens и даже не знать об этом. Так как вы не ожидаете избыточности, в этом случае вы не должны использовать DISTINCT.
DISTINCT может указываться только один раз в данном предложении SELECT. Если предложение выбирает многочисленные поля,
SQL Execution Log
SELECT DISTINCT snum FROM Orders;
snum |
1001 |
1002 |
1003 |
1004 |
1007 |
Таблица 3.5: SELECT без дублирования
DISTINCT опускает строки где все выбранные поля идентичны. Строки в которых некоторые значения одинаковы а некоторые различны - будут сохранены. DISTINCT, фактически, приводит к показу всей строки вывода, не указывая полей (за исключением когда он используется внутри агрегатных функций, как описано в Главе 6 ), так что нет никакого смысла чтобы его повторять.
Вместо DISTINCT, вы можете указать - ALL. Это будет иметь противоположный эффект, дублирование строк вывода сохранится. Так как это - тот же самый случай когда вы не указываете ни DISTINCT ни ALL, то ALL - по существу скорее пояснительный, а не действующий аргумент.
Таблицы имеют тенденцию становиться очень большими, поскольку с течением времени, все большее и большее количество строк в нее добавляется. Поскольку обычно из них только определенные строки интересуют вас в данное время, SQL дает возможность вам устанавливать критерии чтобы определить какие строки будут выбраны для вывода.
WHERE - предложение команды SELECT, которое позволяет вам устанавливать предикаты, условие которых может быть или верным или неверным для любой строки таблицы. Команда извлекает только те строки из таблицы для которой такое утверждение верно. Например, предположим вы хотите видеть имена и комиссионные всех продавцов в Лондоне. Вы можете ввести такую команду:
SELECT sname, city
FROM Salespeople;
WHERE city="LONDON";
Когда предложение WHERE представлено, программа базы данных просматривает всю таблицу по одной строке и исследует каждую строку чтобы определить верно ли утверждение. Следовательно, для записи Peel, программа рассмотрит текущее значение столбца city, определит что оно равно "London", и включит эту строку в вывод. Запись для Serres не будет включена, и так далее.
Вывод для вышеупомянутого запроса показан в Таблице 3.6.