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

Połącz z lewej strony lub wybierz z wielu tabel, używając przecinka (,)

Przede wszystkim, aby było całkowicie równoważne, pierwsze zapytanie powinno zostać napisane

   SELECT mw.*, 
          nvs.* 
     FROM mst_words mw 
LEFT JOIN (SELECT *
             FROM vocab_stats 
            WHERE owner = 1111) AS nvs ON mw.no = nvs.vocab_no 
    WHERE (nvs.correct > 0 ) 
      AND mw.level = 1

Zatem mw.* i nvs.* razem tworzą ten sam zestaw, co liczba pojedyncza * w drugim zapytaniu. Zapytanie tak, jak napisałeś, może używać INNER JOIN, ponieważ zawiera filtr na nvs.correct.

Ogólna forma

TABLEA LEFT JOIN TABLEB ON <CONDITION>

attempts aby znaleźć rekordy TableB na podstawie warunku. Jeśli się nie powiedzie, wyniki z tabeli TABLEA są zachowywane, a wszystkie kolumny z tabeli B mają wartość NULL. W przeciwieństwie

TABLEA INNER JOIN TABLEB ON <CONDITION>

także attempts aby znaleźć rekordy TableB na podstawie warunku. Jednak , gdy się nie powiedzie, konkretny rekord z Tabeli A jest usuwany z wyjściowego zestawu wyników.

Standard ANSI dla CROSS JOIN tworzy Produkt kartezjański między dwoma stołami.

TABLEA CROSS JOIN TABLEB
  -- # or in older syntax, simply using commas
TABLEA, TABLEB

Intencją składni jest to, że KAŻDY wiersz w tabeli TABLEA jest połączony z KAŻDY wiersz w tabeli TABLEB. Tak więc 4 rzędy w A i 3 rzędy w B dają 12 rzędów wyjścia. W połączeniu z warunkami w klauzuli WHERE czasami powoduje to samo zachowanie INNER JOIN, ponieważ wyrażają to samo (warunek między A i B => zachowaj lub nie). Jednak podczas czytania intencji jest znacznie jaśniejsze, gdy używasz INNER JOIN zamiast przecinków.

Jeśli chodzi o wydajność, większość DBMS będzie przetwarzać LEFT JOIN szybciej niż INNER JOIN. Notacja przecinkowa może spowodować, że systemy baz danych błędnie zinterpretują intencję i wygenerują zły plan zapytania - więc kolejny plus dla notacji SQL92.

Dlaczego potrzebujemy LEFT JOIN? Jeśli wyjaśnienie LEFT JOIN powyżej nadal nie wystarcza (przechowuj rekordy w A bez dopasowań w B), rozważ, że aby osiągnąć to samo, potrzebujesz złożonej UNION między dwoma zestawami przy użyciu starej notacji przecinkowej, aby osiągnąć ten sam efekt . Ale jak wspomniano wcześniej , nie dotyczy to twojego przykładu, który tak naprawdę jest INNER JOIN ukrytym za LEFT JOIN.

Uwagi:

  • PRAWY JOIN jest taki sam jak LEFT, z wyjątkiem tego, że zaczyna się od TABLEB (prawa strona) zamiast A.
  • RIGHT i LEFT JOINS są sprzężeniami OUTER. Słowo OUTER jest opcjonalne, tzn. można je zapisać jako LEFT OUTER JOIN .
  • Trzecim typem złączenia OUTER jest złącze FULL OUTER, ale nie jest to tutaj omawiane.


  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 wybrać wszystkie kolumny w sql z wyjątkiem jednej kolumny?

  2. Jak utworzyć histogram w MySQL?

  3. Co może zrobić funkcja agregująca w klauzuli ORDER BY?

  4. Synchronizacja bazy danych Mysql między dwiema bazami danych

  5. java.sql.SQLException:liczba kolumn nie odpowiada liczbie wartości w wierszu 1 błąd