Лекция 9. Выборка данных
Команда SELECT состоит из семи основных частей: списка выборки и
разделов FROM , WHERE , GROUP BY , HAVING , ORDER BY и COMPUTE –
обязательным является лишь список выборки, при использовании же остальных
частей необходимо их использовать в том порядке, в котором они приведены
выше.
Простая выборка данных
SELECT [ALL | DISTINCT] [TOP n [PERCENT] СписокВыборки
FROM ИмяТаблицы
WHERE УсловиеОтбора
По умолчанию команда SELECT возвращает все записи, включая дубликаты,
ч то определяется ключевым словом ALL , которое может быть опущено. Для
получения набора уникальных неповторяющихся записей необходимо указывать
ключевое слово DISTINCT .
Использование ключевого слова TOP предписывает выводить не все записи
итогового набора, а только n первых. Можно выбирать не фиксированное
количество записей, а определенный процент от всех строк – для этого
указывается ключевое слово PERCENT
Список выборки
Список выборки может содержать включать следующие один или нескольк о
элементов:
| ИмяПоля | Выражение [ AS Псевдоним], [... n ].
Для выборки всех полей из таблицы в списке выборки необходимо указать
звездочку (*).
Ключевое слово AS позволяет заменить в итоговом наборе данных обычные
имена полей псевдонимами.
Удобочитаемость получаемого набора данных может быть повышена путем
его сортировки в возрастающем или убывающем порядке. Сортировка возможна
по имени поля (даже если оно и не указано в списке выборки), по псевдониму
или по позиции в списке выборки, которые указываются в разделе ORDER BY ИмяПоля [,… n ] [ ASC | DESC ].
По умолчанию сортировка осуществляется по возрастанию, что соответствует
зарезервированному слову ASC , которое может опускаться, для сортировки в
убывающем порядке указывается – DESC .
Для отображения, рассмотренного ранее, списка сотрудников
упорядоченного в алфавитном порядке необходимо дополнить запрос:
SELECT LastName+’ ‘+Substring(FirstName,1,1)+’.’ AS [ С отрудник],
ContactID
FROM Person.Contact
ORDER BY [Сотрудник]
Условие отбора
Условие отбора определяет критерий отбора записей, включаемых в
итоговый набор. В результат будут включены только те строки, которые
соответствуют наложенным условиям. Условия могут объединяться и с
помощью логических операндов AND , OR и NOT
Эти два оператора сравнения могут быть заменены одним логическим
оператором BETWEEN , с помощью которого можно получить ответ на вопрос,
лежит ли величина в указанном диапазоне .
Для поиска по шаблону символьных строк используется логический
о ператор LIKE .
В шаблоне могут использоваться следующие универсальные символы:
% – подразумевает любую строку, состоящую из 0 и более символов;
_ – ровно один символ;
[ ] – любой символ из заданного множества (например, [ adfh ]) или диапазона (например, [0-9]),
[^] – любой символ, не попадающий в заданный диапазон или множество.
Для определения соответствия выражения одному из перечисленных в
заданном списке значений применяется логический оператор IN . Данный
оператор всегда может быть записан и в виде группы условий, объединенных
операндом OR .
Например, чтобы вывести имена сотрудников и их должностей,
проживающих за пределами США, необходимо выполнить запрос:
SELECT LastName, JobTitle
FROM HumanResources.vEmployee
WHERE CountryRegionName Not LIKE ‘%United States%’
Однако в список значений нельзя включать неопределенное значение NULL ,
для работы с такими значениями используется функция выборки IS NULL .
Например, следующий запрос возвращает список товаров, у которых не указан
цвет:
SELECT [Name]
FROM Production.Product
WHERE Color IS NULL
Выборка данных из нескольких таблиц
Такая выборка данных предполагает соединение нескольких таблиц для
получения единого набора результатов, включающих записи и поля каждой
таблицы. Соединение позволяет собрать данные, разделенные в процессе
нормализации.
Существует три вида соединений: внутреннее, внешнее и перекрестное. Для
объединения трех и более таблиц можно применять последовательность
соединений.
Для соединения таблиц необходимо раздел FROM дополнить ключевыми
словами JOIN , которое определяет соединяемые таблицы и метод соединения,
и ON , указывающее общие для таблиц поля.
Внутреннее соединение
При таком виде соединения сравниваются значения общих полей двух
таблиц, возвращаются только записи, удовлетворяющие критерию
связывания в обеих таблицах. Записи, для которых не имеется пары в
связанной таблице, в результат не включаются.
При левом соединении в результат будут включены все записи левой таблицы
(имя которой расположено слева от JOIN ), независимо от того, есть для них
соответствующая запись в правой таблице (имя таблицы расположено справа от
JOIN ) или нет.
При правом соединении (ключевое слово RIGHT JOIN ) в результат
включаются все записи правой таблицы, независимо от того, есть для них
соответствующая строка в левой таблице.
Перекрестные соединения
При таком соединении выводятся все комбинации записей таблиц, при этом
не требуется указание совпадающих значений полей, поэтому условие ON
опускается.
Оператор UNION объединяет результаты двух и более операторов SELECT
и применяется в случае, когда данные нельзя получить при помощи одного
запроса.
SELECT ...
UNION [ ALL ]
SELECT ...
[,...]
Имена полей итогового набора берутся из первого запроса, поэтому создание
псевдонимов полей выполняется в нем. Для получения отсортированного
набора данных раздел ORDER BY указывается после последнего оператора
SELECT .
Подзапрос – это оператор SELECT , включенный в другие запросы .
Существует два вида подзапросов.
Вложенные подзапросы – возвращают единственное значение либо список
значений. Вложенный запрос выполняется один раз, а затем результирующее
значение используется во внешнем запросе.
Связанные подзапросы – используются данные внешнего запроса, причем
связанный запрос выполняется один раз для каждой записи внешнего запроса.
Для группировки записей по полям или выражениям применяется раздел
GROUP BY оператора SELECT , что позволяет применять для каждой группы
функции агрегирования.
Синтаксис данной части следующий:
[ GROUP BY ВыражениеГруппировки, [... n ]]
При группировке записей допускается также использование раздела WHERE ,
в этом случае группируются записи, удовлетворяющие этому условию.
Раздел WHERE позволяет определить, какие записи должны подвергнуться
группировке, а раздел HAVING – какие группы должны быть выведены в
итоговый набор данных. Ключевое слово HAVING можно использовать только в
разделе GROUP BY .