sql >> Databáze >  >> RDS >> Mysql

Levé spojení nebo výběr z více tabulek pomocí čárky (,)

Za prvé, aby byl zcela ekvivalentní, první dotaz by měl být napsán

   SELECT mw.*, 
          nvs.* 
     FROM mst_words mw 
LEFT JOIN (SELECT *
             FROM vocab_stats 
            WHERE owner = 1111) AS nvs ON mw.no = nvs.vocab_no 
    WHERE (nvs.correct > 0 ) 
      AND mw.level = 1

Takže mw.* a nvs.* společně vytvoří stejnou sadu jako singulární * ve 2. dotazu. Dotaz, jak jste napsal, může používat INNER JOIN, protože obsahuje filtr na nvs.correct.

Obecná forma

TABLEA LEFT JOIN TABLEB ON <CONDITION>

attempts najít záznamy TableB na základě podmínky. Pokud selže, výsledky z TABLEA se zachovají, přičemž všechny sloupce z tabulky B budou nastaveny na hodnotu NULL. Naproti tomu

TABLEA INNER JOIN TABLEB ON <CONDITION>

také attempts najít záznamy TableB na základě podmínky. Nicméně , když selže, je konkrétní záznam z tabulky A odstraněn z výstupní sady výsledků.

Standard ANSI pro CROSS JOIN vytváří Kartézský produkt mezi dvěma tabulkami.

TABLEA CROSS JOIN TABLEB
  -- # or in older syntax, simply using commas
TABLEA, TABLEB

Záměrem syntaxe je, aby KAŽDÝ řádek v TABLEA byl spojen s KAŽDÝM řádkem v TABLEB. Takže 4 řádky v A a 3 řádky v B vytvoří 12 řádků výstupu. Při spárování s podmínkami v klauzuli WHERE to někdy vytváří stejné chování INNER JOIN, protože vyjadřují totéž (podmínka mezi A a B => zachovat nebo ne). Při čtení je však mnohem jasnější, pokud jde o záměr, když místo čárek použijete INNER JOIN.

Z hlediska výkonu většina DBMS zpracuje LEVÉ spojení rychleji než INNER JOIN. Čárková notace může způsobit, že databázové systémy nesprávně vyloží záměr a vytvoří špatný plán dotazů – takže další plus pro zápis SQL92.

Proč potřebujeme LEFT JOIN? Pokud výše uvedené vysvětlení LEFT JOIN stále nestačí (uchovávejte záznamy v A bez shod v B), pak zvažte, že k dosažení stejného budete potřebovat komplexní UNION mezi dvěma sadami pomocí staré čárkové notace, abyste dosáhli stejného efektu. . Ale jak již bylo uvedeno , to se netýká vašeho příkladu, který je ve skutečnosti INNER JOIN skrývající se za LEFT JOIN.

Poznámky:

  • RIGHT JOIN je stejný jako LEFT, až na to, že začíná TABLEB (pravá strana) místo A.
  • PRAVÉ a LEVÉ SPOJE jsou obě VNĚJŠÍ připojení. Slovo OUTER je nepovinné, tj. může být zapsáno jako LEFT OUTER JOIN .
  • Třetím typem VNĚJŠÍHO spojení je ÚPLNÉ VNĚJŠÍ spojení, ale o tom zde není řeč.


  1. Velký obchod:SQL Server 2016 Service Pack 1

  2. odesílání dat do MySQL pomocí AJAX + jQuery + PHP

  3. SCOPE_IDENTITY() pro GUID?

  4. Získejte záznamy z jedné tabulky, kde v jiné není žádný záznam