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

Jaký je v SQL rozdíl mezi JOIN a CROSS JOIN?

SQL má následující typy spojení, z nichž všechny pocházejí přímo z teorie množin:

  • Vnitřní spojení.
    From A inner join B je ekvivalentem A ∩ B, poskytuje množinu prvků společných oběma množinám.

  • Levý vnější spoj.
    From A left outer join B je ekvivalent (A − B) ∪ (A ∩ B). Každé A se objeví alespoň jednou; pokud existuje více odpovídajících B, bude se A opakovat jednou pro odpovídající B.

  • Pravý vnější spoj.
    From A right outer join B je ekvivalentem (A ∩ B) ∪ (B − A). Je identický s levým spojením s obchodními místy stolů. Každé B se objeví alespoň jednou; pokud existuje více odpovídajících As, každé B se bude opakovat jednou pro odpovídající B.

  • Úplné vnější spojení.
    From A full outer join B je ekvivalentem (A − B) ∪ (A ∩ B) ∪ (B − A). Každé A a každé B se objeví alespoň jednou. Pokud se A shoduje s více B, bude se opakovat jednou za shodu; pokud B odpovídá více As, bude se opakovat jednou za shodu.

  • Křížové připojení.
    From A cross join B vytváří karteziánský součin A × B. Každé A se bude opakovat jednou pro každé B. Pokud A má 100 řádků a B má 100 řádků, bude sada výsledků obsahovat 10 000 řádků.

Je třeba poznamenat, že teoretické provedení select dotaz se skládá z následujících kroků provedených v tomto pořadí:

  1. Vypočítejte úplný kartézský součin zdrojové sady (sad) v from klauzule, která připraví sadu výsledků kandidáta.

  2. Použijte kritéria spojení v from klauzule a redukovat kandidátní sadu výsledků.

  3. Použijte kritéria v where clause k dalšímu snížení sady výsledků kandidátů.

  4. rozdělte kandidátní sadu výsledků do skupin na základě kritérií v group by doložka.

  5. Odstraňte ze sady výsledků kandidátů všechny sloupce kromě těch, které jsou součástí group by klauzule nebo se účastní hodnocení agregační funkce.

  6. Vypočítejte hodnotu všech takových agregačních funkcí pro každou skupinu v sadě výsledků kandidátů.

  7. Sbalte každou skupinu v kandidátské sadě výsledků do jednoho řádku sestávajícího ze sloupců seskupení a vypočtených hodnot pro každou agregační funkci. Kandidátní sada výsledků se nyní skládá z jednoho řádku pro každou skupinu se všemi sloupci kromě group by sloupce nebo výpočetní hodnoty agregačních funkcí pro skupinu jsou odstraněny.

  8. Použijte kritéria v having klauzule ke zmenšení sady výsledků kandidátů a vytvoření konečné sady výsledků.

  9. Seřaďte konečný výsledek nastavený podle kritérií v order by klauzule a vydat ji.

Existuje více kroků, které souvisí s věcmi jako compute a compute by klauzule, ale to je dostatečné k získání teoretické představy o tom, jak to funguje.

Je třeba také poznamenat, že nic jiného než ta nejnaivnější implementace by ve skutečnosti nevyhodnotila select tímto způsobem, ale získané výsledky musí být stejné, jako kdyby byly výše uvedené kroky provedeny v plném rozsahu.



  1. Přístup k připojení odepřen pro uživatele www-data

  2. Prázdnou hodnotu jsem získal z databáze v laravel na select

  3. PHP:ekvivalent funkce MySQL SUBSTRING_INDEX ?

  4. Síťový adaptér nemohl navázat připojení při připojování k Oracle DB