Управл_данными / 12-join
.pdfСамообъединения
В первом решении используются подзапросы. Внутренний оператор SELECT выполняет простую выборку, чтобы возвратить имя компании (cli_name), с которой работает Иванов И.И..
Теперь рассмотрим тот же самый запрос, в котором используется объединение:
SELECT cl.cli_id, cl.cli_name, cl.cli_contact FROM Client AS cl, Client AS c2
WHERE cl.cli_name = c2.cli_name AND c2.cli_contact = 'Иванов И.И.'
Здесь используются псевдонимы таблиц Две таблицы, необходимые для выполнения запроса, на самом деле
—одна и та же таблица, поэтому таблица Client появляется
впредложении FROM дважды.
11
Пример самообъединения
В БД имеется таблица:
Требуется найти студенток и их мужей
SELECT s1.Фамилия AS Муж_, s2.Фамилия AS Жена_ FROM Студент AS s1, Студент AS s2
WHERE s1.id = s2.Муж
12
Внешние объединения
Большинство объединений связывают строки одной таблицы со строками другой, но в некоторых случаях вам может понадобиться включать в результат строки, не имеющие связанных.
Например, вы можете использовать объединения для решения следующих задач:
-подсчета количества заказов каждого клиента, включая клиентов, которые еще не сделали заказ;
-составления перечня продуктов с указанием количества заказов на них, включая продукты, которые никто из клиентов не захотел заказывать;
-вычисления средних объемов продаж с учетом клиентов, которые еще не сделали заказ.
В каждом из этих случаев объединение должно включать строки, не имеющие ассоциирующихся с ними строк в связанной таблице. Объединение такого типа называется внешним.
13
Левое внешнее объединение
Следующий оператор SELECT позволяет выполнить
простое внутреннее объединение. С его помощью выбирается список всех клиентов и их заказы:
SELECT Client.cli_id, Orders.order_num
FROM Client INNER JOIN Orders
ON Client.cli_id = Orders.cli_id;
Синтаксис внешнего объединения похож на этот. Для выборки имен всех клиентов, включая тех, которые еще не сделали заказов, можно сделать следующее:
|
|
|
cli id |
order num |
|
|
|
|
|||
|
SELECT Client.cli_id, Orders.order_num |
|
|||
|
|
1000000001 |
20005 |
||
|
FROM Client LEFT OUTER JOIN Orders |
|
1000000002 NULL |
||
|
ON Client.cli_id = Orders.cli_id; |
|
1000000003 |
20006 |
|
|
|
|
1000000004 |
20007 |
|
|
|
|
1000000005 |
20008 |
14
Правое внешнее объединение
Правое внешнее объединение аналогично левому и используется в случае, если в правой таблице существуют все записи, а в левой есть пропуски (NULL):
SELECT Orders.order_num, Client.cli_id,
FROM Client RIGHT OUTER JOIN Orders
ON Client.cli_id = Orders.cli_id;
order num cli id 20005 1000000001 NULL 1000000002 20006 1000000003 20007 1000000004 20008 1000000005
15
Использование объединений и условий объединения
1)Будьте внимательны при выборе типа объединения, которое собираетесь использовать.
2)Возможно, что чаще вы будете использовать внутреннее объединение.
3)Посмотрите в документации СУБД, какой именно синтаксис объединений она поддерживает.
4)Проверьте, правильно ли вы указали условие объединения (независимо от используемого синтаксиса), иначе будут возвращены неверные данные.
5)Можно включать в объединение много таблиц и даже применять для каждой из них свой тип объединения
16
Комбинированные запросы (соединения)
В большинстве SQL-запросов используется один оператор SELECT.
SQL позволяет также выполнять множественные запросы за счет многократного использования оператора SELECT и возвращать результаты в виде одного набора результатов запроса.
Эти комбинированные запросы обычно называют
соединениями.
Два основных сценария, для соединений:
1)для возвращения одинаковым образом структурированных данных из различных таблиц посредством одного запроса;
2)для выполнения многократных запросов к одной таблице и возвращения данных в виде результата одного запроса.
17
Комбинированные запросы и многократные условия WHERE
Результат комбинирования двух запросов к одной и той же таблице в основном аналогичен результату, полученному при выполнении одного запроса с несколькими требованиями в предложении WHERE.
Иначе говоря, любой оператор SELECT со многими условиями можно также рассматривать как сложный запрос.
18
Оператор UNION
Запросы в языке SQL комбинируются с помощью оператора UNION.
Оператор UNION позволяет многократно указывать оператор SELECT, и по завершении их работы может быть выведен один набор результатов.
UNION ставится между простыми SELECTзапросами
19
Пример 1
Для возвращения одинаковым образом
структурированных данных из различных таблиц посредством одного
запроса используется комбинированный запрос:
SELECT Name AS n
FROM cities
WHERE Name LIKE 'Т*'
UNION
SELECT Name AS n
FROM Regions
WHERE Name LIKE 'Т*'
20