Выборка данных из таблицы в SQL (разделы SELECT, FROM и WHERE)
Выборка данных из таблицы в SQL осуществляется с помощью следующей конструкции:
SELECT [DISTINCT|ALL] *|<имена столбцов>
[AS <новые имена>] FROM <имена таблиц> [<псевдонимы>] [<условие внешнего объединения таблиц>] [WHERE <предикат> [AND <условие внутреннего объединения таблиц>]]
[GROUP BY [ROLLUP|CUBE|GROUPING SET(<список столбцов>)]|<список столбцов> [HAVING <предикат>]]
[ORDER BY <список имен|номеров столбцов> [COLLATE <список сопоставления>][ASC|DESC]]
Раздел SELECT
Этот раздел является обязательным и позволяет:
→ Определить список выходных столбцов
Список выходных столбцов может быть указан несколькими способами:
• Указать символ *, обозначающий включение в результаты запроса всех колонок запроса в естественной последовательности.
• Перечислить в желательном порядке только нужные <имена столбцов>.
Пример: SELECT * FROM Customer
→ Включить вычисляемые столбцы
В качестве вычисляемых столбцов запроса могут выступать:
• Результаты простейших арифметических выражения (+, -, /, *_ или конкатенации строк (||).
• Результаты функций агрегирования COUNT(*)|{AVG|SUM|MAX|MIN|COUNT} ([DISTINCT|ALL] <столбец | скалярное выражение>)
Примечание: В SQL Server дополнительно можно использовать оператор % — модуль (целый остаток от деления).
→ Включить константы
В качестве столбцов могут выступать константы числового и символьного типов.
Примечание: SELECT DISTINCT ‘Для ‘, SNum, Comm*100, ‘%’, SName FROM SalesPeople
→ Переименовать выходные столбцы
Вычисляемым, а также любым другим столбцам, при желании, можно присвоить уникальное имя с помощью ключевого слова AS: <выражение> AS <новое имя>
Примечание: В SQL SERVER дать новое имя столбцу можно с помощью оператора присвоения <новое имя>=<выражение>
→ Указать принцип обработки дублей строк
DISTINCT – запрещает появление строк-дублей в выходном множестве. Его можно задавать один раз для оператора SELECT. На практика первоначально формируется выходное множество, упорядочивается, а затем из него удаляются повторяющиеся значения. Обычно это занимает много времени и не следует этим злоупотреблять.
ALL (действует по умолчанию) – обеспечивает включение в результаты запроса и повторяющихся значений
→ Включить агрегатные функции
Функции агрегирования (функции над множествами, статистические или базовые) предназначены для вычисления некоторых значений для заданного множества строк. Используются следующие агрегатные функции:
• AVG|SUM(<выражение>|[DISTINCT]<имя столбца>) – подсчитывает среднее значение | сумму от <выражение> или <столбца>, возможно без учета дублей, игнорируя NULL.
• MIN|MAX(<выражение>) – находит максимальное | минимальное значение.
• COUNT(*[DISTINCT] <имя столбца>) – подсчитывает число строк во множестве с учетом NULL значений | значений в столбце, игнорируя NULL значения, возможно без дублей.
Примечания по использованию:
• Функции агрегирования нельзя вкладывать друг в друга.
• Из-за значений NULL выражение SUM(F1)-SUN(F2)<>Sum(F1-F2)
• Внутри функций агрегирования допустимы выражения AVG(Comm*100)
• Если в результате запроса не получено ни одной строки или все значения равны NULL, то функция COUNT возвращает 0, а другие – NULL.
• Функции AVG и SUM могут применяться только для числовых типов, данных в Interval, а остальные могут использоваться для любых типов данных.
• Функция COUNT возвращает целое число (типа Integer), а другие наследуют типы данных обрабатываемых значений, вследствие чего следует следить за точностью результата функции SUM (возможно переполнение) и масштабом функции AVG.
Примеры на агрегатные функции:
• SELECT COUNT(*) FROM Customer
• SELECT COUNT(DISTINCT SNum) FROM Orders
• SELECT MAX(Amt+Binc) FROM Orders //Если Binc – дополнительное числовое поле в Orders
• SELECT AVG(Comm*100) FROM SalesPeople //Выражение внутри функции
→ Особенности промышленных серверов
В СУБД Oracle в разделе SELECT можно указывать дополнительные указания-подсказки (hints) (27 штук), влияющие на выбор типа оптимизатора запросов и его работу.
SELECT /*+ ALL_ROWS */ <список полей> FROM Orders… //наилучшая производительность
В СУБД SQL Server:
[TOP (<выражение>) [PERCENT] [WITH TIES]] – задает количество или процент считываемых строк. При одинаковых последних значениях возможно считывание всех таких строк и общее число может быть больше указанного.
DECLARE @p AS Int
SELECT @p=10
SELECT TOP(@p) WITH TIES * FROM Orders
Раздел FROM
Этот раздел является обязательным и позволяет:
→ Указать имена исходных таблиц
В разделе FROM указываются имена таблиц и/или представлений, из которых будут извлекаться данные. Причем одна и та же таблица может несколько раз входить в этот раздел.
Примечание: В СУБД Oracle можно выбирать строки и из снимков (Snapshot).
→ Указать псевдонимы таблиц
Под псевдонимом таблицы понимается дополнительный, обычно краткий идентификатор, указываемый через пробел после имени таблицы/представления.
Пример: Customer C
→ Указать вариант внешнего объединения таблиц
Если в разделе FROM указано несколько таблиц, то все они неявно считаются внешними соединениями. В стандарте предусмотрены следующие основные виды соединений таблиц:
1) Перекрестное соединение
<таблица А> CROSS JOIN <таблица B> — определяются все возможные сочетания пар строк по одной для каждой строки каждой из объединяемых таблиц. Эквивалентно картезианскому соединению. Иногда называет декартовым произведением.
2) Естественное соединение
<таблица А> [NATURAL] [<тип соединения>] JOIN <таблица B> — определяются только те строки таблиц А и B, в которых значения столбцов одинаковы. Называют не совсем полноценным эквисоединением. Это автоматическое соединение по нескольким столбцам со всеми одинаковыми именами (join over).
3) Соединение объединением
<таблица А> UNION JOIN <таблица B> — определяются только те строки каждой из таблиц, для которых совпадения не были установлены. Столбцы из другой таблицы заполняются значениями NULL. Отметим, что соединение UNION и оператор UNIUN – это не одно и то же. Соединение противоположно соединению типа INNER.
4) Объединение посредством предиката
<таблица А> [<тип соединения>] JOIN <таблица B> ON <предикат> — фильтрует строки. Предикат может содержать подзапросы.
5) Объединение посредством имен столбцов
<таблица А> [<тип соединения>] JOIN <таблица B> USING(<имя столбца,…>) – определяет соединение только по указанным столбцам, в то время как NATURAL – автоматически по всем одноименным.
Типы соединений
<тип соединения> представляет собой один из аргументов: INNER|{LEFT|RIGHT|FULL[OUTER]}
• INNER – включает строки, в которых есть столбцы с совпадающими данными объединяемых таблиц. Используется по умолчанию.
• LEFT[OUTER] – включает все строки таблицы А (левая таблица) и все совпадающие значения из таблицы B. Столбцы несовпадающих строки заполняются NULL-значениями.
• RIGHT[OUTER] – включает все строки таблицы B (правая таблица) и все совпадающие значения таблицы А. обратный вариант для левого объединения.
• FULL[OUTER] – включает все строки обеих таблиц. Столбцы совпадающих строк заполнены реальными значениями, а несовпадающих строк – NULL-значениями.
• OUTER (внешний) – уточняющее слово, означающее, что несовпадающие строки из ведущей таблицы включаются вместе с совпадающими.
Примеры на внешнее объединение:
• SELECT * FROM SalesPeople INNER JOIN Customer ON SalesPeople.City=Customer.City
• SELECT * FROM Customer LEFT OUTER JOIN SalesPeople ON SalesPeople.City=Customer.City
• SELECT * FROM Customer FULL OUTER JOIN SalesPeople ON SalesPeople.City=Customer.City
Картезианские соединения и самообъединения
• Если при включении нескольких таблиц не используются те или иные варианты соединения таблиц, то такие соединения называются картезианскими. Они используются для получения строк из двух различных таблиц. Тогда например, при соединении двух таблиц, каждая из которых содержит по 20 строк, итоговая таблица будет содержать 100 строк – каждая из строк одной таблицы с каждой из строк другой таблицы. SELECT * FROM Customer, Orders.
• Соединения одинаковых таблиц называют самообъединением (self-join).
Раздел WHERE
1. Создание внутренних соединений
Связь между таблицами осуществляют с помощью операторов сравнения, а в список выходных столбцов включают квалификационные имена для одноименных столбцов из исходных таблиц.
Основные виды соединений:
• Эквисоединения – это соединения таблиц, основанные на равенствах. Связь между таблицами по ключевым столбцам обеспечивает ссылочную целостность. Если при соединении используются первичный и внешний ключ то всегда существует отношение «один-ко-многим» (предок/потомок).
• Тэта-соединения – это такое соединение, когда в качестве оператора сравнения применяется неравенство (<>, >=, <=, >, <) (theta join, θ-join) • Примечания по SQL Server
В SQL Server левое, правое и полное соединение можно задать в разделе WHERE с помощью [*]=[*]. Фактически реализуется внешнее соединение, которое у других СУБД реализуется в разделе FROM.
• Примеры внутренних соединений
SELECT C.CName, S.SName, S.City FROM SalesPeople S, Customer C WHERE S.City=C.City
SELECT SName, CName FROM SalesPeople, Customer WHERE SName
2. Фильтрация строк выходного множества
Раздел WHERE позволяет также определить <предикат>, т.е. логическое условие, которое может быть либо истинным, либо ложным. Кроме того, одно или оба сравниваемых значения в предикате могут быть равны NULL, тогда результат сравнения может быть равен UNKNOWN. Оператор SELECT извлекает только те строки из таблиц, для которых <предикат> имеет значение TRUE, исключая строки, для которых он равен FALSE или UNKNOWN.