Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛЕКЦИИ УПРАВЛЕНИЕ ДАННЫМИ 2012.doc
Скачиваний:
5
Добавлен:
01.04.2025
Размер:
2.54 Mб
Скачать

4.4. Запросы к нескольким таблицам

Вывести номера и имена продавцов и соответствующих им заказчиков, если они живут в одном городе (запрос приведен на Лист. 24, результат - Табл. 36):

Лист. 24. Запрос на соединение трех таблиц

SELECT DISTINCT Сделки.N_Продавца, Продавцы.Имя, Сделки.N_Покупателя, Покупатели.Имя

FROM Сделки, Продавцы, Покупатели

WHERE Сделки.N_Продавца = Продавцы.N

AND Сделки.N_Покупателя = Покупатели.N

AND Продавцы.Город = Покупатели.Город;

Табл. 36. Результат запроса на соединение трех таблиц

19 Соединение 3х таблиц

N_Продавца

Продавцы.Имя

N_Покупателя

Покупатели.Имя

1

Иванов

2

Андреев

3

Сидоров

3

Сергеев

Вывести номера и имена продавцов и имена соответствующих им начальников (запрос приведен на Лист. 25, результат -Табл. 37):

Лист. 25. Запрос с псевдонимами к таблице с рекурсивной связью

SELECT А.N, A.Имя, B.Имя

FROM Продавцы А, Продавцы B

WHERE A.N_Начальника = B.N;

Табл. 37. Результат запроса с псевдонимами к таблице с рекурсивной связью

20 Псевдонимы по рекурсии

N

А.Имя

B.Имя

1

Иванов

Иванов

2

Петров

Иванов

3

Сидоров

Иванов

4

Шмидт

Петров

5

Зайцев

Петров

Ошибка №8. Необходимость в псевдонимах к одной таблице для начинающих программистов не всегда ясна. Нужно смотреть по тексту задания, в каких смыслах упоминается одна и та же таблица. Так, в этом запросе в явном виде написана таблица продавцы и упоминаются начальники (которые фактически тоже хранятся в таблице продавцы). Таким образом, таблица «Продавцы» должна два раза встретиться в запросе под двумя псевдонимами. Мы фактически создаем две копии одной таблицы и работаем с ними, как будто это разные таблицы.

Вывести имена тех продавцов, которые продавали клиентам Иванова (запрос приведен на Лист. 26, результат - Табл. 38):

Лист. 26. Запрос с псевдонимами к одной таблице

SELECT DISTINCT B.Имя

FROM Продавцы AS А, Продавцы AS B, Сделки AS C, Сделки AS D

WHERE А.Имя='Иванов' And B.Имя<>'Иванов' And А.N=C.N_Продавца And B.N=D.N_Продавца And C.N_Покупателя=D.N_Покупателя;

Табл. 38. Результат запроса с псевдонимами к одной таблице

21 Псевдонимы по одной связи

Имя

Петров

Вывести пары продавцов, у которых были общие клиенты (запрос приведен на Лист. 27, результат - Табл. 39):

Лист. 27. Запрос №2 с псевдонимами к одной таблице

SELECT DISTINCT А.Имя, B.Имя

FROM Продавцы AS А, Продавцы AS B, Сделки AS C, Сделки AS D

WHERE А.Имя<>B.Имя And А.N=C.N_Продавца And B.N=D.N_Продавца And C.N_Покупателя=D.N_Покупателя;

Табл. 39. Результат запроса №2 с псевдонимами к одной таблице

22 Псевдонимы по одной связи 2

А.Имя

B.Имя

Иванов

Петров

Петров

Иванов

Вывести все товары и даты, в которые эти товары продавались; в случае, если товар не продавался ни разу, вывести пустое место (запрос приведен на Лист. 28, результат - Табл. 40).

Лист. 28. Запрос с оператором Left Join

SELECT Товары. Название, Сделки.Дата

FROM Товары LEFT JOIN Сделки

ON Товары.N = Сделки.N_Товара

Табл. 40. Результат запроса с оператором Left Join

23 Left join

Название

Дата

Шило

02.01.2009

Шило

01.01.2009

Мыло

01.01.2009

Мыло

01.01.2009

Мыло

01.01.2009

Яблоко

Вывести все названия товаров с количеством товара на складе больше 15 и их суммарное проданное количество, отсортировав по суммарному проданному количеству место (запрос приведен на Лист. 29, результат - Табл. 1). В этом запросе таблицы соединяются с помощью левого соединения, затем идет фильтрация с помощью where. Дополнительную трудность в понимании создают атрибуты из разных таблиц с одинаковым названием – «количество».

Лист. 29. Запрос с операторами Left Join, Where, Group By, Order By

SELECT Товары.Название, sum(Сделки.Количество) AS суммарное_количество

FROM Товары LEFT JOIN Сделки ON Товары.N=Сделки.N_Товара

GROUP BY Товары.Название

ORDER BY sum(Сделки.Количество);

Табл. 41 Результат запроса с операторами Left Join, Where, Group By, Order By

23A Left join Where Group by Order by

Название

суммарное_количество

Яблоко

Мыло

70

Из запроса виден порядок операторов в языке SQL:

  1. select

  2. from

  3. join

  4. where

  5. group by

  6. having

  7. order by

Аналогично работают другие виды соединений (см. Табл. 42).

Табл. 42. Описание различных видов соединений.

Соединение

Оператор

Описание

Внутреннее

Inner join ... on

Соединяет записи из двух таблиц, если они удовлетворяют условию после on. Аналогично таблицы можно соединять с помощью where

Левое

Left join ... on

Соединяет записи из двух таблиц, если они удовлетворяют условию после on. При этом, если некоторым записям в левой таблице нет соответствия в правой, они выводятся с пустыми значениями справа.

Правое

Right join ... on

Соединяет записи из двух таблиц, если они удовлетворяют условию после on. При этом, если некоторым записям в правой таблице нет соответствия в левой, они выводятся с пустыми значениями слева.

Полное

Full join ... on

Соединяет записи из двух таблиц, если они удовлетворяют условию после on. При этом, если некоторым записям в таблицах нет соответствия в другой таблице, они выводятся с пустыми значениями в соответствующих полях.

Ошибка №9. Тяжело опознать случаи, когда надо выводить все записи из одной таблицы, если остальные условия накладываются на другую таблицу (при этом записям в первой таблице может не быть соответствий во второй). Такие случаи можно увидеть, если в задании встречается слово «все».