Мартин Грубер - Понимание SQL
Позже, мы покажем как это делается. А сейчас, просто усвойте, что в отсутствии явного упорядочения, нет никакого определенного порядка в вашем выводе.
Наше использование возврата (Клавиша ENTER ) является произвольным. Мы должны точно установить как удобнее составить запрос, в несколько строк или в одну строку, следующим образом:
SELECT snum, sname, city, comm FROM Salespeople;
С тех пор как SQL использует точку с запятой чтобы указывать конец команды, большинство программ SQL обрабатывают возврат (через нажим Возврат или клавишу ENTER ) как пробел. Это - хорошая идея чтобы использовать возвраты и выравнивание что мы делали это ранее, чтобы сделать ваши команды более легкими для чтения и более правильными.
ВЫБИРАЙТЕ ВСЕГДА САМЫЙ ПРОСТОЙ СПОСОБЕсли вы хотите видеть каждый столбец таблицы, имеется необязательное сокращение которое вы можете использовать. Звездочка (*) может применяться для вывода полного списка столбцов следующим образом:
SELECT *
FROM Salespeople;
Это привыведет к тому же результату что и наша предыдущая команда.
ОПИСАНИЕ SELECTВ общем случае, команда SELECT начинается с ключевого слова SELECT, сопровождаемого пробелом. После этого должен следовать список имен столбцов которые вы хотите видеть, отделяемые запятыми. Если вы хотите видеть все столбцы таблицы, вы можете заменить этот список звездочкой (*). Ключевое слово FROM следующее далее, сопровождается пробелом и именем таблицы запрос к которой делается. В заключение, точка с запятой (; ) должна использоваться чтобы закончить запрос и указать что команда готова к выполнению.
ПРОСМОТР ТОЛЬКО ОПРЕДЕЛЕННОГО СТОЛБЦА ТАБЛИЦЫКоманда SELECT способна извлечь строго определенную информацию из таблицы. Сначала, мы можем предоставить возможность увидеть только определенные столбцы таблицы. Это выполняется легко, простым исключением столбцов которые вы не хотите видеть, из части команды SELECT. Например, запрос
SELECT sname, comm
FROM Salespeople;
будет производить вывод показанный в Таблице 3.2.
SQL Execution LogSELECT 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.
SQL Execution LogSELECT 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
SQL Execution LogSELECT 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.
ПАРАМЕТРЫ DISTINCTDISTINCT может указываться только один раз в данном предложении 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. Это будет иметь противоположный эффект, дублирование строк вывода сохранится. Так как это - тот же самый случай когда вы не указываете ни DISTINCT ни ALL, то ALL - по существу скорее пояснительный, а не действующий аргумент.
КВАЛИФИЦИРОВАННЫЙ ВЫБОР ПРИ ИСПОЛЬЗОВАНИИ ПРЕДЛОЖЕНИЙТаблицы имеют тенденцию становиться очень большими, поскольку с течением времени, все большее и большее количество строк в нее добавляется. Поскольку обычно из них только определенные строки интересуют вас в данное время, SQL дает возможность вам устанавливать критерии чтобы определить какие строки будут выбраны для вывода.
WHERE - предложение команды SELECT, которое позволяет вам устанавливать предикаты, условие которых может быть или верным или неверным для любой строки таблицы. Команда извлекает только те строки из таблицы для которой такое утверждение верно. Например, предположим вы хотите видеть имена и комиссионные всех продавцов в Лондоне. Вы можете ввести такую команду:
SELECT sname, city
FROM Salespeople;
WHERE city="LONDON";
Когда предложение WHERE представлено, программа базы данных просматривает всю таблицу по одной строке и исследует каждую строку чтобы определить верно ли утверждение. Следовательно, для записи Peel, программа рассмотрит текущее значение столбца city, определит что оно равно "London", и включит эту строку в вывод. Запись для Serres не будет включена, и так далее.
Вывод для вышеупомянутого запроса показан в Таблице 3.6.
SQL Execution LogSELECT sname, city FROM Salespeople WHERE city='London'
sname city
Peel London
Motika London
Рисунок 3.6: SELECT c предложением WHERE
Давайте попробуем пример с числовым полем в предложении WHERE. Поле rating таблицы Заказчиков предназначено чтобы разделять заказчиков на группы основанные на некоторых критериях которые могут быть получены в итоге через этот номер. Возможно это - форма оценки кредита или оценки основанной на томе предыдущих приобретений. Такие числовые коды могут быть полезны в реляционных базах данных как способ подведения итогов сложной информации. Мы можем выбрать всех заказчиков с рейтингом 100, следующим образом: