Защо съединяваме таблици
При нормализацията разбихме сложните таблици на по-прости — но така се „разкъсват" връзките между данните. Връзките запазихме в структурата: в едната таблица участва като атрибут стойност на външния ключ на друга. Когато трябва да съберем отново данните, използваме заявки за съединяване — SELECT заявки с клаузи от типа JOIN, чийто източник са две или повече свързани таблици. Резултатът отново е временна таблица.
| Тип съединяване | SQL | Какво влиза в резултата |
|---|---|---|
| Вътрешно | INNER JOIN | само двойките кортежи, за които условието е вярно |
| Външно | LEFT / RIGHT OUTER JOIN | + несъединените кортежи от лявата/дясната таблица (с празни атрибути) |
| Рекурсивно | SELF JOIN | таблицата, съединена със самата себе си |
Вътрешно съединяване
Всеки кортеж на резултата се получава от атрибути на два кортежа на свързаните таблици, за които стойностите на свързващите атрибути отговарят на условието (най-често — да са еднакви). Концептуално: произведение на всички двойки записи + филтър по условието за съединение.
Неявно съединение (през WHERE)
Бележка
SELECT Предмети.Предмет, Предмети.Клас, Учител.[Име на учител], …
FROM Учител, Предмети
WHERE Предмети.[ID Учител] = Учител.ID;
Името на таблицата пред атрибута е задължително само когато в двете таблици има едноименни атрибути.
Явно съединение (JOIN … ON)
SELECT атрибути FROM таблица1 {INNER} JOIN таблица2 ON условие | USING списък_атрибути;
INNER може да се пропусне (подразбира се). USING замества ON, когато свързващите атрибути в двете таблици са с еднакви имена.
Повече от две таблици
Съединяваме верижно: FROM (Ученик INNER JOIN Предмети USING Клас) INNER JOIN Учител ON …. Забележи как един кортеж от таблицата Учител се свързва с няколко кортежа от Предмети — учителят преподава в няколко класа.
Външно съединяване
При ляво външно (LEFT OUTER): ако в лявата таблица има кортежи без съответствие вдясно, те пак влизат в резултата, а атрибутите от дясната таблица остават празни. При дясното — огледално.
Примерът от учебника
Добавяме в Предмети редове за БЕЛ, чиито ID-та на преподаватели ги няма в Учител. LEFT OUTER JOIN (Предмети е лявата) показва И редовете за БЕЛ — с празни име, фамилия и e-mail.
Рекурсивно съединяване (SELF JOIN)
Свързване на данни от една и съща таблица при наличие на рекурсивна връзка между редовете ѝ. Класически пример: прекият началник на всеки служител — атрибутът „Пряк началник" е външен ключ към същата таблица.
Съставянето разглеждаме като свързване на две различни копия на една таблица (второто получава псевдоним) — и внимаваме кой атрибут от кое копие вземаме:
Бележка
SELECT Служители.Длъжност, Служители.Име,
Служители_1.Длъжност AS [Пряк началник]
FROM Служители INNER JOIN Служители AS Служители_1
ON Служители.[Пряк началник] = Служители_1.ID;
Въпроси от учебника
1) Коя релационна операция реализира вътрешното свързване? 2) Какво се получава при ляво външно свързване, ако в лявата таблица има стойност, липсваща в дясната? 3) SQL съдържа и други варианти на JOIN, не всички реализирани в Access — упражнете ги на справочния сайт.
Какво трябва да запомниш
- JOIN събира отново разкъсаното при нормализацията — по външните ключове.
- Вътрешно: само съвпадащите двойки; неявно (WHERE =) или явно (JOIN … ON/USING).
- Външно: LEFT/RIGHT OUTER — несъединените кортежи влизат с празни атрибути.
- SELF JOIN: таблица към себе си чрез псевдоним — „пряк началник“.
- Име на таблица пред атрибута — задължително при едноименни атрибути.