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

Особливості багатотабличних запитів

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

При багатотабличному запиті, таблиці, представлені у вигляді списку в команді FROM, відокремлюються друг від друга комами. Предикат запиту може посилатися до будь-якого стовпця будь-якої зв'язаної таблиці й, отже, може використатися для зв'язку ними. Звичайно предикат порівнює значення в стовпцях різних таблиць, щоб визначити, чи задовольняє WHERE установленій умові. До цього імена таблиць у запитах опускалися, тому запитувалася тільки одна таблиця одночасно. Навіть при запиті з декількох таблиць допускається опускати їхні імена, якщо, звичайно, вони різні. Тепер же виникає необхідність використання імен стовпців і таблиць, оскільки в багатотабличному запиті можуть виникати неоднозначності.

Припустимо необхідно поставити у відповідність викладачеві навчальні предмети, які він веде. Фактично SQL прийде вибирати з таблиці викладачів відповідний йому код й, переглядаючи таблицю предметів, здійснювати пошук відповідного коду. Це можна реалізувати наступним запитом:

SELECT TEACHERS.TFAM, PREDMET.PNAME

FROM TEACHERS, PREDMET

WHERE TEACHERS.TNUM = PREDMET. TNUM;

Результат цього запиту представлений нижче:

TFAM PNAME

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

Викулина Фізика

Костыркин Хімія

Казанко Математика

Позднякова Економіка

Загарийчук Філософія

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

При виконанні багатотабличного запиту, SQL досліджує кожну комбінацію рядків двох або більше можливих таблиць і перевіряє ці комбінації по їхніх предикатах. Якщо комбінація робить таке значення, що робить предикат вірним, то значення буде обрано для висновку.

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

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

SELECT TEACHERS.TFAM, PREDMET.PNAME

FROM TEACHERS, PREDMET

WHERE TEACHERS.TFAM < PREDMET.PNAME

AND TEACHERS.TFAM BETWEEN 'К' AND 'С';

Результат цього запиту такий:

TFAM PNAME

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

Костыркин Фізика

Костыркин Хімія

Костыркин Математика

Костыркин Філософія

Костыркин Економіка

Казанко Фізика

Казанко Хімія

Казанко Математика

Казанко Філософія

Казанко Економіка

Познякова Фізика

Познякова Хімія

Познякова Філософія

Познякова Економіка

У цьому випадку запит навряд чи буде мати практичне значення - з його допомогою виводиться інформація про викладачів, прізвище яких за алфавітом розташоване раніше, ніж найменування навчального предмета з таблиці PREDMET, при цьому вибираються викладачі із прізвищем, що розміщене між літерами К и С.

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

SELECT TEACHERS.TFAM, USP.OCENKA

FROM TEACHERS, PREDMET, USP

WHERE TEACHERS.TNUM = PREDMET.TNUM

AND PREDMET.PNUM = USP.PNUM;

У результаті буде одержано:

TFAM OCENKA

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

Викулина 5

Казанко 4

Казанко 4

Позднякова 3

Загарийчук 5

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