Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Для Белаш / Лекции / 5 - Языки манипулирования реляционными данными.doc
Скачиваний:
0
Добавлен:
07.08.2024
Размер:
273.41 Кб
Скачать

Многотабличные запросы-выборки

Большинство запросов формируется для извлечения данных более, чем из одной таблицы. В этом случае участниками запроса являются несколько таблиц.

Способы создания многотабличных запросов:

1). Задание соединения таблиц в предложении where.

  • В предложении FROM перечисляются через запятую таблицы-участницы запроса.

  • В предложении WHERE указывается условие соединения (равенство полей соединяемых таблиц, по которым выполняется соединение).

Пример: В какие пункты были совершены рейсы 16.10.19?

SELECT [Пункт назначения]

FROM Рейс, Вылет

WHERE Рейс.[Номер рейса] = Вылет.[Номер рейса]

AND ([Реальная дата] = #10/16/19#)

Замечания:

1). FROM осуществляет декартово произведение отношений, а WHERE производит выборку из него.

2). Условие Рейс.[Номер рейса] = Вылет.[Номер рейса] ограничивает выборку только теми записями, которые имеют одинаковые значения полей Номер рейса и в таблице Рейс, и в таблице Вылет.

3). Если в запросе используются одноименные поля из разных таблиц, то для уточнения перед именем поля через точку указывается имя таблицы.

4). Результатом запроса является необновляемый набор записей.

2). Задание соединения таблиц в предложении from.

  • Условие соединения и сами таблицы указываются в предложении FROM.

  • Используется ключевое слово JOIN с указанием типа соединения.

SELECT [Пункт назначения]

FROM Рейс INNER JOIN Вылет ON Рейс.[Номер рейса] = Вылет.[Номер рейса]

WHERE ([Реальная дата] = #10/16/19#)

Замечания:

1). Запись Рейс INNER JOIN Вылет ON Рейс.[Номер рейса] = Вылет.[Номер рейса] означает внутреннюю связь таблицы Рейс с таблицей Вылет.

2). Результатом запроса является обновляемый набор записей.

Типы соединений:

INNER JOIN – внутреннее соединение, при котором записи из двух таблиц соединяются и добавляются в результирующий набор только в том случае, если значения в связанных полях равны.

LEFT JOIN – левое внешнее соединение, при котором все записи из таблицы, указанной в левой части предложения LEFT JOIN, включаются в результирующий набор, даже если в таблице, указанной в правой части, нет соответствующих им записей.

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

RIGHT JOIN – правой внешнее соединение аналогично LEFT JOIN, только наоборот.

Замечание:

1). Стандарт ANSI не поддерживает внешнее соединение, но оно поддерживается многими СУБД.

Пример: Вывести информацию о плановых датах вылета всех рейсов с указанием пунктов назначения.

SELECT Рейс.[Номер рейса], [Пункт назначения], [Плановая дата]

FROM Рейс INNER JOIN Вылет ON Рейс.[Номер рейса] = Вылет.[Номер рейса]

Ответ:

Номер рейса

Пункт назначения

Плановая дата

12345

Москва

16.10.19

12345

Москва

17.10.19

12345

Москва

18.10.19

67890

Киев

16.10.19

67890

Киев

18.10.19

77777

Астрахань

16.10.19

77777

Астрахань

17.10.19

89898

Москва

16.10.19

SELECT Рейс.[Номер рейса], [Пункт назначения], [Плановая дата]

FROM Рейс LEFT JOIN Вылет ON Рейс.[Номер рейса] = Вылет.[Номер рейса]

Ответ:

Номер рейса

Пункт назначения

Плановая дата

12345

Москва

16.10.19

12345

Москва

17.10.19

12345

Москва

18.10.19

55555

Владивосток

67890

Киев

16.10.19

67890

Киев

18.10.19

77777

Астрахань

16.10.19

77777

Астрахань

17.10.19

89898

Москва

16.10.19

Для получения такого же результата с помощью RIGHT JOIN надо соединение выполнить следующим образом:

FROM Вылет RIGHT JOIN Рейс ON Рейс.[Номер рейса] = Вылет.[Номер рейса]

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

DISTINCTROW – для сравнения записей применяются все поля исходной таблицы независимо от того, какие из этих полей включены в запрос.

DISTINCT – для сравнения записей используются данные только тех полей, которые включены в запрос.

Пример: В какие города планировались когда-либо рейсы?

SELECT [Пункт назначения]

FROM Рейс INNER JOIN Вылет ON Рейс.[Номер рейса] = Вылет.[Номер рейса]

Ответ:

Пункт назначения

Москва

Москва

Москва

Киев

Киев

Астрахань

Астрахань

Москва

Обновляемый набор записей.

SELECT DISTINCT [Пункт назначения]

FROM Рейс INNER JOIN Вылет ON Рейс.[Номер рейса] = Вылет.[Номер рейса]

Ответ:

Пункт назначения

Астрахань

Киев

Москва

Необновляемый набор записей

Для сравнения использовались данные только тех полей, которые включены в запрос.

SELECT DISTINCTROW [Пункт назначения]

FROM Рейс INNER JOIN Вылет ON Рейс.[Номер рейса] = Вылет.[Номер рейса]

Ответ:

Пункт назначения

Москва

Киев

Астрахань

Москва

Обновляемый набор записей.

 Для сравнения использовались все поля исходных таблиц, независимо от того, какие из этих полей включены в запрос.

Запрос может быть построен и более чем на двух таблицах.

Пример: Вывести список пассажиров, улетевших в Москву 16.10.19 или 17.10.19.

SELECT [Паспортные данные]

FROM (Рейс INNER JOIN Вылет ON Рейс.[Номер рейса] = Вылет.[Номер рейса])

INNER JOIN Пассажир ON (Вылет.[Номер рейса] = Пассажир.[Номер рейса])

AND (Вылет.[Плановая дата] = Пассажир.[Дата вылета])

WHERE [Пункт назначения] = ‘Москва’

AND ([Реальная дата] = #10/16/19# OR Реальная дата] = #10/17/19#)