Trước hết, để hoàn toàn tương đương, truy vấn đầu tiên nên được viết
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
Vì vậy, mw. * Và nvs. * Cùng tạo ra cùng một tập hợp như số ít của truy vấn thứ 2 *. Truy vấn như bạn đã viết có thể sử dụng INNER JOIN, vì nó bao gồm một bộ lọc trên nvs.correct.
Hình thức chung
TABLEA LEFT JOIN TABLEB ON <CONDITION>
attempts
để tìm bản ghi TableB dựa trên điều kiện. Nếu không thành công, kết quả từ TABLEA được giữ lại, với tất cả các cột từ TableB được đặt thành NULL. Ngược lại
TABLEA INNER JOIN TABLEB ON <CONDITION>
cũng attempts
để tìm bản ghi TableB dựa trên điều kiện. Tuy nhiên , khi không thành công, bản ghi cụ thể từ TableA sẽ bị xóa khỏi tập kết quả đầu ra.
Tiêu chuẩn ANSI cho CROSS JOIN tạo ra Sản phẩm Cartesian giữa hai bảng.
TABLEA CROSS JOIN TABLEB
-- # or in older syntax, simply using commas
TABLEA, TABLEB
Mục đích của cú pháp là MỖI hàng trong TABLEA được nối với MỖI hàng trong TABLEB. Vì vậy, 4 hàng ở A và 3 hàng ở B tạo ra 12 hàng sản lượng. Khi được ghép nối với các điều kiện trong mệnh đề WHERE, nó đôi khi tạo ra cùng một hành vi của INNER JOIN, vì chúng diễn đạt cùng một điều (điều kiện giữa A và B => giữ hoặc không). Tuy nhiên, rõ ràng hơn rất nhiều khi đọc về ý định khi bạn sử dụng INNER JOIN thay vì dấu phẩy.
Về mặt hiệu suất, hầu hết các DBMS sẽ xử lý phép tham gia TRÁI nhanh hơn so với phép tham gia BÊN TRONG. Ký hiệu dấu phẩy có thể khiến hệ thống cơ sở dữ liệu hiểu sai ý định và tạo ra một kế hoạch truy vấn không tốt - vì vậy một điểm cộng khác cho ký hiệu SQL92.
Tại sao chúng ta cần THAM GIA TRÁI? Nếu giải thích về LEFT JOIN ở trên vẫn chưa đủ (giữ các bản ghi ở A mà không trùng khớp ở B), thì hãy xem xét rằng để đạt được điều tương tự, bạn sẽ cần một UNION phức hợp giữa hai tập hợp bằng cách sử dụng ký hiệu dấu phẩy cũ để đạt được hiệu quả tương tự . Nhưng như đã nêu trước đây , điều này không áp dụng cho ví dụ của bạn, đây thực sự là một INNER JOIN ẩn đằng sau một LEFT JOIN.
Ghi chú:
- RIGHT JOIN giống LEFT, ngoại trừ việc nó bắt đầu bằng TABLEB (bên phải) thay vì A.
- RIGHT và LEFT JOINS đều là phép nối OUTER. Từ OUTER là tùy chọn, tức là nó có thể được viết là
LEFT OUTER JOIN
. - Loại tham gia OUTER thứ ba là tham gia FULL OUTER, nhưng điều đó không được thảo luận ở đây.