Формирование запроса
Просмотр только определенных столбцов таблицы
Мощность команды SELECT заключается в ее свойстве извлекать из таблицы лишь определенную информацию. Надо отметить возможность просмотра только указан ных столбцов таблицы. Для этого достаточно пропустить столбцы, которые нет необ ходимости просматривать, в части команды SELECT. Например, по запросу
SELECT sname, comm
FROM Salespeople;
получаются выходные данные, представленные на рис. 3.2.
Существуют таблицы, включающие большое количество столбцов, содержащих данные, не все из которых требуются в определенный момент. Следовательно, воз можность выбора и указания интересующих колонок весьма полезна.
Рис. 3.2. Выбор определенных столбцов
Перестановка столбцов
Колонки таблицы упорядочены по определению, но это не значит, что их нужно из влекать в том же порядке. Звездочка (*) извлечет столбцы в соответствии с их поряд ком, но если указать столбцы раздельно, они выстраиваются их в любом желаемом порядке. В таблице Orders зададим такой порядок столбцов: сначала разместим стол бец "дата заказа" (odate), за ним - столбец "номер продавца" (snum), затем - "номер заказа" (onum) и "количество" (amt):
SELECT odate, snum, onum, amt
FROM Orders:
21
Глава 3. Использоваиие SQL для выборки даниых из таблиц
Выходные данные, полученные по этому запросу, представлены на рис. 3.3. Очевидно, что структура информации в таблицах является просто основой для ее
реструктуризации средствами SQL.
Устранение избыточных данных
DISТINCT - аргумент, дающий возможность исключить дублирующиеся значе-
Рис. 3.3. Переупорядоченные столбцы
ния из результата выполнения предложения SELECT. Предположим, необходимо уз нать, какие продавцы имеют в настоящее время заказы в таблице Orders. Не имеет
значения количество заказов каждого из продавцов, нужен лишь список номеров про
давцов (snum). Необходимо ввести:
SELECT snum
FROM Orders;
чтобы получить результат, представленный на рис. 3.4.
Для того чтобы получить список без повторений, который легче прочесть, нужно
ввести следующую команду:
SELECT DISTINCT snum
FROM Orders;
Выходные данные для этого запроса представлены на рис. 3.5.
DISTINCT отслеживает, какие значения появились в списке выходных данных, и исключает из него дублирующиеся значения. Это полезный способ исключить избы точные данные. Если таковых нет, не следует использовать D!SТINCT, поскольку он может скрыть проблемы. Предположим, все имена покупателей различны. Если кто-то
22
Формирование запроса
Р11с. 3.4. SELECT с повторениями
Рис. 3.5. SELECT без повторений
введет второго покупателя с фамилией Clemens в таблицу Customers при использова нии SELECT DISТINCT cname, можно не заметить, что имеются дублирующиеся дан ные. Будут получены ошибочные сведения о Clemens, поскольку в этом случае нет информации об избыточности данных.
23
Глава 3. Использование SQL для выборки данных из таблиц
Параметры DISТINCT. DISТINCT можно задать только один раз для данного предложения SELECT. Если SELECT извлекает множество полей, то он исключает строки, в которых все выбранные поля идентичны. Строки, в которых некоторые зна чения одинаковы, а другие - различны, включаются в результат. DISТINCT, факти чески, действует на всю выходную строку, а не на отдельное поле (исключение составляет его применение внутри агрегатных функций, см. главу 6), исключая воз
можность их повторения.
DISТINCT в сравнении с ALL. Альтернативой DISTINCT является ALL. Это ключевое слово имеет противоположное действие: повторяющиеся строки включа ются в состав выходных данных. Поскольку часто бывает так, что не заданы ни DISТINCT, ни ALL, предполагается ALL; это ключевое слово имеет преимущество перед функциональным аргументом.
Определение выборки - предложение
WHERE
Таблицы бывают достаточно большими с тенденцией к увеличению по мере добав ления строк. В данный момент времени интересны только некоторые строки таблицы. SQL дает возможность задать критерий определения строк, которые следует включить в состав выходных данных. Предложение WHERE команды SELECT позволяет опре делить предикат, условие, которое может быть либо истинным, либо ложным для ка ждой строки таблицы. Команда извлекает только те строки из таблицы, для которых предикат имеет значение "истина". Предположим, необходимо узнать имена всех про давцов в Лондоне (London). В этом случае можно ввести следующую команду:
SELECT sname, city
FROM Salespeople
WHERE city = 'London';
Лри наличии предложения WHERE программа обработки базы данных просматри вает таблицу строка за строкой и для каждой строки проверяет, истинен ли на ней пре дикат. Следовательно, для записи о продавце Рее/ программа просмотрит текущее значение в столбце city (город), определит, что оно равно 'London', и включит эту стро ку в состав выходных данных. Запись о продавце Serres не включается и т.д. Выход ные данные для приведенноm выше запроса представлены на рис. 3.6.
Столбец city включен в результат не потому, что он указан в предложении WHERE, а потому, что имя этого столбца указано в предложении SELECT. Совершенно необя зательно, чтобы столбец, используемый в предложении WHERE, был представлен в числе тех столбцов, которые необходимо видеть среди выходных данных.
Можно рассмотреть пример с использованием числового поля в предложении WHERE. Поле rating таблицы Custoшers предназначено для того, чтобы разделить по купателей на группы по некоторому критерию в соответствии с этим номером. Это
24
О1tределение выборки - предло:ж:ение WHERE
Рис. 3.6. SELECT с предложением WHERE
своего рода оценка кредита или оценка, основанная на значении предыдущих поку
пок. Такие цифровые коды могут быть полезны в реляционных базах данных как спо соб обобщения сложной информации. Можно выбрать всех покупателей (Customers) с рейтингом (rating) 100 следующим образом:
SELECT *
FROM Customers
WHERE rating = 100;
Здесь не используются одиночные кавычки, поскольку поле rating является число вым. Результат запроса представлен на рисунке 3.7.
К предложению WHERE относятся все комментарии, сделанные в этой главе ра нее. Т.е. можно использовать номера столбцов, иск~1ючать повторяющиеся строки или
переставлять столбцы в командах SELECT, использующих WHERE.
25