У запиті можна об'єднати дані двох чи більше таблиць. Нехай, наприклад, треба одержати список співробітників усіх виробничих підрозділів. У таблиці Pers маємо список співробітників із вказівкою в поле Depпідрозділів, у яких вони працюють. А в таблиці Dep ми маємо список усіх підрозділів у поле Dep і характеристику кожного підрозділу в поле Prosv (де, нагадаємо, «в», якщо підрозділ виробничий, і «у», якщо він належить до управління). Тоді одержати список співробітників усіх виробничих підрозділів можна оператором:
SELECT Pers. * FROM Pers, Dep
WHERE (Pers.Dep=Dep.Dep)AND(Dep.Proisv='в')
Він звертається відразу до двох таблиць Pers і Dep, що перераховані після ключового слова FROM.Тому кожне ім'я поля випереджається посиланням на таблицю, до якої воно відноситься. Утім, це треба робити тільки для полів, ім'я яких повторюється в різних таблицях (поле Dep).Перед полем Proisvпосилання на таблицю можна опустити. У конструкції WHERE умова Pers. Dep=Dep. Depшукає запис у таблиці Dep, у якій поле Dep збігається з полем Depпоточної запису таблиці Pers. A умова Dep.Proisv='в'відбирає ті записи, у яких у таблиці Dep знайденому підрозділу відповідає поле Proisv = 'в'.
Із застосуванням псевдонімів, наведений вище оператор може бути переписаний у такий спосіб:
SELECT P.* FROM Pers Р, Dep D
WHERE (P . Dep=D . Dep) AND ( D . Proisv= ' в ' )
У цьому прикладі таблиці Pers даний псевдонім Р, а таблиці Dep — D.
Можливе самооб'єднання таблиць. У цьому випадку одній таблиці надаються два псевдоніми. Нехай, наприклад, потрібно знайти всіх ровесників в організації. Це можна зробити оператором
SELECT ibl.fam, ib2.fam, ibl.year_b FROM Pers ib1, Pers ib2 WHERE (ibl.year_b = ib2.year_b) AND (ibl.fam! = ib2. f am)
У цьому прикладі для таблиці Pers введено два псевдоніми: ib1 і ib2. У конструкції WHERE ведеться пошук в цих нібито різних таблицях запису з однаковим роком народження. Друга умова ib1.fam != ib2.famпотрібна, щоб співробітник не відображався в результатах як ровесник сам собі. Правда, наведений оператор видає в результаті по два записи на кожну пару ровесників, спочатку, наприклад, «Миколаїв — Андрєєв», а потім «Андрєєв — Миколаїв». Щоб виключити таке дублювання можна додати ще одну умову — ib1.Fam < ib2.Fam:
SELECT ibl.fam, ib2.fam, ibl.year_b FROM Pers ib1, Pers ib2
WHERE (ibl.year_b= ib2. year_b) AND (ibl.fam!= ib2.fam) AND (ibl.Fam<ib2.Fam)
Додаткова умова упорядковує появу прізвищ у ib1 і ib2 і виключає дублювання результатів.
Дотепер ми розглядали об'єднання, засновані на однозначній відповідності записів двох таблиць: коли кожному запису в першій таблиці знаходився відповідний запис у другій таблиці. Можливі й інші види об'єднань, що видають запис незалежно від того, чи є відповідне поле в другій таблиці. Це зовнішні об'єднання (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
Поля таблиці Chef
Іванов
……………
Петров
……………
Петров
……………..
Оператор задав ліве об'єднання таблиці Pers (вона зазначена після ключового слова FROM) з таблицею Chef (вона зазначена після ключових слів LEFT OUTER JOIN). Умова об'єднання зазначена після ключового слова ON і полягає в збігу прізвищ.
Як показано, результат включає всі поля і таблиці Pers, і таблиці Chef. Число рядків відповідає числу записів таблиці Pers. У рядках, що стосуються записів, для яких у Chef не знайшлись відповідні, поля таблиці Chef залишаються порожніми.
Оператор правого об'єднання
SELECT * FROM Pers RIGHT OUTER JOIN Chef ON Pers.Fam = Chef.Fam
видасть результат виду:
Поля таблиці Pers
Поля таблиці Chef
Петров
……………
Петров
……………..
Сидоров
…………….....
Число рядків відповідає числу записів таблиці Chef. У рядках, що стосуються записів, для яких у Pers не знайшлася відповідність, поля таблиці Pers залишаються порожніми.
Оператор повного об'єднання
SELECT * FROM Pers FULL OUTER JOIN Chef ON Pers.Fam = Chef.Fam
видасть результат виду:
Поля таблиці Pers
Поля таблиці Chef
Іванов
……………
Петров
……………
Петров
……………..
Сидоров
……………..
У ньому до рядків, що належать до таблиці Pers, додані рядки, що належать до таблиці Chef, для яких не знайшлося відповідних в таблиці Pers.