sql >> Databasteknik >  >> RDS >> Mysql

Varför använda join istället för var i MySQL-frågor?

Alla frågor som involverar mer än en tabell kräver någon form av association för att länka resultaten från tabell "A" till tabell "B". Det traditionella (ANSI-89) sättet att göra detta är att:

  1. Lista tabellerna som ingår i en kommaseparerad lista i FROM-satsen
  2. Skriv kopplingen mellan tabellerna i WHERE-satsen

    SELECT *
      FROM TABLE_A a,
           TABLE_B b
     WHERE a.id = b.id
    

Här är frågan omskriven med ANSI-92 JOIN-syntax:

SELECT *
  FROM TABLE_A a
  JOIN TABLE_B b ON b.id = a.id

Ur ett prestationsperspektiv:

Där det stöds (Oracle 9i+, PostgreSQL 7.2+, MySQL 3.23+, SQL Server 2000+) finns det ingen prestandafördel med att använda endera syntaxen framför den andra. Optimeraren ser dem som samma fråga. Men mer komplexa frågor kan dra nytta av att använda ANSI-92-syntax:

  • Möjlighet att kontrollera JOIN-ordning - ordningen som tabeller ska skannas
  • Möjlighet att tillämpa filterkriterier på en tabell innan du går med

Ur ett underhållsperspektiv:

Det finns många anledningar att använda ANSI-92 JOIN-syntax över ANSI-89:

  • Mer läsbar, eftersom JOIN-kriteriet är separat från WHERE-satsen
  • Mindre sannolikt att missa JOIN-kriterier
  • Konsekvent syntaxstöd för andra JOIN-typer än INNER, vilket gör frågor lätta att använda i andra databaser
  • WHERE-satsen fungerar endast som filtrering av den kartesiska produkten av de sammanfogade tabellerna

Ur ett designperspektiv:

ANSI-92 JOIN-syntax är mönster, inte antimönster:

  • Syftet med frågan är mer uppenbart; kolumnerna som används av programmet är tydliga
  • Den följer modularitetsregeln om att använda strikt skrivning när det är möjligt. Explicit är nästan universellt bättre.

Slutsats

Med undantag för förtrogenhet och/eller komfort ser jag ingen fördel med att fortsätta använda ANSI-89 WHERE-satsen istället för ANSI-92 JOIN-syntaxen. Vissa kanske klagar på att ANSI-92-syntaxen är mer utförlig, men det är det som gör den explicit. Ju mer explicit, desto lättare är det att förstå och underhålla.



  1. Hur ändrar man en PG-kolumn till NULLABLE TRUE?

  2. Topp 9 användbara Oracle Apps-skrivarfrågor

  3. Hur man skapar en tabell med flera främmande nycklar och inte blir förvirrad

  4. DATEDIFF-funktion i Oracle