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

Jaka jest różnica między JOIN a CROSS JOIN w SQL?

SQL ma następujące typy złączeń, z których wszystkie pochodzą bezpośrednio z teorii mnogości:

  • Złączenie wewnętrzne.
    From A inner join B jest odpowiednikiem A ∩ B, dostarczając zestaw elementów wspólnych dla obu zbiorów.

  • Lewe sprzężenie zewnętrzne.
    From A left outer join B jest odpowiednikiem (A − B) ∪ (A ∩ B). Każde A pojawi się przynajmniej raz; jeśli istnieje wiele pasujących B, A zostanie powtórzone raz na pasujące B.

  • Prawe sprzężenie zewnętrzne.
    From A right outer join B jest odpowiednikiem (A ∩ B) ∪ (B − A). Jest to identyczne jak lewe sprzężenie z miejscami wymiany stołów. Każde B pojawi się przynajmniej raz; jeśli istnieje wiele pasujących A, każde B zostanie powtórzone raz na pasujące B.

  • Pełne sprzężenie zewnętrzne.
    From A full outer join B jest odpowiednikiem (A − B) ∪ (A ∩ B) ∪ (B − A). Każdy A i każdy B pojawi się przynajmniej raz. Jeśli A pasuje do wielu B, zostanie powtórzone raz na mecz; jeśli B pasuje do wielu As, zostanie powtórzone raz na mecz.

  • Połączenie krzyżowe.
    From A cross join B produkuje produkt kartezjański A × B. Każde A zostanie powtórzone raz dla każdego B. Jeśli A ma 100 wierszy, a B ma 100 wierszy, zestaw wyników będzie składał się z 10 000 wierszy.

Należy zauważyć, że teoretyczne wykonanie select zapytanie składa się z następujących kroków wykonywanych w tej kolejności:

  1. Oblicz pełny iloczyn kartezjański zestawów źródłowych w from klauzula przygotowująca zbiór wyników kandydata.

  2. Zastosuj kryteria łączenia w from klauzulę i zmniejszyć zestaw wyników kandydata.

  3. Zastosuj kryteria w klauzuli where clause aby jeszcze bardziej zredukować kandydujący zestaw wyników.

  4. podziel zestaw wyników kandydata na grupy na podstawie kryteriów w group by klauzula.

  5. Usuń z kandydującego zestawu wyników wszelkie kolumny inne niż te, które należą do group by klauzuli lub zaangażowane w ocenę funkcji zbiorczej.

  6. Oblicz wartość dowolnej takiej funkcji agregującej dla każdej grupy w kandydującym zestawie wyników.

  7. Zwiń każdą grupę w kandydującym zestawie wyników do pojedynczego wiersza składającego się z kolumn grupujących i wartości obliczonych dla każdej funkcji agregującej. Kandydujący zestaw wyników składa się teraz z jednego wiersza dla każdej grupy, ze wszystkimi kolumnami innymi niż group by kolumny lub wartości obliczeniowe funkcji agregujących dla grupy są eliminowane.

  8. Zastosuj kryteria w having klauzula o zmniejszeniu zestawu wyników kandydata i stworzeniu ostatecznego zestawu wyników.

  9. Uporządkuj wynik końcowy ustawiony według kryteriów w order by klauzulę i wyemituj ją.

Jest więcej kroków związanych z takimi rzeczami jak compute i compute by klauzul, ale to wystarczy, aby uzyskać teoretyczne pojęcie, jak to działa.

Należy również zauważyć, że tylko najbardziej naiwna implementacja nie oceni select oświadczenie w ten sposób, ale uzyskane wyniki muszą być takie same, jak gdyby powyższe kroki zostały wykonane w całości.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cel SQLAlchemy nad MySQLdb

  2. Dlaczego moja pętla foreach nie działa zgodnie z oczekiwaniami?

  3. PHP PDO i MySQLi

  4. Unikalny indeks mysql używany jako metoda obsługi wyjątków w java

  5. JSON Wstaw do tabeli MySQL lub zaktualizuj, jeśli istnieje