Princip
O vnitřním spojení tabulek jsme si zatím uvedli pouze jakousi definici, která říká, že vnitřní spojení vrací pouze takové řádky obou tabulek, u nichž jsou hodnoty obou propojovaných sloupců shodné. A teď trošku lidsky! 🙂
Já o vnitřním spojování tabulek, tedy o INNER JOIN často říkávám, že jsou jen pro zamilované páry ♥. Jak to chápat? Pojďme si předvést malou ukázku…
Mějme dvě databázové tabulky: zakaznik a objednavka. Budeme chtít vypsat všechny záznamy z obou tabulek, tedy jinými slovy, všechny zákazníky a jejich objednávky.
A nyní se podívejme, jak by mohla vypadat data jednotlivých tabulek. Třeba takto…
id | jmeno | prijmeni | |
1 | Jan | Novotný | jan.novotny@email.cz |
2 | Petr | Starý | petr.stary@email.cz |
3 | Monika | Bláhová | monika.blahova@email.cz |
4 | Eduard | Kameník | eduard.kamenik@email.cz |
5 | Martin | Bláha | martin.blaha@email.cz |
id | cislo | zakaznik_id |
1 | 97598852 | 1 |
2 | 98528566 | 4 |
3 | 92842565 | 1 |
4 | 95268521 | 5 |
5 | 96684664 | 4 |
Když se dobře podíváme na obě tabulky a jejich data, zjistíme, že někteří zákazníci mají více objednávek, jsou to pan Novotný a Kameník. Na druhou stranu jsou mezi zákazníky i takoví, kteří nemají vůbec žádnou objednávku, pan Starý a paní Bláhová.
Teď to pojmenujeme trošku databázověji… entita zakaznik obsahuje instance s ID 2 a 3, které nemají navázán vztah s žádnou instancí entity objednavka. Prostě nemají objednávku! 🙂
Nyní se vraťme k tomu, co jsem uvedl na začátku… INNER JOIN je jen pro zamilované páry. Jinými slovy, vnitřní spojení nám vrátí jen takové záznamy z obou spojovaných tabulek, které jsou spárovány se záznamy z druhé tabulky. Na základě dat z tabulek můžeme odvodit, že ve výpisu nebude pan Starý ani paní Bláhová, protože nemají vztah s žádným záznamem z tabulky objednavka. Výpis dat pomocí příkazu SELECT by pak vypadal následovně:
id | jmeno | prijmeni | id | cislo | zakaznik_id | |
1 | Jan | Novotný | jan.novotny@email.cz | 1 | 97598852 | 1 |
1 | Jan | Novotný | jan.novotny@email.cz | 3 | 92842565 | 1 |
4 | Eduard | Kameník | eduard.kamenik@email.cz | 2 | 98528566 | 4 |
4 | Eduard | Kameník | eduard.kamenik@email.cz | 5 | 96684664 | 4 |
5 | Martin | Bláha | martin.blaha@email.cz | 4 | 95268521 | 5 |
Vidíme, že výsledný výpis obsahuje data z obou spojených tabulek. Aby bylo jasnější, která data jsou ze které tabulky, záhlaví sloupců jsou obarvena. Zelená záhlaví označují sloupce z tabulky zakaznik, zatímco modrá záhlaví sloupce z tabulky objednavka. Data z obou tabulek, která mají spolu navázán vztah, vidíme v jediné tabulce… a to je joinování typu INNER JOIN.