Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Tham gia trái hoặc chọn từ nhiều bảng bằng dấu phẩy (,)

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Khóa ngoại MySQL trên bản thân

  2. Sử dụng .aggregate () trên một giá trị được giới thiệu bằng .extra (select ={...}) trong Truy vấn Django?

  3. Làm cách nào để làm cho truy vấn này chạy nhanh hơn?

  4. Các mẫu ngẫu nhiên đơn giản từ cơ sở dữ liệu Sql

  5. PDO là các hàng bị ảnh hưởng trong khi thực thi câu lệnh