Состояние связанных таким образом таблиц называется состоянием ссылочной целостности.

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

Стандартное применение операции соединения состоит в извлечении данных в терминах этой связи.

 

Пример 5.Требуется вывести названия и среднюю цену тех товаров, которых было продано в количестве больше 10. Результат сгруппировать по названию товаров.

 

SELECT Название_товара, AVG(Цена_ед_товара) AS 'Средняя цена'

FROM Товары T JOINПродажи Pr

ON Т. ID_товара = Pr.Товар

WHERE Количество_ед_товара > 10

GROUP BY Название_товара

 

Когда объединение таблиц осуществляется по одноименным столбцам, можно использовать так называемое есте­ственное соединение, задаваемое ключевым словом NATURAL. В этом случае в запросе предложение ON не указывается.

Например, если бы в таблице Товары поле Категория имело имя ID_категории (такое же, как в таблице Категории), то запрос, приведенный в примере 3, можно было бы переписать в виде

 

Пример 6.

SELECTКатегории.Название, Товары.Название

FROM Категории NATURAL JOIN Товары

 

Пример 7.Использование функции округления до трех знаков после запятой, например, для расчета налога

Declare @r float

@r=0.078

SELECTТовар.Название, Продажи.Количество_ед_товара,

Round(Товар.Цена_ед_товара*Продажи.Количество*@r, 3) ASНалог

FROMТовар T INNER JOINПродажи Pr

ONT.ID_Товара= Pr.Товар


Внешние объединения

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

 

Внешние объединения делятся на три типа:

1. левые;

2. правые;

3. пол­ные.

 

Общий синтаксис кода для установления внешнего объединения таблиц:

SELECT <Список выборки>

FROM <Таблица, которую вы хотите сделать левой>

<LEFT | RIGHT [OUTER] JOIN >

<Таблица, которую вы хотите сделать правой>

[ON <Условия соединения> ]

Обратите внимание на то, что слово OUTERявляется необязательным.

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

 

Левое внешнее объединение

Левое внешнее объединение возвращает все записи левой таблицы объеди­нения даже в том случае, если соответствующих записей в правой таблице не существует.

Если условие объединения не выполняется, столбцы правой таблицы заполняются неопределенными значениями null.

Пример левого внешнего объединения:

Пример 8.

SELECTT.Название,Pr.Дата, Pr.Количество_ед_товара

FROMТовары Т LEFT OUTER JOINПродажи Pr

ONТ.ID_товара = Pr.Товар

 

В запросе будет выведен список всех товаров вне зависимости от того, продавался товар или нет.

Пример 9.

Требуется вывести список поставщиков и общее количество поставленных ими товаров в заданный период - с 1.01.11 по 20.04.11

SELECTP.Название AS Фирма,COUNT(Поставки.Поставщик)*SUM(Поставки.Количество_ед_товара)

AS‘Общееколичество поставленных товаров’

FROMПоставщики PLEFT JOINПоставки Post

ONP.ID_поставщика = Post.Поставщик

WHEREPost.Дата BETWEEN‘1.01.11’ AND ‘20.04.11’

GROUP BY P.Название_фирмы

Правое внешнее объединение

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

Если условие объединения не выполняется, столбцы левой таблицы заполняются неопределенными значениями null.

Пример правого внешнего объединения в стандарте ANSI:

Пример 10.

Требуется вывести список всех поставщиков и, если имеются, их телефоны.

SELECTP.Название_фирмы,Телефон

FROMТелефоны Tel RIGHT JOINПоставщики P

ONP.ID_поставщика = Tel.Фирма_поставщик

 

Если в приведенном запросе в условиях объединения поменять местами таблицы, получим список всех имеющихся в таблице телефонов с указанием тех поставщиков, у которых он имеется. Оставшиеся записи будут заполнены неопределенными значениями null.

Команда UNION

Команда union связывает воедино данные, полученные от нескольких команд select, то есть она позволяет связать данные из двух и бо­лее итоговых наборов в один.

Команда unionимеет следующий синтаксис:

 

Команда SELECT 1

UNION [ALL]

Команда SELECT 2

 

Однако применение этой команды возможно при некоторых условиях:

1. все списки выборки в union должны содержать одинаковое число столбцов;

2. соответствующие столбцы должны принадлежать к одному типу данных (или преобразовываться к нему, явно или неявно), иначе SQL Server выдаст сообщение об ошибке. Неявные преобразования типов подчиняются правилам приоритетов.

Первая команда select в конструкции union опреде­ляет заголовки столбцов результата.

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

 

Пример 11.Пусть имеется небольшая фирма. В отделе кадров хранится краткая информация о работниках фирмы (Фамилия, год рождения, телефон) в трех таблицах:

«Программисты»,

«Бухгалтера»,

«Финансовые аналитики».

 

Программисты

Фамилия Год рождения Телефон
Лепёшкин
Бубликов

Бухгалтера

Фамилия Год рождения Телефон
Кукушкина
Орлова
Голицын

Финансовые аналитики

Фамилия Год рождения Телефон
Никитин
Самородов
Жженых

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

SELECT Фамилия, [Год рождения] FROM Программисты

UNION ALL

SELECT Фамилия, [Год рождения] FROM Бухгалтера

UNION ALL

SELECT Фамилия, [Год рождения] FROM [Финансовые аналитики]

Данный запрос вернёт результат