Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
БД SQL(засоби ман_пулювання даними.Трив_альн_ запити).docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
62 Кб
Скачать
☆

7.2. Запити, що використовують з'єднання

Декартів добуток таблиць

З'єднання - це підмножини декартова добутку. Тому що декартів добуток n таблиць - це таблиця, що містить усі можливі рядки r, такі, що r є зчепленням якого-небудь рядка з першої таблиці, рядка з другої таблиці, ... і рядка з n-й таблиці (а ми вже навчилися виділяти за допомогою SELECT будь-яка підмножина реляційної таблиці), те залишилося лише з'ясувати, чи можна за допомогою SELECT одержати декартів добуток. Для одержання декартова добутку кількох таблиць треба указати у фразі FROM перелік таблиць, що перемножуються, а у фразі SELECT v усі їхні стовпці.

Так, для одержання декартова добутку Вид_блюд і Трапези треба видати запит

SELECT  Вигляд_блюд.*, Трапези.*

FROM    Вигляд_блюд, Трапези;

Еквіз'єднання таблиць

Якщо з декартова добутку забрати непотрібні рядки і стовпці, то можна одержати актуальні таблиці, що відповідають кожному з з'єднань.

Очевидно, що добір актуальних рядків забезпечується введенням у запит WHERE фрази, у якій установлюється відповідність між:

  • кодами трапез (Т) у таблицях Меню і Трапези (Меню.Т = Трапези.Т),

  • кодами видів блюд (У) у таблицях Меню і Вид_блюд (Меню.У = Вид_блюд.В),

  • номерами блюд (БЛ) у таблицях Меню і Блюда (Меню.БЛ = Блюда.БЛ).

Такий скоректований запит буде мати вид:

SELECT  Меню.*, Трапези.*, Вид_блюд.*, Блюда.*

FROM    Меню, Трапези, Вид_блюд, Блюда

WHERE   Меню.Т = Трапези.Т

AND     Меню.У = Вид_блюд.В

AND     Меню.БЛ = Блюда.БЛ;

Природне з'єднання таблиць

У эквисоединение таблиць увійдуть дублікати стовпців, по яких проводилося з'єднання (Т, В и БЛ). Для виключення цих дублікатів можна створити природне з'єднання тих же таблиць:

SELECT  Т, У, БЛ, Трапеза, Вид, Блюдо, Основа, Вихід, Праця

FROM    Меню, Трапези, Вид_блюд, Блюда

WHERE   Меню.Т = Трапези.Т

AND     Меню.У = Вид_блюд.В

AND     Меню.БЛ = Блюда.БЛ;

 Композиція таблиць

Для виключення всіх стовпців, по яких проводиться з'єднання таблиць, треба створити композицію

SELECT  Трапеза, Вид, Блюдо, Основа, Вихід, Праця

FROM    Меню, Трапези, Вид_блюд, Блюда

WHERE   Меню.Т = Трапези.Т

AND     Меню.У = Вид_блюд.В

AND     Меню.БЛ = Блюда.БЛ;

 

 З'єднання таблиць з додатковою умовою

При формуванні з'єднання створюється робоча таблиця, до якої застосовні всі розглянуті операції: добір потрібних рядків з'єднання (WHERE фраза), упорядкування одержуваного результату (ORDER BY фраза) і агрегатування даних (SQL-функції і GROUP BY фраза).

Наприклад, для одержання переліку блюд, пропонованих у меню на сніданок, можна сформувати запит на основі композиції:

SELECT  Вид, Блюдо, Основа, Вихід, 'Номер -', БЛ

FROM    Меню, Трапези, Вид_блюд, Блюда

WHERE   Меню.Т = Трапези.Т

AND     Меню.У = Вид_блюд.В

AND     Меню.БЛ = Блюда.БЛ

AND     Трапеза = 'Сніданок';

 

З'єднання таблиці зі своєю копією. Використання імен кореляції (аліасів, псевдонімів)

У ряді додатків виникає необхідність одночасної обробки даних якої-небудь таблиці й однієї чи кількох її копій, створюваних на час виконання запиту.

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

Тимчасову копію таблиці можна сформувати, вказавши ім'я псевдоніма за ім'ям таблиці у фразі FROM. Так, за допомогою фрази

FROM Блюда X, Блюда Y, Блюда Z

будуть сформовані три копії таблиці Блюда з іменами X, Y і Z.

Тобто. доводиться виконувати запити, у яких таблиця з'єднується сама із собою, чи одна таблиця з'єднується двічі з іншою таблицею. При цьому використовуються імена кореляції (аліаси, псевдоніми), що дозволяють розрізняти копії таблиць, що з'єднуються. Імена кореляції вводяться в розділі FROM і йдуть через пробіл після імені таблиці. Імена кореляції повинні використовуватися як префікс перед іменем стовпця і відокремлюються від імені стовпця крапкою. Якщо в запиті вказуються ті самі поля з різних екземплярів однієї таблиці, вони повинні бути перейменовані для усунення неоднозначності в іменуваннях стовпчиків результуючої таблиці. Визначення імені кореляції діє тільки під час виконання запиту.

Як приклад з'єднання таблиці з нею самої сформуємо запит на вивід таких пар блюд таблиці Блюда, у яких збігається основа, а назва першого блюда пари менше (за алфавітом), чим номер другого блюда пари. Для цього можна створити запит з однією копією таблиці Блюда (Копія):

SELECT  Блюдо, Копія.Блюдо, Основа

FROM    Блюда, Блюда Копія

WHERE   Основа = Копія.Основа

AND     Блюдо < Копія.Блюдо;

чи двома її копіями (Перша і Друга):

SELECT  Перша.Блюдо, Друга.Блюдо, Основа

FROM    Блюда Перша, Блюда Друга

WHERE   Перша.Основа = Друга.Основа

AND     Перша.Блюдо < Друга.Блюдо;

 Приклад. Відібрати усі пари постачальників таким чином, щоб перший постачальник у парі мав статус, більша статусу другого постачальника:

SELECT

    P1.PNAME AS PNAME1,

    P1.PSTATUS AS PSTATUS1,

    P2.PNAME AS PNAME2,

    P2.PSTATUS AS PSTATUS2

  FROM

    P P1, P P2

  WHERE P1.PSTATUS1 > P2.PSTATUS2;

В результаті одержимо наступну таблицю:

PNAME1

PSTATUS1

PNAME2

PSTATUS2

Іванов

4

Петров

1

Іванов

4

Сидоров

2

Сидорук

2

Петров

1