Mục đích của tham số SỬ DỤNG trong SQL là gì?


7

Làm việc với một số mã trên cơ sở dữ liệu MySQL tiêu chuẩn và tôi đã xem qua tuyên bố này:

SELECT * FROM foo LEFT JOIN bar USING ('bar_id') WHERE foo_id = 1

Điều ném tôi là: USINGđể làm gì, nó làm gì?

Giả định đầu tiên của tôi là nó liên quan đến việc làm việc với các khóa ngoại hoặc có thể là các chỉ mục, nhưng lược đồ DB không có dấu hiệu của bất kỳ khóa hoặc chỉ mục ngoại, giai đoạn nào.
Googlefu của tôi đã làm tôi thất bại, có lẽ vì đó USINGlà một từ phổ biến trong hầu hết các văn bản trên các trang web ngoài kia. Vì vậy, tôi tự hỏi nếu các chuyên gia DB nghe có thể làm sáng tỏ những gì nó làm trước khi tôi tìm cách sửa đổi điều này và nhiều truy vấn khác trong mã này.

Câu trả lời:


8

Trong ngữ cảnh truy vấn của bạn, USINGgiúp đáp ứng JOINmiễn là hai bảng có liên quan JOINcó cùng tên cột để tham gia. Nó giống như làm một NATURAL JOIN.

Truy vấn của bạn

SELECT * FROM foo LEFT JOIN bar USING ('bar_id') WHERE foo_id = 1

hoạt động giống như

SELECT * FROM foo LEFT JOIN bar ON foo.bar_id = bar.bar_id WHERE foo_id = 1

Theo tài liệu MySQL về cú pháp THAM GIA

Mệnh đề USING (cột_list) đặt tên cho một danh sách các cột phải tồn tại trong cả hai bảng. Nếu cả bảng a và b đều chứa các cột c1, c2 và c3, phép nối sau sẽ so sánh các cột tương ứng từ hai bảng:

a LEFT JOIN b USING (c1,c2,c3)

THAM GIA [LEFT] THAM GIA của hai bảng được xác định là tương đương về mặt ngữ nghĩa với THAM GIA VÀO THAM GIA với mệnh đề SỬ DỤNG đặt tên cho tất cả các cột tồn tại trong cả hai bảng.


Hmm quan tâm. Tôi quen thuộc hơn với cú pháp sau, nhưng tò mò không biết lợi ích của việc sử dụng thay vì BẬT là gì, vì dường như chúng sẽ thực hiện cùng chức năng. Chỉ cần gõ ít hơn với SỬ DỤNG?
canadiancreed

Tôi đoán SỬ DỤNG phục vụ như một lời nhắc nhở về các cột phổ biến liên quan đến bảng này với bảng khác. Đó là những gì làm cho THAM GIA TỰ NHIÊN trở thành một lựa chọn để sử dụng.
RolandoMySQLDBA

Tôi nghĩ bạn có thể thực hiện CHỌN bar_id nếu bạn đang sử dụng "SỬ DỤNG", nhưng bạn cần thực hiện CHỌN foo.bar_id nếu bạn đang sử dụng "BẬT".
Rick James

6

Điều cũng đáng để chỉ ra, là nếu bạn đang sử dụng USING, thì bạn có thể nhận được một tập kết quả khác như từ a JOIN. Đọc phần trích dẫn dưới đây trên tài liệu THAM GIA :

Tham gia xử lý các thay đổi trong MySQL 5.0.12

Ghi chú:

Các phép nối tự nhiên và nối với USING, bao gồm các biến thể nối ngoài, được xử lý theo tiêu chuẩn SQL: 2003. Mục tiêu là căn chỉnh cú pháp và ngữ nghĩa của MySQL đối với THAM GIA TỰ NHIÊN và THAM GIA ... SỬ DỤNG theo SQL: 2003. Tuy nhiên, những thay đổi trong xử lý nối này có thể dẫn đến các cột đầu ra khác nhau cho một số phép nối. Ngoài ra, một số truy vấn có vẻ hoạt động chính xác trong các phiên bản cũ hơn (trước 5.0.12) phải được viết lại để tuân thủ tiêu chuẩn.

Những thay đổi này có năm khía cạnh chính:

  • Cách mà MySQL xác định các cột kết quả của các hoạt động tham gia TỰ NHIÊN hoặc SỬ DỤNG (và do đó là kết quả của toàn bộ mệnh đề TỪ).

  • Mở rộng CHỌN * và CHỌN tbl_name. * Vào danh sách các cột được chọn.

  • Độ phân giải của tên cột trong TỰ NHIÊN hoặc SỬ DỤNG tham gia.

  • Chuyển đổi TỰ NHIÊN hoặc SỬ DỤNG tham gia vào THAM GIA ... BẬT.

  • Độ phân giải của các tên cột trong điều kiện BẬT của THAM GIA ... BẬT.

Thay đổi thú vị nhất có lẽ là (bây giờ được trích dẫn từ tài liệu)

LEFT JOIN b USING (c1,c2,c3)

LEFT JOIN b ON a.c1=b.c1 AND a.c2=b.c2 AND a.c3=b.c3

không còn hoàn toàn giống nhau, liên quan đến việc xác định cột nào sẽ hiển thị để SELECT *mở rộng. Phép USINGnối chọn giá trị liên kết của các cột tương ứng, trong khi phép ONnối chọn tất cả các cột từ tất cả các bảng. Đối với phép USINGnối trước , SELECT *chọn các giá trị sau:

COALESCE(a.c1,b.c1), COALESCE(a.c2,b.c2), COALESCE(a.c3,b.c3)

Để ONtham gia, SELECT *chọn các giá trị sau:

a.c1, a.c2, a.c3, b.c1, b.c2, b.c3

Với phép nối bên trong, COALESCE(a.c1,b.c1)giống như một a.c1hoặc b.c1bởi vì cả hai cột sẽ có cùng giá trị. Với một liên kết ngoài (chẳng hạn như LEFT JOIN), một trong hai cột có thể NULL. Cột đó sẽ được bỏ qua từ kết quả.


Phối cảnh đẹp, và +1 !!!
RolandoMySQLDBA

1
Một lý do khác để không sử dụngSELECT *
ypercubeᵀᴹ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.