SQL — JOIN

Zpět na blog

SQL — JOIN

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:

  1. 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ší.

  2. 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.

  3. 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.

  4. FULL (OUTER) JOIN: vrací všechny řádky z obou tabulek. Pokud neexistuje shoda, hodnoty pro nepříslušné řádky budou NULL.

  5. 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 ZAKAZNICIOBJEDNAVKY 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 ZAKAZNICIOBJEDNAVKY pomocí příkazů CREATE TABLE. Tabulka ZAKAZNICI obsahuje sloupce id (jako primární klíč), jmenoemail. Tabulka OBJEDNAVKY obsahuje sloupce id (jako primární klíč), nazevzakaznik_id. A poté jste vložili testovací data do obou tabulek pomocí příkazu INSERT 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í tabulky ZAKAZNICIOBJEDNAVKY na základě shodných hodnot mezi sloupci idzakaznik_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 tabulky ZAKAZNICIOBJEDNAVKY na základě shody hodnot mezi sloupci id v tabulce ZAKAZNICI a zakaznik_id v tabulce OBJEDNAVKY. 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 tabulky ZAKAZNICIOBJEDNAVKY na základě shody hodnot mezi sloupci ID v tabulce ZAKAZNICIzakaznik_id v tabulce OBJEDNAVKY. 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 tabulky ZAKAZNICI s každým záznamem z tabulky OBJEDNAVKY. 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.


Líbil se vám článek? Sdílejte ho s ostatními

nebo nám napište něco hezkého. Děkujeme!

Zpět na blog

SQL pro každý den

Jak si užít SQL a nezabloudit v kódu

Zobrazit knihu

SQL pro analytiky 2 - pokročilí

Naučte se vytvářet složité dotazy, databázové objekty a používat pokročilé funkce jazyka SQL.

Zobrazit kurz

OK, Python

Automatizujte rutinní práci v Excelu, nechte za sebe pracovat Python a zjednodušte si život.

Zobrazit knihu

Hledáme další autory

Publikujte na Lovely Blogu a inspirujte ostatní! Sdílením svých znalosti si budujete osobní značku.

Kontaktujte nás

Odběr novinek

Novinky, návody a tipy přímo do vašeho emailu.

Copyright © 2018-2024, Colorbee, s.r.o.

Designed by grafikli.cz in Prague.