Состояние связанных таким образом таблиц называется состоянием ссылочной целостности.
В данном случае ссылочная целостность этих таблиц подразумевает, что каждому значению поля 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 [Финансовые аналитики]
Данный запрос вернёт результат