Интерактивен урок: Връзки между таблици (JOIN)

Визуализация, примери и задачи за SQL съединения

Пълен курс по MySQL за ученици от 11. клас

1. Въведение и Декартово произведение

Преди да говорим за правилните връзки, нека видим какво става, когато сгрешим. Ако свържем две таблици без условие (WHERE/ON), се получава Декартово произведение (Cartesian Product).

Таблица: Colors
Color
🔴 Red
🔵 Blue
✖️
Таблица: Sizes
Size
S
M
L
➡️
РЕЗУЛТАТ (2 * 3 = 6 реда)
ColorSize
🔴 RedS
🔴 RedM
🔴 RedL
🔵 BlueS
🔵 BlueM
🔵 BlueL
SELECT * FROM Colors, Sizes;

📝 Проверка на знанията

Ако Таблица А има 10 реда, а Таблица Б има 5 реда, колко реда ще върне декартовото произведение?




2. INNER JOIN (Вътрешно съединение)

Връща само редовете, които имат съвпадение и в двете таблици. Това е "сечението" на двете множества. Служителите без отдел и отделите без служители се игнорират.

Employees (Служители)
IDNameDept_ID
1Ivan10
2Maria20
3PeterNULL
*Peter няма отдел
Departments (Отдели)
IDDept_Name
10Sales
20HR
30IT
*В IT отдела няма хора
⬇️ INNER JOIN (Само съвпадащите) ⬇️
РЕЗУЛТАТ
NameDept_Name
IvanSales
MariaHR
SELECT e.Name, d.Dept_Name
FROM Employees e
JOIN Departments d
ON e.Dept_ID = d.ID;

🛠️ Задача

Имате таблица Students (id, name, city_id) и Cities (id, name). Напишете заявка, която показва името на студента и града му, но само за студенти, които са въвели валиден град.

SELECT s.name, c.name
FROM Students s
INNER JOIN Cities c
ON s.city_id = c.id;

3. OUTER JOIN (LEFT и RIGHT)

Тези връзки позволяват да запазим данните от едната таблица, дори да няма съвпадение в другата.

LEFT JOIN (Ляво съединение)

Взима ВСИЧКО от лявата таблица (Employees). Ако няма отдел, пише NULL.

РЕЗУЛТАТ (LEFT JOIN)
NameDept_IDDept_Name
Ivan10Sales
Maria20HR
PeterNULLNULL

*Забележете: Peter присъства, въпреки че няма отдел.

RIGHT JOIN (Дясно съединение)

Взима ВСИЧКО от дясната таблица (Departments). Ако отделът няма служители, името на служителя е NULL.

РЕЗУЛТАТ (RIGHT JOIN)
NameDept_Name
IvanSales
MariaHR
NULLIT

*Забележете: IT отделът присъства, въпреки че няма служители.

📝 Въпрос

Коя заявка ще използвате, за да намерите всички клиенти, които НИКОГА не са правили поръчка?



4. FULL OUTER JOIN & Обобщение

FULL OUTER JOIN

Комбинация от LEFT и RIGHT. Връща всичко от двете таблици. Ако няма съвпадение - NULL.

РЕЗУЛТАТ (FULL JOIN)
NameDept_Name
IvanSales
MariaHR
PeterNULL
NULLIT

🛠️ Задача за шампиони

Напишете заявка, която показва всички възможни двойки "Служител - Проект" (всеки служител да участва във всеки проект), за да планираме график.

Трябва да използваме CROSS JOIN (Декартово произведение), защото искаме всички комбинации.

SELECT e.Name, p.ProjectName
FROM Employees e
CROSS JOIN Projects p;