Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
17
Добавлен:
03.06.2015
Размер:
1.17 Mб
Скачать

Управление данными

SQL

Объединение таблиц. Комбинированные запросы.

Зудилин А.Э. 2013

Объединение таблиц

(Join )

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

Распределение данных по многим таблицам обеспечивает их более эффективное хранение, упрощает манипулирование данными и позволяет избежать избыточного дублирования.

Если данные хранятся во многих таблицах, как их можно извлечь с помощью одного оператора SELECT?

- посредством объединения данных

2

Создание объединения

Нужно указать все таблицы, которые должны быть включены в объединение, а также "объяснить" СУБД, как они должны быть соотнесены между собой

Объединение – виртуальная таблица, которая создается только на время выполнения запроса

Общая схема запроса с объединением

SELECT список полей из разных таблиц FROM список таблиц

WHERE условия связи таблиц

3

Пример

SELECT Группа.Название, Студент.Фамилия

FROM Группа, Студент

WHERE Группа.id = Студент.Группа

Оператор SELECT начинается как обычно — с указания столбцов, которые должны быть выбраны.

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

Предложение FROM содержит две таблицы

Таблицы объединяются с помощью предложения WHERE, которое указывает СУБД способ связывания строк Городов и Регионов

Результат запроса:

4

Важность предложения WHERE

Когда вы объединяете две таблицы, то, что вы в действительности делаете, — это создаете пары, состоящие из каждой строки первой таблицы и каждой строки второй таблицы.

Предложение WHERE действует как фильтр, позволяющий включать в результат только такие пары строк, которые соответствуют указанному способу объединения.

Без предложения WHERE каждая строка в первой таблице будет образовывать пару с каждой строкой второй таблицы независимо от того, есть логика в их объединении или нет

5

Декартово произведение таблиц

Результаты, возвращаемые без указания условия объединения – Декартово произведение.

Количество выбранных строк будет равно числу строк в первой таблице, умноженному на число строк во второй таблице.

Иногда объединение, которое возвращает декартово произведение, называют перекрестным объединением.

SELECT Группа.Название, Студент.Фамилия

FROM Группа, Студент

6

Внутренние объединения

Объединение, которое мы до сих пор использовали, называется объединение по эквивалентности — оно основано на проверке эквивалентности полей связи.

Объединение такого типа называют также внутреннее объединение.

Для этих объединений можно использовать несколько иной синтаксис, явно указывающий на тип объединения.

SELECT Группа.Название, Студент.Фамилия

FROM Группа INNER JOIN Студент ON Группа.id=Студент.Группа;

Оператор SELECT здесь точно такой же, как и предыдущий, но предложение FROM другое.

Здесь отношение между двумя таблицами является частью предложения FROM, указанного как INNER JOIN.

Предложение объединения указывается с использованием специального предложения ON вместо предложения WHERE.

7

Тот же результат с использованием подзапроса

Часто существует несколько способов для выполнения одной и той же операции SQL.

SELECT

( SELECT Группа.Название FROM Группа WHERE Группа.id = Студент.Группа

),

Студент.Фамилия FROM Студент;

8

Объединение многих таблиц

SQL не ограничивает число таблиц, которые могут быть объединены посредством оператора SELECT.

Основные правила для создания объединения остаются теми же.

Вначале перечисляются все таблицы, затем определяются отношения между ними.

SELECT Кафедра.Название, Группа.Название, Студент.Фамилия FROM Кафедра, Группа, Студент

WHERE Кафедра.id=Группа.Каф And Группа.id=Студент.Группа;

То же самое с использованием INNER JOIN:

SELECT Кафедра.Название, Группа.Название, Студент.Фамилия FROM (Кафедра INNER JOIN Группа ON Кафедра.id=Группа.Каф)

INNER JOIN Студент ON (Кафедра.id=Студент.id) AND (Группа.id=Студент.Группа);

9

Самообъединения

Предположим, вы хотите послать письма по всем контактным адресам клиентов, которые работают с той же компанией, с которой работает Иванов И.И..

Такой запрос требует, чтобы вначале вы выяснили, с какой компанией работает Иванов И.И., а затем — какие клиенты работают с этой же компанией.

Вот один из способов решения этой задачи.

SELECT cli_id, cli_name, cli_contact

FROM Client

WHERE cli_name = (

SELECT cli_name

FROM Client

)

WHERE cli_contact = 'Иванов И.И.'

10

Соседние файлы в папке Управл_данными