SQL LEFT JOIN

Poslední aktualizace:

Příkaz LEFT JOIN v SQL vytváří relaci mezi 2 tabulkami a vrací všechny záznamy z levé tabulky(A) spolu se záznamy, které jsou nalezeny i v pravé tabulce (B). Záznamy které nebyly nalezeny v pravé tabulce získají hodnotu NULL.

SQL Left join

Syntaxe:

/*LEFT JOIN je ekvivalentní s LEFT OUTER JOIN (Tabulka A = levá; Tabulka B = pravá)*/
SELECT sloupce
FROM Tabulka_A LEFT JOIN Tabulka_B
ON TabulkaA.sloupec=TabulkaB.sloupec

Ukázka LEFT JOIN

Princip spojování tabulek si ukážeme na příkladu s fotbalovými týmy. Mějme 2 tabulky, prohlédněte si je:

  • Fotbalove_tymy (ID, Tym, Id_mesto) – tabulka se seznamem fotbalových týmů
  • Mesta (ID, Nazev_mesta) – tabulka s městy
fotbalove-tymy-priklad

Vstupní data

Zobrazíme si seznam fotbalových týmů a k nim domácí město, skript bude vypadat takto:

SELECT
Fotbalove_tymy.ID, Fotbalove_tymy.Tym, Mesto.Mesto
FROM Fotbalove_tymy LEFT JOIN Mesto
ON Fotbalove_tymy.Id_Mesto=Mesto.Id

Co děláme? Vytváříme relaci mezi tabulkami. Podmínku, na základě které se nám záznamy v obou tabulkách spojí leží v ON klauzuli (Fotbalove_tymy.Id_Mesto=Mesto.Id).

Left-join-result

Výsledek

Ve výsledku máme narozdíl od INNER JOIN všechny fotbalové týmy uvedené v tabulce Fotbalove_tymy. Brnenský tým je zobrazen (levá tabulka), ale protože neexistuje záznam v tabulce s městy s město_id=0 je hodnota mesto = NULL

SQL LEFT JOIN
5 (100%) 1 vote[s]

Honza Zedníček

Jmenuji se Honza Zedníček a nejčastěji se se mnou v civilu můžete potkat v kancelářích společnosti Kentico, s.r.o v Brně, kde působím jako BI Developer. Částečně pracuji také jako freelancer. Tuto práci dělám pro různé firmy již přes 5 let, ale Kentico je moje srdcovka ♡. Před tím jsem pracoval v několika bankách na pozicích finanční controller a manažer. Po práci se měním na vášnivého hráče tenisu, šachu a ochutnávače dobrých rumů. Mým velké štěstím, koníčkem a někdy stresorem se před 3 lety stal syn Kubíček. Svoje znalosti se snažím zapisovat na tento web - abych je nezapomněl (působením rumu ^^) a sloužily i někomu dalšímu. Přidejte si mě na LinkedIn nebo se subscribněte na RSS kanál

Rubrika: Základy SQL Štítky:

About Honza Zedníček

Jmenuji se Honza Zedníček a nejčastěji se se mnou v civilu můžete potkat v kancelářích společnosti Kentico, s.r.o v Brně, kde působím jako BI Developer. Částečně pracuji také jako freelancer. Tuto práci dělám pro různé firmy již přes 5 let, ale Kentico je moje srdcovka ♡. Před tím jsem pracoval v několika bankách na pozicích finanční controller a manažer. Po práci se měním na vášnivého hráče tenisu, šachu a ochutnávače dobrých rumů. Mým velké štěstím, koníčkem a někdy stresorem se před 3 lety stal syn Kubíček. Svoje znalosti se snažím zapisovat na tento web - abych je nezapomněl (působením rumu ^^) a sloužily i někomu dalšímu. Přidejte si mě na LinkedIn nebo se subscribněte na RSS kanál

2 thoughts on “SQL LEFT JOIN

  1. Pavel

    Dobrý den,
    Vaše stránky jsou skvělí pomocník, nejsem programátor a asi nikdy nebudu, nicméně díky Vašim stránkám jsem si z našeho účetního mohl vytahat data a poskládat si je reportech které potřebuji ke své práci, moc děkuji.
    A ted k dotazu:
    Spojuji dvě tabulky. Levá tabulka je databáze produktů (
    ID 1 = cihla, optimální zásoba 10ks
    ID 2 = cement, optimální zásoba 8ks)
    a k těmto produktům potřebuji doplnit aktuální zásobu na skladě a průměrnou cenu zádoby tj mám pravou tabulku která obsahuje tyto řádky (
    ID 1 = 10ks 100,-Kč
    ID 1 = 5ks 80Kč
    ID 1 = 8ks 90,-Kč
    ID 1 = 7ks 100,-Kč)
    Spojit je umím, problém je že tu pravou tabulku potřebuji asi předtím sečíst aby každý řádek v pravé tabulce byl jen jednou a to už neumím – takto se mi tam opakují duplicitně stejné hodnoty z levé tabulky. Pokud by to bylo 1:1 tak se mi to daří, ale takto už jsem nemydlenej
    Děkuji za radu

    1. Honza Zedníček Post author

      Ahoj Pavle,

      za mě palec nahoru, že jsi udělal první krok k tomu naučit se SQL a zjednodušit si do budoucna práci. K tvému problému:

      (i) Když se nad tím zamyšlíš tak ano, můžeš problém řešit tak, že v pravé tabulce nejprve uděláš SUMU přes ProductID a pak teprve ty 2 tabulky zjoinuješ, to by vypadalo nějak takhle:

      SELECT
      a.ProductID,
      a.OptimalniZAsoba
      b.AktualniZasoba
      a.OptimalniZAsoba – AktualniZasoba AS Deficit
      FROM TabulkaProdukt a
      LEFT JOIN (SELECT ProductID, SUM(AktualniZasoba) AS AktualniZasoba FROM TabulkaSklad GROUP BY ProductID) b
      ON a.ProductID = b.PRoductID

      Výsledek budou productID s aktuální hodnotou zásob a deficitem.

      (ii) Můžeš to ale udělat v tomto případě tak, že nejprve tabulky zjoinujes a pak provedeš agregaci:

      SELECT
      a.ProductID,
      a.OptimalniZAsoba
      SUM(b.AktualniZasoba) AS AktualniZasoba
      a.OptimalniZAsoba – SUM(b.AktualniZasoba) AS Deficit
      FROM TabulkaProdukt a
      LEFT JOIN TabulkaSklad b
      ON a.ProductID = b.PRoductID
      GROUP BY a.ProductID,
      a.OptimalniZAsoba

      Odkaz na článek o agregačních funkcích zde na webu: https://biportal.cz/sql-agregacni-funkce/

      Doufám že tam někde nemám chybu, psal jsem to narychlo u kafe, ale snad tě to nakoplo ke správnému řešení

Napsat komentář

Vaše emailová adresa nebude zveřejněna.

Tato stránka používá Akismet k omezení spamu. Podívejte se, jak vaše data z komentářů zpracováváme..