Mysql
 sql >> Baza danych >  >> RDS >> Mysql

W zapytaniach MySQL, po co używać join zamiast gdzie?

Każde zapytanie obejmujące więcej niż jedną tabelę wymaga jakiejś formy powiązania w celu połączenia wyników z tabeli „A” z tabelą „B”. Tradycyjnym sposobem (ANSI-89) jest:

  1. Wymień tabele biorące udział w liście oddzielonej przecinkami w klauzuli FROM
  2. Zapisz powiązanie między tabelami w klauzuli WHERE

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

Oto zapytanie przepisane przy użyciu składni ANSI-92 JOIN:

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

Z perspektywy wydajności:

Tam, gdzie jest obsługiwana (Oracle 9i+, PostgreSQL 7.2+, MySQL 3.23+, SQL Server 2000+), użycie którejkolwiek składni nie przynosi korzyści pod względem wydajności. Optymalizator widzi je jako to samo zapytanie. Jednak bardziej złożone zapytania mogą skorzystać na użyciu składni ANSI-92:

  • Możliwość kontrolowania kolejności JOIN - kolejności, w jakiej tabele są skanowane
  • Możliwość zastosowania kryteriów filtrowania na stole przed dołączeniem

Z perspektywy konserwacji:

Istnieje wiele powodów, dla których warto używać składni ANSI-92 JOIN zamiast ANSI-89:

  • Bardziej czytelne, ponieważ kryteria JOIN są oddzielone od klauzuli WHERE
  • Mniej prawdopodobne jest pominięcie kryteriów JOIN
  • Spójna obsługa składni dla typów JOIN innych niż INNER, dzięki czemu zapytania są łatwe w użyciu w innych bazach danych
  • Klauzula GDZIE służy tylko jako filtracja iloczynu kartezjańskiego połączonych tabel

Z perspektywy projektowej:

Składnia ANSI-92 JOIN to wzorzec, a nie anty-wzorzec:

  • Cel zapytania jest bardziej oczywisty; kolumny używane przez aplikację są jasne
  • Jest to zgodne z zasadą modularności dotyczącą używania ścisłego pisania, gdy tylko jest to możliwe. Jawne jest prawie powszechnie lepsze.

Wniosek

Bez znajomości i/lub wygody nie widzę żadnych korzyści z dalszego używania klauzuli ANSI-89 WHERE zamiast składni ANSI-92 JOIN. Niektórzy mogą narzekać, że składnia ANSI-92 jest bardziej gadatliwa, ale to czyni ją wyraźną. Im bardziej jednoznaczne, tym łatwiej je zrozumieć i utrzymać.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak uzyskać każdy N-ty wiersz w MySQL

  2. Zapytanie MySQL odnajdujące wartości w ciągu znaków oddzielonych przecinkami

  3. Funkcja MySQL COT() — zwraca cotangens liczby w MySQL

  4. Jaki jest idealny typ danych do przechowywania szerokości/długości geograficznej w bazie danych MySQL?

  5. Instalacja MySQL:BŁĄD:Nie udało się zbudować natywnego rozszerzenia gem