Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
SQL.doc
Скачиваний:
19
Добавлен:
14.03.2016
Размер:
382.46 Кб
Скачать

Объединение

Для объединения запросов используется служебное слово UNION:

  1. <запрос 1>

  2. UNION [ALL]

  3. <запрос 2>

Предложение UNION приводит к появлению в результирующем наборе всех строк каждого из запросов. При этом, если определен параметр ALL, то сохраняются все дубликаты выходных строк, в противном случае в результирующем наборе присутствуют только уникальные строки. Заметим, что можно связывать вместе любое число запросов. Кроме того, с помощью скобок можно задавать порядок объединения.

Операция объединения может быть выполнена только при выполнении следующих условий:

  •  количество выходных столбцов каждого из запросов должно быть одинаковым;

  •  выходные столбцы каждого из запросов должны быть совместимы между собой (в порядке их следования) по типам данных;

  •  в результирующем наборе используются имена столбцов, заданные в первом запросе;

  •  предложение ORDER BY применяется к результату соединения, поэтому оно может быть указано только в конце всего составного запроса.

Пример: Найти тип продукции, номер модели и цену ПК и портативных компьютеров:

  1. SELECT Product.type, PC.model, price

  2. FROM PC INNER JOIN  

  3.      Product ON PC.model = Product.model

  4. UNION

  5. SELECT Product.type, Laptop.model, price

  6. FROM Laptop INNER JOIN  

  7.      Product ON Laptop.model = Product.model

  8. 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.

  1. SELECT name FROM Ships

  2. INTERSECT

  3. SELECT ship FROM Outcomes;

В реляционной алгебре операция пересечения является коммутативной, поскольку она применима к отношениям с одинаковыми заголовками. Мы и в SQL можем поменять запросы местами.

Пример2: Найти корабли из таблицы Outcomes, которые отсутствуют в таблице Ships.

  1. SELECT ship FROM Outcomes

  2. EXCEPT

  3. SELECT name FROM Ships;

Операция разности не является коммутативной, поэтому если переставить местами запросы, то мы получим решение совсем другой задачи:

"Найти корабли из таблицы Ships, которые отсутствуют в таблице Outcomes".

Следует сказать, что не все СУБД поддерживают эти предложения в операторе SELECT. Нет поддержки INTERSECT/EXCEPT, например, в MySQL, а  в MS SQL Server она появилась, лишь начиная с версии 2005, и то без ключевого слова ALL. ALL с INTERSECT/EXCEPT также еще не реализована в Oracle.

Поэтому для выполнения операций пересечения и разности могут быть использованы другие средства. Здесь уместно заметить, что один и тот же результат можно получить с помощью различных формулировок оператора SELECT. В случае пересечения и разности можно воспользоваться предикатом существования EXISTS.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]