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

Warunek INNER JOIN w klauzuli WHERE lub klauzuli ON?

Dla sprzężeń wewnętrznych takich jak to są one logicznie równoważne. Możesz jednak napotkać sytuacje, w których warunek w klauzuli join oznacza coś innego niż warunek w klauzuli where.

Jako prostą ilustrację wyobraź sobie, że robisz lewe sprzężenie w ten sposób;

select x.id
from x
       left join y
         on x.id = y.id
;

Tutaj bierzemy wszystkie wiersze z x, niezależnie od tego, czy w y jest pasujący identyfikator. Załóżmy teraz, że nasz warunek dołączenia rośnie — szukamy nie tylko dopasowań w y na podstawie identyfikatora, ale także id_type.

select x.id
from x
       left join y
         on x.id = y.id
         and y.id_type = 'some type'
;

Ponownie daje to wszystkie wiersze w x, niezależnie od tego, czy istnieje dopasowanie (id, id_type) w y.

To jednak jest zupełnie inne:

select x.id
from x
       left join y
         on x.id = y.id
where y.id_type = 'some type'
;

W tej sytuacji wybieramy wszystkie rzędy x i próbujemy dopasować do rzędów od y. Teraz dla wierszy, dla których nie ma dopasowania w y, y.id_type będzie miał wartość null. Z tego powodu y.id_type ='jakiś typ' nie jest spełniony, więc te wiersze, w których nie ma dopasowania, są odrzucane, co skutecznie zmieniło to w sprzężenie wewnętrzne.

Krótko mówiąc:w przypadku złączeń wewnętrznych nie ma znaczenia, jakie warunki idą, ale w przypadku złączeń zewnętrznych tak.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL Workbench:Błąd w zapytaniu (1064):Błąd składni w pobliżu „VISIBLE” w wierszu 1

  2. SQLSTATE[42000]:Błąd składni lub naruszenie dostępu:1064 Wystąpił błąd w składni SQL — PHP — PDO

  3. Czy istnieje wzór do oszacowania wielkości indeksu w InnoDB?

  4. Konwencje nazewnictwa PHP/MySQL:camelCase vs under_score?

  5. json_encode i highcharts