Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Структурована мова запитів SQL.doc
Скачиваний:
5
Добавлен:
01.07.2025
Размер:
663 Кб
Скачать
☆

Прості запити й правила їхнього виконання

Вище нами розглянуті запити, які використали як джерело даних тільки одну таблицю даних - так звані однотабличні запити. Однак часто виникає необхідність у виборі інформації з декількох таблиць - одним з варіантів здійснення такої вибірки є об'єднання результатів декількох запитів, що виконуються незалежно друг від друга.

Для розміщення декількох запитів разом й об'єднання їхнього висновку використають команду UNION. Команда UNION поєднує висновок двох або більше SQL запитів у єдиний набір рядків і стовпців. Наприклад, для одержання списку всіх студентів і викладачів, прізвища яких розташовані між літерами 'К' й 'З, можна скористатися запитом:

SELECT SFAM, SIMA, SOTCH

FROM STUDENTS

WHERE SFAM BETWEEN 'K' AND 'C'

UNION

SELECT TFAM, TIMA, TOTCH

FROM TEACHERS

WHERE TFAM BETWEEN 'К' AND 'С';

Результати цього запиту показані нижче:

----------------------------------------------------------------------

Казанко Віталій Володимирович

Костыркин Олег Володимирович

Позднякова Любов Олексіївна Котенко Анатолій Миколайович

Нагорний Євген Васильович Поляков Анатолій Олексійович

Звідси можна зробити висновок, що записи, обрані двома командами, виведені так, ніби вона була одна. Природно, що заголовки стовпців виключені, тому що жоден стовпців, виведених об'єднанням, не був витягнутий безпосередньо з тільки однієї таблиці, отже, всі ці стовпці висновку не мають ніяких імен. Зверніть увагу на те, тільки останній запит закінчується крапкою з коми - відсутність крапки з коми дає зрозуміти 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, щоб упорядкувати результат з об'єднання, аналогічно тому, як це робиться в однотабличних запитах. Наприклад, переглянемо останній запит у зв'язку з тим, щоб упорядкувати прізвища:

SELECT 'Студент ' SFAM

FROM STUDENTS

UNION'

SELECT 'Викладач ' TFAM

FROM TEACHERS

ORDER BY 2 ASC;

Вивід цього запиту буде наступний:

-----------------------------------------------------

Викладач Викулина

Студент Гриценко

Викладач Загарийчук

Викладач Казанко

Викладач Костыркин

Студент Котенко

Студент Нагорний

Викладач Позднякова

Студент Поляков

Студент Старова

Допускається впорядковувати результат за допомогою декількох полів, одне усередині іншого й указувати фрази ASC або DESC для кожного, точно так само, як це робиться для одиночних запитів. Необхідно помітити, що номер 2 у команді ORDER BY указує, який стовпець із пропозиції SELECT буде впорядкований, тому що стовпці об'єднання - це стовпці висновку, а виходить, вони не мають імен і повинні визначатися по номері.

Крім того, при виконанні об'єднання більш ніж двох запитів, можна використати круглі дужки для того, щоб визначити порядок оцінки. Тобто замість просто запиту

query A UNION query В UNION query З;

можна вказати

(query A UNION query В)UNION query З;

або

query A UNION (query В UNION query З);

Це може принципово вплинути на результати запиту, тому що об'єднання здійснюється спочатку усередині дужок, а потім - зовні. Таким способом, наприклад, запити можуть бути скомбіновані для видалення одних дублікатів і залишення інших.