- •Простой оператор select
- •Предикаты
- •Предикаты сравнения
- •Предикат in
- •Объединение
- •Пересечение и разность
- •Предикат exists
- •Получение итоговых значений
- •Предложение group by
- •Предложение having
- •Использование в запросе нескольких источников записей
- •Использование ключевых слов some (any) и all с предикатами сравнения
- •Переименование столбцов и вычисления в результирующем наборе
- •Преобразование типов и оператор cast
- •Оператор case
- •Предикат like
- •Предикат like и регулярные выражения
- •Использование значения null в условиях поиска
- •Функция datepart
- •Нумерация строк в соответствии с порядком, заданном значениями первичного ключа
- •Функция row_number
- •Декартово произведение
- •Коррелирующие подзапросы
Объединение
Для объединения запросов используется служебное слово UNION:
<запрос 1>
UNION [ALL]
<запрос 2>
Предложение UNION приводит к появлению в результирующем наборе всех строк каждого из запросов. При этом, если определен параметр ALL, то сохраняются все дубликаты выходных строк, в противном случае в результирующем наборе присутствуют только уникальные строки. Заметим, что можно связывать вместе любое число запросов. Кроме того, с помощью скобок можно задавать порядок объединения.
Операция объединения может быть выполнена только при выполнении следующих условий:
количество выходных столбцов каждого из запросов должно быть одинаковым;
выходные столбцы каждого из запросов должны быть совместимы между собой (в порядке их следования) по типам данных;
в результирующем наборе используются имена столбцов, заданные в первом запросе;
предложение ORDER BY применяется к результату соединения, поэтому оно может быть указано только в конце всего составного запроса.
Пример: Найти тип продукции, номер модели и цену ПК и портативных компьютеров:
SELECT Product.type, PC.model, price
FROM PC INNER JOIN
Product ON PC.model = Product.model
UNION
SELECT Product.type, Laptop.model, price
FROM Laptop INNER JOIN
Product ON Laptop.model = Product.model
ORDER BY price DESC;
Пересечение и разность
В стандарте языка SQL имеются предложения оператора SELECT для выполнения операций пересечения и разности результатов запросов-операндов. Этими предложениями являются INTERSECT [ALL] (пересечение) иEXCEPT [ALL] (разность), которые работают аналогично предложению UNION. В результирующий набор попадают только те строки, которые присутствуют в обоих запросах (INTERSECT) или только те строки первого запроса, которые отсутствуют во втором (EXCEPT). При этом оба запроса, участвующих в операции, должны иметь одинаковое число столбцов, и соответствующие столбцы должны иметь одинаковые (или неявно приводимые) типы данных. Имена столбцов результирующего набора формируются из заголовков первого запроса.
Если не используется ключевое слово ALL (по умолчанию подразумевается DISTINCT), то при выполнении операции автоматически устраняются дубликаты строк. Если указано ALL, то количество дублированных строк подчиняется следующим правилам (n1 - число дубликатов строк первого запроса, n2 - число дубликатов строк второго запроса):
INTERSECT ALL: min(n1, n2)
EXCEPT ALL: n1 - n2, если n1>n2.
Пример1: Найти корабли, которые присутствуют как в таблице Ships, так и в таблице Outcomes.
SELECT name FROM Ships
INTERSECT
SELECT ship FROM Outcomes;
В реляционной алгебре операция пересечения является коммутативной, поскольку она применима к отношениям с одинаковыми заголовками. Мы и в SQL можем поменять запросы местами.
Пример2: Найти корабли из таблицы Outcomes, которые отсутствуют в таблице Ships.
SELECT ship FROM Outcomes
EXCEPT
SELECT name FROM Ships;
Операция разности не является коммутативной, поэтому если переставить местами запросы, то мы получим решение совсем другой задачи:
"Найти корабли из таблицы Ships, которые отсутствуют в таблице Outcomes".
Следует сказать, что не все СУБД поддерживают эти предложения в операторе SELECT. Нет поддержки INTERSECT/EXCEPT, например, в MySQL, а в MS SQL Server она появилась, лишь начиная с версии 2005, и то без ключевого слова ALL. ALL с INTERSECT/EXCEPT также еще не реализована в Oracle.
Поэтому для выполнения операций пересечения и разности могут быть использованы другие средства. Здесь уместно заметить, что один и тот же результат можно получить с помощью различных формулировок оператора SELECT. В случае пересечения и разности можно воспользоваться предикатом существования EXISTS.