Вище нами розглянуті запити, які використали як джерело даних тільки одну таблицю даних - так звані однотабличні запити. Однак часто виникає необхідність у виборі інформації з декількох таблиць - одним з варіантів здійснення такої вибірки є об'єднання результатів декількох запитів, що виконуються незалежно друг від друга.
Для розміщення декількох запитів разом й об'єднання їхнього висновку використають команду UNION. Команда UNION поєднує висновок двох або більше SQL запитів у єдиний набір рядків і стовпців. Наприклад, для одержання списку всіх студентів і викладачів, прізвища яких розташовані між літерами 'К' й 'З, можна скористатися запитом:
Позднякова Любов Олексіївна Котенко Анатолій Миколайович
Нагорний Євген Васильович Поляков Анатолій Олексійович
Звідси можна зробити висновок, що записи, обрані двома командами, виведені так, ніби вона була одна. Природно, що заголовки стовпців виключені, тому що жоден стовпців, виведених об'єднанням, не був витягнутий безпосередньо з тільки однієї таблиці, отже, всі ці стовпці висновку не мають ніяких імен. Зверніть увагу на те, тільки останній запит закінчується крапкою з коми - відсутність крапки з коми дає зрозуміти SQL, що є ще один або більше запитів.
Коли два або більше запити піддаються об'єднанню, їхні стовпці висновку повинні бути сумісні для об'єднання, що нами вже розглядалося вище. Нагадаємо, що це означає для кожного запиту необхідність включення однакового числа стовпців у тім же порядку, що й перший, другий, третій, і т.д., і при цьому повинна бути присутнім сумісність типів. Наприклад, символьні поля повинні мати однакове число символів. Інше обмеження на сумісність - це коли порожні значення NULL заборонені в будь-якому стовпці об'єднання, тоді ці значення необхідно заборонити й дою всіх відповідних стовпців в інших запитах об'єднання. Нарешті, не можна використати агрегатні функції в конструкції SELECT запиту в об'єднанні.
Варто звернути увагу на той факт, що UNION буде автоматично виключати дублікати рядків з виводу. Якщо, наприклад, у таблиці STUDENTS з'явиться ще один студент із прізвищем Поляков, то запит
SELECT SFAM
FROM STUDENTS
дасть наступний висновок:
SFAM
-----------
Поляков
Старова
Гриценко
Котенко
Нагорний
Поляков
Тут є дублювання значень SFAM = Поляков, тому що не зазначено, щоб SQL усунув дублікати. Однак, при використанні UNION у комбінації цього запиту, з йому подібним у таблиці викладачів, надлишкова інформація буде усунута.
SELECT SPAM
FROM STUDENTS
UNION
SELECT TFAM
FROM TEACHERS;
дає наступні результати без дублювання прізвища Поляков:
------------
Поляков
Старова
Гриценко
Котенко
Нагорний
Викулина
Костыркин
Казанко
Позднякова
Загарийчук
Іноді виникає необхідність вставляти константи й вирази в конструкції SELECT, використовувані з UNION, що є корисною можливістю. Очевидно, що використовувані константи й вирази повинні зустрічати сумісні типи даних. Це властивість корисно, наприклад, щоб відобразити коментарі, що вказують на те, який запит вивів даний рядок. Модифікуємо попередній запит у такий спосіб:
SELECT 'Студент ' SFAM
FROM STUDENTS
UNION
SELECT 'Викладач ' TFAM
FROM TEACHERS;
результат цього запиту наступний:
------------------------------------------------
Студент Поляков
Студент Старова
Студент Гриценко
Студент Котенко
Студент Нагорний
Викладач Викулина
Викладач Костыркин
Викладач Казанко
Викладач Позднякова
Викладач Загарийчук
Зверніть увагу на те, що виникла необхідність у додаванні додаткових пробілів у рядок 'Студент', щоб зробити її співпадаючої по довжині з рядком 'Викладач'.
Тепер необхідно обмовити те, що дані численних запитів будуть виводитися в якомусь особливому порядку. Для цього можна використати команду ORDER BY, щоб упорядкувати результат з об'єднання, аналогічно тому, як це робиться в однотабличних запитах. Наприклад, переглянемо останній запит у зв'язку з тим, щоб упорядкувати прізвища:
Допускається впорядковувати результат за допомогою декількох полів, одне усередині іншого й указувати фрази ASC або DESC для кожного, точно так само, як це робиться для одиночних запитів. Необхідно помітити, що номер 2 у команді ORDER BY указує, який стовпець із пропозиції SELECT буде впорядкований, тому що стовпці об'єднання - це стовпці висновку, а виходить, вони не мають імен і повинні визначатися по номері.
Крім того, при виконанні об'єднання більш ніж двох запитів, можна використати круглі дужки для того, щоб визначити порядок оцінки. Тобто замість просто запиту
query A UNION query В UNION query З;
можна вказати
(query A UNION query В)UNION query З;
або
query A UNION (query В UNION query З);
Це може принципово вплинути на результати запиту, тому що об'єднання здійснюється спочатку усередині дужок, а потім - зовні. Таким способом, наприклад, запити можуть бути скомбіновані для видалення одних дублікатів і залишення інших.