Пълен курс по MySQL за ученици от 11. клас
Преди да говорим за правилните връзки, нека видим какво става, когато сгрешим. Ако свържем две таблици без условие (WHERE/ON), се получава Декартово произведение (Cartesian Product).
| Color |
|---|
| 🔴 Red |
| 🔵 Blue |
| Size |
|---|
| S |
| M |
| L |
| Color | Size |
|---|---|
| 🔴 Red | S |
| 🔴 Red | M |
| 🔴 Red | L |
| 🔵 Blue | S |
| 🔵 Blue | M |
| 🔵 Blue | L |
Ако Таблица А има 10 реда, а Таблица Б има 5 реда, колко реда ще върне декартовото произведение?
Връща само редовете, които имат съвпадение и в двете таблици. Това е "сечението" на двете множества. Служителите без отдел и отделите без служители се игнорират.
| ID | Name | Dept_ID |
|---|---|---|
| 1 | Ivan | 10 |
| 2 | Maria | 20 |
| 3 | Peter | NULL |
| ID | Dept_Name |
|---|---|
| 10 | Sales |
| 20 | HR |
| 30 | IT |
| Name | Dept_Name |
|---|---|
| Ivan | Sales |
| Maria | HR |
Имате таблица Students (id, name, city_id) и Cities (id, name). Напишете заявка, която показва името на студента и града му, но само за студенти, които са въвели валиден град.
Тези връзки позволяват да запазим данните от едната таблица, дори да няма съвпадение в другата.
Взима ВСИЧКО от лявата таблица (Employees). Ако няма отдел, пише NULL.
| Name | Dept_ID | Dept_Name |
|---|---|---|
| Ivan | 10 | Sales |
| Maria | 20 | HR |
| Peter | NULL | NULL |
*Забележете: Peter присъства, въпреки че няма отдел.
Взима ВСИЧКО от дясната таблица (Departments). Ако отделът няма служители, името на служителя е NULL.
| Name | Dept_Name |
|---|---|
| Ivan | Sales |
| Maria | HR |
| NULL | IT |
*Забележете: IT отделът присъства, въпреки че няма служители.
Коя заявка ще използвате, за да намерите всички клиенти, които НИКОГА не са правили поръчка?
Комбинация от LEFT и RIGHT. Връща всичко от двете таблици. Ако няма съвпадение - NULL.
| Name | Dept_Name |
|---|---|
| Ivan | Sales |
| Maria | HR |
| Peter | NULL |
| NULL | IT |
Напишете заявка, която показва всички възможни двойки "Служител - Проект" (всеки служител да участва във всеки проект), за да планираме график.
Трябва да използваме CROSS JOIN (Декартово произведение), защото искаме всички комбинации.