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

Sự khác biệt giữa việc sử dụng và bật trong phép nối bảng trong MySQL là gì?

Tôi không sử dụng cú pháp USING, vì

  1. hầu hết các liên kết của tôi không phù hợp với nó (không phải cùng một tên trường đang được khớp và / hoặc nhiều kết hợp trùng khớp trong liên kết) và
  2. không rõ ràng ngay lập tức nó chuyển sang nghĩa là gì trong trường hợp có nhiều hơn hai bảng

tức là giả sử 3 bảng có cột 'id' và 'id_2' thì

T1 JOIN T2 USING(id) JOIN T3 USING(id_2)

trở thành

T1 JOIN T2 ON(T1.id=T2.id) JOIN T3 ON(T1.id_2=T3.id_2 AND T2.id_2=T3.id_2)

hoặc

T1 JOIN T2 ON(T1.id=T2.id) JOIN T3 ON(T2.id_2=T3.id_2)

hay cái gì khác nữa?

Tìm ra điều này cho một phiên bản cơ sở dữ liệu cụ thể là một bài tập khá đơn giản, nhưng tôi không có nhiều niềm tin rằng nó nhất quán trên tất cả các cơ sở dữ liệu và tôi không phải là người duy nhất phải duy trì mã của mình (vì vậy những người khác cũng sẽ phải biết nó tương đương với cái gì).

Một sự khác biệt rõ ràng với WHERE so với ON là nếu tham gia nằm ngoài:

Giả sử một T1 có một trường ID duy nhất, một hàng chứa giá trị 1 và một T2 có một trường ID và VALUE (một hàng, ID =1, VALUE =6), thì chúng tôi nhận được:

SELECT T1.ID, T2.ID, T2.VALUE FROM T1 LEFT OUTER JOIN T2 ON(T1.ID=T2.ID) WHERE T2.VALUE=42

không cung cấp hàng, vì WHERE bắt buộc phải khớp, trong khi

SELECT T1.ID, T2.ID, T2.VALUE FROM T1 LEFT OUTER JOIN T2 ON(T1.ID=T2.ID AND T2.VALUE=42)

sẽ đưa ra một hàng với các giá trị

1, NULL, NULL

vì BẬT chỉ được yêu cầu để khớp với kết nối, là tùy chọn do nằm ngoài.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tạo ActiveRecord / Rails sử dụng cột mysql TIMESTAMP thực tế

  2. Xóa dấu phẩy bằng php khỏi mysql

  3. Sao lưu và khôi phục MySQL từ dòng lệnh

  4. php xóa các hàng liên kết khỏi cơ sở dữ liệu mysql

  5. Sử dụng một kết quả truy vấn trong một truy vấn khác