Эквисоединение и другие виды соединений



Соединение, использующее предикаты, основанные на равенствах, называется эквисоединением.

SELECT sname, cname

FROM Salespeople, Customers

WHERE sname < cname
AND rating < 200;

Команда генерирует все комбинации имен продавцов и покупателей так, что первые предшествуют последним в алфавит­ном порядке, а последние имеют рейтинг меньше чем 200.

Соединение более чем двух таблиц

Можно конструировать запросы путем соединения более чем двух таблиц.
Предположим, нужно найти все заявки покупателей, не находящихся в том же
городе, что и их продавец. Для этого потребуется связать все три рассматривае­мые таблицы:

SELECT onum, cname, Orders.cnum, Orders.snum         

FROM Salespeople, Customers, Orders

WHERE Customers.city <> Salespeople.city

AND Orders.cnum = Customers.cnum AND Orders.snum = Salespeople.snum;

Вложение запросов

 Необходимо извлечь все ее заказы из таблицы Orders.

SELECT *

FROM Orders WHERE snum =

(SELECT snum

FROM Salespeople

WHERE sname = ‘Ivanov’);

В результате выбранной оказывается единственная строка с snum = 1004. Однако вместо простого вывода этого значения SQL подставляет его в предикат основного запроса вместо самого подзапроса, теперь предикат читается следу­ющим образом:

WHERE snum = 1004

Затем основной запрос выполняется как обычный, и его результат точно такой же. Подзапрос должен выбирать один и только один столбец, а тип данных этого столбца должен соответствовать типу значения, указанному в предикате. Часто выбранное поле и это значение имеют одно и то же имя (в данном случае, snum).

DISTINCT с подзапросами

В некоторых случаях можно использовать DISTINCT для гарантии получе­ния единственного значения в результате выполнения подзапроса. Предполо­жим, нужно найти все заказы (orders), с которыми работает продавец, обслуживающий покупателя Levin (cnum = 2001). Вот один из вариантов решения этой задачи:

SELECT *   

FROM Orders

WHERE snum =         

(SELECT DISTINCT snum FROM Orders WHERE cnum = 2001);

Использование агрегатных функций в подзапросах

Например, нужно узнать все заказы, стои­мость которых превышает среднюю стоимость заказов за 4 октября 1990 г.

SELECT *

FROM Orders

 WHERE amt >

SELECT AVG (amt)

FROM Orders
WHERE odate = 10/04/1990);

 

Сгруппированные, то есть примененные с предложением GROUP BY, агрегат­ные функции могут дать в результате множество значений. Поэтому их нельзя применять в подзапросах.

SELECT *

FROM Orders

WHERE snum IN                      

 (SELECT snum FROM Salespeople WHERE city = 'London');

Можно применять IN и в тех ситуациях, когда есть абсолютная уверенность в получении единственного значения в результате выполнения подзапроса.

IN можно также использовать там, где применим реляционный оператор срав­нения. В отличие от реляционных операторов IN не приводит к ошибке выпол­нения команды, когда в результате выполнения подзапроса получается не одно, а несколько значений (выходных данных). В этом есть и плюсы, и минусы. Результаты выполнения подзапроса непосредственно не видны. При абсолютной уверенности в том, что в результате выполнения подзапроса будет получено только одно значение, а в действительности их получается несколько, невозмож­но объяснить разницу в выходных данных, полученных в результате выполнения основного запроса.

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

Использование выражений в подзапросах.В предложении подзапроса SELECT можно использовать выражения, основанные на столбцах, а не сами столбцы. Это можно сделать, применяя операторы отношения или IN. Напри­мер, следующий запрос использует оператор отношения =

SELECT *

FROM Customers

WHERE cnum =

(SELECT snum + 1000
FROM Salespeople
WHERE sname ='Lavrov');

Запрос находит всех покупателей, для которых cnum на 1000 превосходит значение поля snum для Lavrov. В данном случае предполагается, что в столбце snum нет повторяющихся значений, в противном случае результатом выполнения подзапроса может оказаться множество значений.

Подзапросы с НА VING

Подзапросы можно применять также внутри предложения HAVING. В самих таких подзапросах можно использовать их собственные агрегатные функции, если они не дают множества значений, а также GROUP BY или HAVING. Например:


Дата добавления: 2018-05-13; просмотров: 688; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!