Эквисоединение и другие виды соединений
Соединение, использующее предикаты, основанные на равенствах, называется эквисоединением.
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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!