Russian Belarusian English German Japanese Ukrainian

Rashka.studio - игры и приложения для Android! Заходи, ждём тебя =)

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

CuBook05

В запросе можно объединить данные двух или более таблиц. Пусть, например, нужно получить список сотрудников всех производственных подразделений. В таблице Pers есть список сотрудников с указанием в поле Dep подразделений, в которых они работают. А в таблице Dep есть список всех подразделений в поле Dep и характеристику каждого подразделения в поле Prosv (true, если подразделение производственное). Тогда получить список сотрудников всех производственных подразделений можно оператором:
SELECT Pers.* FROM Pers, Dep WHERE (Pers.Dep=Dep.Dep) AND (Dep.Proisv=true)
В нем идет обращение сразу к двум таблицам Pers и Dep, которые перечислены после ключевого слова FROM. Поэтому каждое имя поля предваряется ссылкой на таблицу, к которой оно относится. Впрочем, это надо делать только для полей, имя которых повторяется в разных таблицах (поле Dep). Перед полем Proisv ссылку на таблицу можно опустить. В конструкции WHERE условие Pers.Dep=Dep.Dep ищет запись в таблице Dep, в которой поле Dep совпадает с полем Dep текущей записи таблицы Pers. А условие Dep.Proisv=true отбирает те записи, в которых в таблице Dep найденному подразделению соответствует поле Proisv = true.
 
В операторах, работающих с несколькими таблицами, обычно каждой таблице дается псевдоним, сокращающий ссылки на таблицы, а иногда придающий им некоторый смысл, вытекающий из данного применения. Псевдоним таблицы может записываться в списке таблиц после слова FROM, отделяясь от имени таблицы пробелом. Например, приведенный выше оператор может быть переписан следующим образом:
SELECT P.* FROM Pers Р, Dep D WHERE (P.Dep=D.Dep) AND (D.Proisv=true)
В этом примере таблице Pers дан псевдоним Р, а таблице Dep D. Конечно, эти псевдонимы действуют только в данном операторе и не имеют никакого отношения к псевдонимам баз данных.
 
Возможно самообъединение таблицы. В этом случае одной таблице даются два псевдонима. Пусть, например, нужно найти всех ровесников в организации. Это можно сделать оператором:
SELECT p1.fam, р2.fam, p1.year_b FROM Pers p1, Pers p2 WHERE (p1.year_b = p2.year_b) AND (p1.fam != p2.fam)
В этом примере для таблицы Pers указаны два псевдонима: p1 и р2. В конструкции WHERE идет поиск в этих якобы разных таблицах записи с одинаковым годом рождения. Второе условие p1.fam != p2.fam нужно, чтобы сотрудник не отображался в результатах как ровесник сам себя. Правда, приведенный оператор выдает в результате по две записи на каждую пару ровесников, сначала, например, «Николаев - Андреев», а потом «Андреев - Николаев». Чтобы исключить такое дублирование можно добавить еще одно условие p1.Fam < p2.Fam:
SELECT p1.fam, p2.fam, p1.year_b FROM Pers p1, Pers p2 WHERE (p1.year_b = p2.year_b) AND (p1.fam != p2.fam) and (p1.Fam < p2.Fam)
Дополнительное условие упорядочивает появление фамилий в p1 и p2 и исключает дублирование результатов.
 
Выше рассматривались примеры объединения, основанные на однозначном соответствии записей двух таблиц, когда каждой записи в первой таблице находилась соответствующая ей запись во второй таблице. Возможны и другие виды объединений, которые выдают записи независимо от того, есть ли соответствующее поле во второй таблице. Это внешние объединения (outer join). Их три типа: левое, правое и полное. Левое объединение (обозначается ключевыми словами LEFT OUTER JOIN ... ON) включает в результат все записи первой таблицы, даже те, для которых не имеется соответствия во второй. Правое объединение (обозначается ключевыми словами RIGHT OUTER JOIN ... ON) включает в результат все записи второй таблицы, даже если им нет соответствия в записях первой. Полное объединение (обозначается ключевыми словами FULL OUTER JOIN ... ON) включает в результат объединение записей обеих таблиц, независимо от их соответствия.
 
Пусть, например, есть таблица сотрудников некоей компании Pers и есть таблица Chef, в которой занесены данные на членов совета директоров этой компании. В число членов совета входят и сотрудники компании, и посторонние лица. Для определенности положим, что в таблице Pers имеются записи на сотрудников «Иванов» и «Петров», причем Петров является членом совета, а Иванов нет. В таблице Chef имеются записи на членов совета «Петров» и «Сидоров», причем Сидоров не сотрудник компании. Тогда оператор:
SELECT * FROM Pers LEFT OUTER JOIN Chef ON Pers.Fam = Chef.Fam
Оператор задал левое объединение таблицы Pers (она указана после ключевого слова FROM) с таблицей Chef (она указана после ключевых слов LEFT OUTER JOIN). Условие объединения указано после ключевого слова ON и заключается в совпадении фамилий. Как показано, результат включает все поля и таблицы Pers, и таблицы Chef. Число строк соответствует числу записей таблицы Pers. В строках, относящихся к записям, для которых в Chef не нашлось соответствие, поля таблицы Chef остаются пустые.
 
Оператор правого объединения:
SELECT * FROM Pers RIGHT OUTER JOIN Chef ON Pers.Fam = Chef.Fam
Число строк соответствует числу записей таблицы Chef. В строках, относящихся к записям, для которых в Pers не нашлось соответствие, поля таблицы Pers остаются пустые.
 
Оператор полного объединения:
SELECT * FROM Pers FULL OUTER JOIN Chef ON Pers.Fam = Chef.Fam выдаст результат вида:
В нем к строкам, относящимся к таблице Pers, добавлены строки, относящиеся к таблице Chef, для которых не нашлось соответствия в таблице Pers.
Если заметили ошибку, выделите фрагмент текста и нажмите Ctrl+Enter

Добавить комментарий