- •Теоретичні відомості об'єднання таблиць
- •Імена таблиць і стовпців
- •Створення об'єднання
- •Об'єднання таблиць через довідкову цілісність
- •Об'єднання таблиць по рівності значень у стовпцях і інші види об'єднань
- •Об'єднання більше двох таблиць
- •Як працює підзапит?
- •Значення, які підзапит може виводити
- •Distinct з підзапитами
- •Використання агрегатних функцій в підзапитах
- •Використання підзапитів, які видають багато рядків За допомогою оператора in
- •Підзапити вибирають поодинокі стовпці
- •Використання виразів в підзапитах
- •Підзапити в пропозиції having
- •Варіанти завдань :
Об'єднання таблиць через довідкову цілісність
Ця особливість часто використовується просто для експлуатації зв'язків, вбудованих у БД. У попередньому прикладі ми встановили зв'язок між двома таблицями в об'єднанні. Це прекрасно. Але ці таблиці вже були сполучені через snum -поле. Цей зв'язок називається станом довідкової цілісності. Використовуючи об'єднання, можна витягати дані в термінах цього зв'язку.
Наприклад, щоб показати імена усіх замовників, що відповідають продавцям, які їх обслуговують, ми використовуватимемо такий запит:
SELECT Customers.cname, Salespeople.sname
FROM Customers, Salespeople
WHERE Salespeople.snum = Customers.snum;
Виведення цього запиту показане на Малюнку 8.2.
Це приклад об'єднання, в якому стовпці використовуються для визначення предиката запиту, і в цьому випадку snum -столбцы з обох таблиць видалені з виводу. І це прекрасно. Висновок показує, які замовники яким продавцем обслуговуються; значення поля snum, які встановлюють зв'язок, відсутні. Проте, якщо ви введете їх у вивід, то ви повинні або упевнитися, що вивід зрозумілий сам по собі, або повинні забезпечити коментар даних при виводі.
=============== SQL Execution Log ============
| SELECT Customers.cname, Salespeople.sname, |
| FROM Salespeople, Customers |
| WHERE Salespeople.snum = Customers.snum |
| ============================================= |
| cname sname |
| ------- -------- |
| Hoffman Peel |
| Giovanni Axelrod |
| Liu Serres |
| Grass Serres |
| Clemens Peel |
| Cisneros Rifkin |
| Pereira Motika |
=============================================
Малюнок 8.2 Об'єднання продавців з їх замовникам
Об'єднання таблиць по рівності значень у стовпцях і інші види об'єднань
Об'єднання, які використовують предикати, засновані на рівності, називаються об'єднаннями по рівності. Усі наші приклади в цій главі до теперішнього часу відносилися саме до цієї категорії, тому що усі умови в пропозиціях WHERE базувалися на математичних виразах, що використовують знак рівності (=). Рядки 'city = 'London' і 'Salespeople.snum = Orders.snum ' - приклади таких типів рівності, знайденої в предикатах.
Об'єднання по рівності це, ймовірно, найбільш загальний вигляд об'єднання, але є і інші. Ви можете використовувати практично будь-яку реляційну операцію в об'єднанні. Тут даний приклад іншого виду об'єднання (висновок показаний на Малюнку 8.3) :
SELECT sname, cname
FROM Salespeople, Customers
WHERE sname < cname
AND rating < 200;
=============== SQL Execution Log ============
| SELECT sname, cname |
| FROM Salespeople, Customers |
| WHERE sname < cname |
| AND rating < 200; |
| ============================================= |
| sname cname |
| -------- ------- |
| Peel Pereira |
| Motika Pereira |
| Axelrod Hoffman |
| Axelrod Clemens |
| Axelrod Pereira |
| |
=============================================
Малюнок 8.3 Об'єднання, засноване на нерівності
Ця команда не часто буває корисна. Вона відтворює усі комбінації імені продавця і імені замовника так, що перший передує останньому в алфавітному порядку, а останній має оцінку, менше ніж 200. Зазвичай ви не створюєте складних зв'язків, подібно до цієї, і з цієї причини ви, ймовірно, будуватимете найбільш загальні об'єднання по рівності, але ви повинні добре знати і інші можливості.