Tabulky
Tabulka names:
id | name |
1 | Larry Page |
2 | Sergey Brin |
3 | Elon Musk |
4 | Bill Gates |
6 | Michael Dell |
7 | Mark Zuckerberg |
8 | Jerry Yang |
Tabulka companies:
company_id | company |
1 | |
3 | SpaceX |
4 | Microsoft |
5 | Apple |
7 |
INNER JOIN vs OUTER JOIN
Princip dotazů INNER JOIN (vnitřní) a OUTER JOIN (vnější) je stejný. Liší se v tom, co se stane, když položka, na kterou se vazba odkazuje, neexistuje.
INNER JOIN (průnik množin)
Nejjednodušší typ spojení tabulek.
Vrací záznamy z levé tabulky které mají odpovídající
záznam v pravé tabulce.
SELECT * FROM names INNER JOIN companies ON names.id = companies.company_id
Výsledkem je průnik množin.
V = names ∩ companies
Vrácené záznamy:
id | name | company_id | company |
---|---|---|---|
1 | Larry Page | 1 | |
3 | Elon Musk | 3 | SpaceX |
4 | Bill Gates | 4 | Microsoft |
7 | Mark Zuckerberg | 7 |
Příklad použití:
Potřebujeme vypsat ta jména (z jedné tabulky)
která obsahují informaci o názvu společnosti (v druhé tabulce). Jména bez společnosti jsou vynechána.
LEFT JOIN
Nejpoužívanější typ spojení tabulek.
Vrací všechny záznamy z levé tabulky. K nim připojí odpovídající
záznamy z pravé tabulky.
SELECT * FROM names LEFT JOIN companies ON names.id = companies.company_id
Vrácené záznamy:
id | name | company_id | company |
---|---|---|---|
1 | Larry Page | 1 | |
2 | Sergey Brin | null | null |
3 | Elon Musk | 3 | SpaceX |
4 | Bill Gates | 4 | Microsoft |
6 | Michael Dell | null | null |
7 | Mark Zuckerberg | 7 | |
8 | Jerry Yang | null | null |
Příklad použití:
Potřebujeme
vypsat všechna jména (z jedné tabulky) a k nim přiřadit informaci o názvu společnosti, pokud je dostupná (v druhé tabulce).
RIGHT JOIN
Opak spojení LEFT JOIN.
Vrací všechny záznamy z pravé tabulky a připojí k nim odpovídající
záznamy z levé tabulky, pokud existují.
SELECT * FROM names RIGHT JOIN companies ON names.id = companies.company_id
Vrácené záznamy:
id | name | company_id | company |
---|---|---|---|
1 | Larry Page | 1 | |
3 | Elon Musk | 3 | SpaceX |
4 | Bill Gates | 4 | Microsoft |
null | null | 5 | Apple |
7 | Mark Zuckerberg | 7 |
OUTER JOIN (sjednocení množin)
Nazýváno též FULL OUTER JOIN, FULL JOIN.
Vrací všechny záznamy z obou tabulek. Záznamy které odpovídají spojí.
SELECT * FROM names FULL OUTER JOIN companies ON names.id = companies.company_id
V MySQL není FULL OUTER JOIN přímo k dispozici, ale můžeme jej simulovat pomocí UNION:
SELECT * FROM names LEFT OUTER JOIN companies ON names.id = companies.company_id UNION SELECT * FROM names RIGHT OUTER JOIN companies ON names.id = companies.company_id
Výsledkem je sjednocení množin.
V = names ∪ companies
Vrácené záznamy:
id | name | company_id | company |
---|---|---|---|
1 | Larry Page | 1 | |
3 | Elon Musk | 3 | SpaceX |
4 | Bill Gates | 4 | Microsoft |
7 | Mark Zuckerberg | 7 | |
2 | Sergey Brin | null | null |
6 | Michael Dell | null | null |
8 | Jerry Yang | null | null |
null | null | 5 | Apple |
Další typy spojení tabulek
Left Excluding JOIN (rozdíl množin)
Vrací ty záznamy z levé tabulky které nemají odpovídající záznam v pravé tabulce.
SELECT * FROM names LEFT JOIN companies ON names.id = companies.company_id WHERE companies.company_id IS NULL
Výsledkem je rozdíl množin.
C = names - companies
Vrácené záznamy:
id | name | company_id | company |
---|---|---|---|
2 | Sergey Brin | null | null |
6 | Michael Dell | null | null |
8 | Jerry Yang | null | null |
Right Excluding JOIN (rozdíl množin)
Opak Left Excluding JOIN.
Vrací záznamy z pravé tabulky které nemají odpovídající záznam v levé tabulce.
SELECT * FROM names RIGHT JOIN companies ON names.id = companies.company_id WHERE names.id IS NULL
Výsledkem je rozdíl množin.
C = companies - names
Vrácené záznamy:
id | name | company_id | company |
---|---|---|---|
null | null | 5 | Apple |
Outer Excluding JOIN
Není v MySQL.
Vrací záznamy z levé tabulky které nemají odpovídající záznam v pravé tabulce a
zároveň záznamy z pravé tabulky které nemají odpovídající
záznam v levé tabulce.
SELECT * FROM names FULL OUTER JOIN companies ON names.id = companies.company_id WHERE names.id IS NULL OR companies.company_id IS NULL
Výsledkem je symetrický rozdíl (tzv. symetrická diference).
V = names ÷ companies
Vrácené záznamy:
id | name | company_id | company |
---|---|---|---|
2 | Sergey Brin | null | null |
6 | Michael Dell | null | null |
8 | Jerry Yang | null | null |
null | null | 5 | Apple |