- •1. Dмl: команди вибірки даних
- •2. Вибірка без використання фрази where
- •2.1. Проста вибірка
- •2.2. Виключення дублікатів
- •3. Вибірка з використанням фрази where
- •3.1. Використання операторів порівняння
- •3.5. Залучення невизначеного значення (null-значення)
- •3.2. Використання between
- •3.3. Використання in
- •3.4. Використання like
- •4. Вибірка з упорядкуванням
- •5. Запити з обчисленням. Обчислення у межах Select
- •6. Агрегування даних. Використання агрегатних функцій у запитах
- •6.1. Агрегатні sql-функції
- •6.2. Функції без використання фрази group by
- •6.3. Використання агрегатних функцій з угрупованнями. Фраза group by
- •6.4. Використання фрази having
- •7. Dмl: Запити з використанням кількох таблиць
- •7.1. Засоби одночасної роботи з множиною таблиць
- •7.2. Запити, що використовують з'єднання
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 |
