Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы к экзамену по БД (ВФ) / !Все ответы по БД v0.2.13.docx
Скачиваний:
189
Добавлен:
10.05.2014
Размер:
3.32 Mб
Скачать

26. Коррелированные подзапросы. Особенности использования in, not in,exists, not exists.

Коррелированный подзапрос - это оператор SELECT, вложенный в другой оператор, и ссылающийся на один или несколько столбцов внешнего запроса. Поэтому можно сказать, что коррелированный подзапрос зависит от внешнего запроса. Это - главное различие между коррелированным и простым подзапросом. Простой подзапрос не ссылается на внешний запрос, он может быть выполнен независимо от него.

Оператор EXISTS возвращает значение 1 (TRUE), если результат подзапроса содержит хотя бы одну строку, и значение 0 (FALSE), если подзапрос выдает пустой результат. Например, получить список товаров, заказанных по крайней мере одним клиентом, можно с помощью запроса SELECT * FROM Products WHERE EXISTS (SELECT * FROM Orders WHERE product_id = Products.id AND customer_id IS NOT NULL);

Оператор NOT EXISTS возвращает результат, противоположный результату выполнения оператора EXISTS: 1 (TRUE), если результат подзапроса не содержит ни одной строки, и 0 (FALSE), если результат подзапроса непустой. Например, получить список клиентов, заказавших все виды товаров, можно с помощью следующего запроса: SELECT * FROM Customers WHERE NOT EXISTS (SELECT * FROM Products WHERE NOT EXISTS (SELECT * FROM Orders WHERE product_id = Products.id AND customer_id = Customers.id));

Операторы IN и NOT IN, с которыми вы познакомились в подразделе «Операторы сравнения», позволяют проверить, содержится ли некоторое значение в результате подзапроса. Рассмотрим еще один пример использования оператора IN. SELECT * FROM Customers WHERE '2007-12-12' IN (SELECT date FROM Orders WHERE Customers.id = customer_id);

Обобщенные правила по использованию IN, NOT IN, EXISTS, NOT EXISTS:

1. Правила, описанные ниже не являются рецептами на все случаи жизни. В зависимости от конкретной ситуации из них могут быть исключения.

2. Принцип работы EXIST и NOT EXISTS во многом аналогичен.

3. Принцип работы IN и NOT IN во многом аналогичен если нет значений NULL. Если присутствуют значения NULL, работа IN и NOT IN отличается.

4. Предикат NOT IN не содержит значений NULL.

5. Предикат IN может работать эффективней чем EXISTS, если внешний запрос работает с большим набором данных, а внутренний с не большим.

6. Предикат EXISTS может работать эффективней чем IN, если внешний запрос работает с небольшим набором данных, а внутренний с большим.

7. Результат работы NOT IN и NOT EXISTS различен, если в данных присутствует NULL.

8. Результат работы NOT IN и NOT EXISTS одинаковый, если в данных нет значений NULL, но производительность работы разная.

27. Теоретико-множественные операции в sql-запросах. Примеры.

Теоретико-множественные операции – объединение (UNION), вычитание (MINUS), пересечение (INTERSECT).

Операция UNION (аналог Full outer join)

Возвращает результат объединения двух запросов, исключая дубликаты.

SELECT Dep_id

FROM Dep

UNION

SELECT Dep_id

FROM Emp

Операция INTERSECT (аналог inner join)

Возвращает строки, которые присутствуют в обоих запросах.

SELECT Dep_id

FROM Dep

WHERE Dep_id <>3

INTERSECT

SELECT Dep_id

FROM Emp

Операция MINUS

Возвращает строки первого запроса, которые отсутствуют во втором

SELECT Dep_id

FROM Dep

MINUS

SELECT Dep_id

FROM Emp

WHERE Dep_id NOT IN(1,2)