· Вложенный запрос возвращает один столбец или одно значение везде, где сравнивает значение в выражении с помощью следующих операторов: =, <, >, <=, >=, <>, !>, или! <.
· Вложенный запрос возвращает один столбец или много значений, которые используются в списке оператора сравнения IN директивы WHERE.
· Вложенный запрос возвращает много строк, которые проверяются на существование с помощью оператора EXISTS в директиве WHERE.
· ВСТАВКА ОДНОГО ЗАПРОСА ВНУТРЬ ДРУГОГО
SELECT *
FROM Orders
WHERE snum =
(SELECT snum
FROM Salespeople
WHERE sname = 'Motika');
====================================
onum amt odate cnum snum
----- ------- ---------- ----- -----
3002 1900.10 10/03/1990 2007 1004
=====================================
Правильное использование выражений:
<скалярная форма><оператор><подзапрос>
Неправильно:
<подзапрос><оператор><скалярная форма>
или
<подзапрос> <оператор> <подзапрос>
SELECT *
FROM Orders
WHERE ( SELECT DISTINCT snum
FROM Orders
WHERE cnum = 2001 ) = snum;
ИСПОЛЬЗОВАНИЕ ПОДЗАПРОСОВ, КОТОРЫЕ ВЫДАЮТ МНОГО СТРОК С ПОМОЩЬЮ ОПЕРАТОРА IN
SELECT *
FROM Orders
WHERE snum IN
( SELECT snum
FROM Salespeople
WHERE city = "LONDON" );
ИСПОЛЬЗОВАНИЕ ВЫРАЖЕНИЙ В ПОДЗАПРОСАХ
SELECT *
FROM Customers
WHERE cnum =
( SELECT snum + 1000
FROM Salespeople
WHERE sname = Serres );
ПОДЗАПРОСЫ В ПРЕДЛОЖЕНИИ HAVING
SELECT rating, COUNT ( DISTINCT cnum )
FROM Customers
GROUP BY rating
HAVING rating >
( SELECT AVG (rating)
FROM Customers
WHERE city = " San Jose';
ИСПОЛЬЗОВАНИЕ ОПЕРАТОРОВ
EXISTS И NOT EXISTS
SELECT cnum, cname, city
FROM Customers
WHERE EXISTS
( SELECT *
FROM Customers
WHERE city = ‘London’ );
· ИСПОЛЬЗОВАНИЕ ОПЕРАТОРОВ
ANY, ALL, SOME
SELECT *
FROM Salespeople
WHERE city = ANY
(SELECT city
FROM Customers );
SELECT *
FROM Customers
WHERE rating > ALL
(SELECT rating
FROM Customers
WHERE city = Rome ):
· ИСПОЛЬЗОВАНИЕ ПРЕДЛОЖЕНИЯ SELECT INTO
SELECT <список столбцов >
INTO <имя новой таблицы >
FROM <список таблиц>
[WHERE <условие поиска>]
· ИСПОЛЬЗОВАНИЕ ПРЕДЛОЖЕНИЯ UNION
SELECT список_столбцов [INТО директива]
FROM директива
[WHERE директива]
[GROUP ВУ директива]
[HAVING директива]
UNION [ALL]
SELECT список_столбцов
FROM директива
[WHERE директива]
[GROUP ВУ директива]
[HAVING директива]
[ORDER ВУ директива]
[COMPUTE директива]
Правила использования UNION:
- Количество столбцов, последовательность столбцов и их типы данных в обоих списках столбцов должны совпадать.
- Если в одном из запросов используется директива INTO, то она должна задаваться в первом запросе.
- Директивы GROUP ВУ и HAVING используются только в одном запросе.
- Директивы ORDER ВУ И СОМРИТЕ используются только в конце оператора UNION.
- Имена столбцов результата определяются списком столбцов первого оператора SELECT.
Формирование объединения из двух запросов
SELECT snum, sname
FROM Salespeople
WHERE city = 'London'
UNION
SELECT cnum, cname
FROM Customers
WHERE city = 'London';
=================
snum sname
----- --------
1001 Peel
1004 Motika
2001 Hoffman
2006 Climens
==================
КОГДА МОЖНО ДЕЛАТЬ ОБЪЕДИНЕНИЕ МЕЖДУ ЗАПРОСАМИ?
· столбцы вывода должны быть совместимы для объединения;
· пустые значения (NULL) запрещены в любом столбце объединения;
· нельзя использовать UNION в подзапросах;
· нельзя использовать функции в предложении SELECT запроса в объединении;