sql join inner outer cross spojení tabulek
V jazyce SQL je JOIN operace, která spojuje data z různých tabulek. JOIN umožňuje kombinovat řádky z jedné tabulky s řádky z jiné tabulky. Tabulky se spojují přes jeden nebo více společných sloupců.
Z hlediska výkonnosti je ideální, pokud mají tyto sloupce stejný datový typ.
Joiny umožňují efektivnější práci s daty a získávání informací z více tabulek najednou.
Než začnete
Příklady v tomto článku si vyzkoušejte, abyste si použití joinů lépe zapamatovali.
Můžete si buď stáhnout databázi PostgreSQL, která je zdarma:
anebo si vyzkoušet vše online, přímo ve vašem prohlížeči:
Pokud s SQL začínáte, bude se vám hodit kurz SQL pro analytiky, ve kterém po úspěšném absolvování získáte certifikát.
Typy joinů
Zde je přehled všech druhů JOIN příkazů v SQL:
INNER JOIN: vrací pouze řádky, které mají shodu mezi spojovanými tabulkami na základě určitého kritéria. Také je ze všech joinů nejrychlejší.
LEFT (OUTER) JOIN: vrací všechny řádky z levé (první) tabulky a shodující se řádky z pravé (druhé) tabulky. Pokud neexistuje shoda, hodnoty pro pravou tabulku budou NULL.
RIGHT (OUTER) JOIN: vrací všechny řádky z pravé (druhé) tabulky a shodující se řádky z levé (první) tabulky. Pokud neexistuje shoda, hodnoty pro levou tabulku budou NULL.
FULL (OUTER) JOIN: vrací všechny řádky z obou tabulek. Pokud neexistuje shoda, hodnoty pro nepříslušné řádky budou NULL.
CROSS JOIN: vytváří kartézský součin mezi dvěma tabulkami, což znamená všechny kombinace řádků z obou tabulek.
Poznámka: Výraz OUTER
je nepovinný a v SQL ho psát nemusíte.
Vytvoření tabulek
Nejdříve si vytvořte tabulky ZAKAZNICI
a OBJEDNAVKY
a vložte několik řádků s testovacími daty.
Zákazníci
-- Vytvoření tabulky Zákazníci
CREATE TABLE ZAKAZNICI (
ID SERIAL PRIMARY KEY,
jmeno VARCHAR(20),
email VARCHAR(20)
)
;
Objednávky
-- Vytvoření tabulky Objednávky
CREATE TABLE OBJEDNAVKY (
ID SERIAL PRIMARY KEY,
nazev VARCHAR(50),
zakaznik_id INTEGER
)
;
Všimněte si použití datového typu SERIAL
, který v PostgreSQL bude automaticky generovat celá čísla.
Generovaná čísla budou začínat od jedničky (1).
Data
-- Vložení dat do tabulky Zákazníci
INSERT INTO ZAKAZNICI (jmeno, email)
VALUES ('Jan Novák', 'jan@lovelyxyz.cz'),
('Marie Kovářová', 'marie@lovelyabc.com'),
('Petr Svoboda', 'petr@lovelybfml.io')
;
-- Vložení dat do tabulky Objednávky
INSERT INTO OBJEDNAVKY (nazev, zakaznik_id)
VALUES ('Python - základy', 1),
('OK, Python', 1),
('Data Analytics Pass', 2),
('Úvod do řízení projektů', 1),
('SQL pro každý den', 111)
;
Vytvořili jste dvě tabulky
ZAKAZNICI
aOBJEDNAVKY
pomocí příkazůCREATE TABLE
. TabulkaZAKAZNICI
obsahuje sloupceid
(jako primární klíč),jmeno
aOBJEDNAVKY
obsahuje sloupce id (jako primární klíč),nazev
azakaznik_id
. A poté jste vložili testovací data do obou tabulek pomocí příkazuINSERT INTO
.
Poznámka: I když jste v příkazech INSERT nezadali žádná konkrétní ID, databáze si primární klíče sama vytvořila. Toto ale není automatická funkcionalita všech relačních databází (RDBMS). V některých případech je nutné specifikovat, jestli se budou primární klíče vytvářet automaticky a jakým způsobem.
INNER JOIN
INNER JOIN je příkaz v SQL, který slouží ke spojování řádků z dvou tabulek na základě shody hodnot ve spojovaných sloupcích. Používá se k získání dat, která mají shodné hodnoty v obou spojovaných tabulkách.
Příklad 1
Vyzkoušejte si použití INNER JOINu se oběma tabulkami "ZAKAZNICI" a "OBJEDNAVKY".
SELECT z.jmeno, o.nazev
FROM ZAKAZNICI z
INNER JOIN OBJEDNAVKY o
ON z.id = o.zakaznik_id
;
jmeno | nazev
----------------+-------------------------
Jan Novák | Python - základy
Jan Novák | OK, Python
Marie Kovářová | Data Analytics Pass
Jan Novák | Úvod do řízení projektů
(4 rows)
V tomto příkladu jste použili
INNER JOIN
, pomocí kterého získáte informace o zákaznících a jejich objednávkách. Tento příkaz spojí tabulkyZAKAZNICI
aOBJEDNAVKY
na základě shodných hodnot mezi sloupciid
azakaznik_id
v obou tabulkách. Výsledek obsahuje jméno zákazníka a název objednávky pro každý shodující se řádek, tedy kombinaci zákazníků a objednávek.
LEFT (OUTER) JOIN
Příkaz LEFT JOIN je jedním z typů operátorů JOIN v SQL, který spojuje řádky z dvou tabulek na základě shody hodnot ve specifikovaných sloupcích.
Zachová všechny řádky z levé (první) tabulky a pokud najde odpovídající záznamy v pravé (druhé) tabulce, tak je přiřadí.
Pokud záznamy v pravé tabulce nenajde, vrátí v daném řádku a sloupci hodnotu NULL
.
Příklad 2
V následujícím příkladu si vyzkoušíte LEFT JOIN.
SELECT z.jmeno, COALESCE(o.nazev, '(bez objednávky)') AS nazev
FROM ZAKAZNICI z
LEFT JOIN OBJEDNAVKY o
ON z.ID = o.zakaznik_id
;
jmeno | nazev
----------------+-------------------------
Jan Novák | Python - základy
Jan Novák | OK, Python
Marie Kovářová | Data Analytics Pass
Jan Novák | Úvod do řízení projektů
Petr Svoboda | (bez objednávky)
(5 rows)
V tomto příkladu jste použili
LEFT JOIN
, který umožňuje získání informací o všech zákaznících, včetně těch, kteří nemají žádné objednávky. Tento typ JOINu spojuje tabulkyZAKAZNICI
aOBJEDNAVKY
na základě shody hodnot mezi sloupciid
v tabulceZAKAZNICI
a zakaznik_id v tabulceOBJEDNAVKY
. Výsledek obsahuje jméno zákazníka a název objednávky, pokud existuje shoda, nebo výraz(bez objednávky)
, pokud zákazník nemá žádnou objednávku.
RIGHT (OUTER) JOIN
Příkaz RIGHT JOIN je vlastně opakem LEFT JOINu.
Zachová všechny řádky z pravé (druhé) tabulky a pokud najde odpovídající záznamy v levé (první) tabulce, tak je přiřadí.
Pokud záznamy v levé tabulce nenajde, vrátí v daném řádku a sloupci hodnotu NULL
.
V praxi je používaný méně častěji než LEFT JOIN.
Příklad 3
U tohoto příkladu použijete RIGHT JOIN.
SELECT COALESCE(z.jmeno,'(zatím neobjednáno)') AS jmeno, o.nazev
FROM ZAKAZNICI z
RIGHT JOIN OBJEDNAVKY o
ON z.ID = o.zakaznik_id
;
jmeno | nazev
---------------------+-------------------------
Jan Novák | Python - základy
Jan Novák | OK, Python
Marie Kovářová | Data Analytics Pass
Jan Novák | Úvod do řízení projektů
(zatím neobjednáno) | SQL pro každý den
(5 rows)
V tomto příkladu je použit
RIGHT JOIN
, který umožňuje získání informací o všech objednávkách a jejich příslušných zákaznících. Tento JOIN spojuje tabulkyZAKAZNICI
aOBJEDNAVKY
na základě shody hodnot mezi sloupciID
v tabulceZAKAZNICI
azakaznik_id
v tabulceOBJEDNAVKY
. Výsledek obsahuje jméno zákazníka a název objednávky, pokud existuje shoda, nebo NULL, pokud objednávka nemá přiřazeného zákazníka.
RIGHT JOIN samozřejmě lze snadno přepsat jako LEFT JOIN. V praxe se proto spíše setkáte s následujícím zápisem.
Příklad 4
SELECT COALESCE(z.jmeno,'(zatím neobjednáno)') AS jmeno, o.nazev
FROM OBJEDNAVKY o
LEFT JOIN ZAKAZNICI z
ON o.zakaznik_id = z.ID
;
jmeno | nazev
---------------------+-------------------------
Jan Novák | Python - základy
Jan Novák | OK, Python
Marie Kovářová | Data Analytics Pass
Jan Novák | Úvod do řízení projektů
(zatím neobjednáno) | SQL pro každý den
(5 rows)
FULL (OUTER) JOIN
Full join zachová všechny řádky z levé (první) tabulky a také z pravé (druhé) tabulky.
Pokud záznamy v některé z tabulek nenajde, vrátí v daném řádku a sloupci hodnotu NULL
.
Příklad 5
-- Všechny záznamy z levé i pravé tabulky
SELECT COALESCE(z.jmeno, '(chybí)') AS jmeno,
COALESCE(o.nazev, '(chybí)') AS nazev
FROM ZAKAZNICI z
FULL JOIN OBJEDNAVKY o
ON z.ID = o.zakaznik_id
;
jmeno | nazev
----------------+-------------------------
Jan Novák | Python - základy
Jan Novák | OK, Python
Marie Kovářová | Data Analytics Pass
Jan Novák | Úvod do řízení projektů
(chybí) | SQL pro každý den
Petr Svoboda | (chybí)
(6 rows)
CROSS JOIN
Příkaz CROSS JOIN v SQL je operátor JOIN, který kombinuje každý řádek z jedné tabulky s každým řádkem z druhé tabulky. Nevyžaduje žádnou podmínku spojení mezi sloupci, na rozdíl od ostatních typů JOIN. Jedná se vlastně o kartézský součin, tedy spojení každý s každým.
Příklad 6
Zkuste použití CROSS JOINu.
SELECT z.jmeno, o.nazev
FROM ZAKAZNICI z
CROSS JOIN OBJEDNAVKY o
;
jmeno | nazev
----------------+-------------------------
Jan Novák | Python - základy
Jan Novák | OK, Python
Jan Novák | Data Analytics Pass
Jan Novák | Úvod do řízení projektů
Jan Novák | SQL pro každý den
Marie Kovářová | Python - základy
Marie Kovářová | OK, Python
Marie Kovářová | Data Analytics Pass
Marie Kovářová | Úvod do řízení projektů
Marie Kovářová | SQL pro každý den
Petr Svoboda | Python - základy
Petr Svoboda | OK, Python
Petr Svoboda | Data Analytics Pass
Petr Svoboda | Úvod do řízení projektů
Petr Svoboda | SQL pro každý den
(15 rows)
V tomto příkladu jste použili
CROSS JOIN
, který kombinuje každý záznam z tabulkyZAKAZNICI
s každým záznamem z tabulkyOBJEDNAVKY
. Výsledkem jsou všechny možné kombinace zákazníků a objednávek.
Závěrem
Různé typy SQL joinů poskytují mocný nástroj pro propojování dat z tabulek a získávání komplexních výsledků. Správné použití a porozumění těmto typům joinu je důležité pro efektivní práci s databázemi a analýzu dat.
Pokud se chcete dále zdokonalit ve znalostech SQL a naučit se efektivně využívat různé typy joinů, podívejte se na seznam kurzů zaměřených na SQL.
Naše kurzy nabízejí přehlednou a praktickou výuku, která vám pomůže získat hlubší porozumění SQL a zlepšit vaše dovednosti v manipulaci s daty.