Mysql
 sql >> Database >  >> RDS >> Mysql

Nelle query MySQL, perché usare join invece di dove?

Qualsiasi query che coinvolge più di una tabella richiede una qualche forma di associazione per collegare i risultati dalla tabella "A" alla tabella "B". Il mezzo tradizionale (ANSI-89) per farlo è:

  1. Elenca le tabelle coinvolte in un elenco separato da virgole nella clausola FROM
  2. Scrivi l'associazione tra le tabelle nella clausola WHERE

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

Ecco la query riscritta utilizzando la sintassi ANSI-92 JOIN:

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

Dal punto di vista delle prestazioni:

Laddove supportato (Oracle 9i+, PostgreSQL 7.2+, MySQL 3.23+, SQL Server 2000+), non vi è alcun vantaggio in termini di prestazioni nell'utilizzo di una delle due sintassi rispetto all'altra. L'ottimizzatore li vede come la stessa query. Ma le query più complesse possono trarre vantaggio dall'utilizzo della sintassi ANSI-92:

  • Possibilità di controllare l'ordine JOIN:l'ordine in cui vengono scansionate le tabelle
  • Possibilità di applicare criteri di filtro su una tabella prima dell'adesione

Dal punto di vista della manutenzione:

Esistono numerosi motivi per utilizzare la sintassi ANSI-92 JOIN su ANSI-89:

  • Più leggibile, poiché i criteri JOIN sono separati dalla clausola WHERE
  • Meno probabilità di perdere i criteri JOIN
  • Supporto della sintassi coerente per tipi JOIN diversi da INNER, che semplifica l'utilizzo delle query su altri database
  • La clausola WHERE serve solo come filtrazione del prodotto cartesiano delle tavole unite

Da una prospettiva progettuale:

La sintassi ANSI-92 JOIN è pattern, non anti-pattern:

  • Lo scopo della query è più ovvio; le colonne utilizzate dall'applicazione sono chiare
  • Segue la regola della modularità sull'uso della tipizzazione rigorosa quando possibile. Esplicito è quasi universalmente migliore.

Conclusione

A parte la familiarità e/o la comodità, non vedo alcun vantaggio nel continuare a utilizzare la clausola ANSI-89 WHERE invece della sintassi ANSI-92 JOIN. Alcuni potrebbero lamentarsi del fatto che la sintassi ANSI-92 sia più dettagliata, ma questo è ciò che la rende esplicita. Più è esplicito, più facile è da comprendere e mantenere.