Лого на 91. НЕГ „Проф. Константин Гълъбов“

Модул 3 · Урок 23

Връзки между таблиците. Съединения

JOIN заявките: вътрешно съединяване (неявно и явно), съединяване на повече таблици, външно (LEFT/RIGHT OUTER) и рекурсивно (SELF JOIN).

Защо съединяваме таблици

При нормализацията разбихме сложните таблици на по-прости — но така се „разкъсват" връзките между данните. Връзките запазихме в структурата: в едната таблица участва като атрибут стойност на външния ключ на друга. Когато трябва да съберем отново данните, използваме заявки за съединяване — 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: таблица към себе си чрез псевдоним — „пряк началник“.
  • Име на таблица пред атрибута — задължително при едноименни атрибути.