Hành vi MySQL JOIN mặc định, INNER hay OUTER là gì?


92

Vì vậy, tôi đã xem qua internet trong giờ qua, đọc và tìm kiếm câu trả lời chính xác cho câu hỏi đơn giản này.

THAM GIA mặc định trong MySQL là gì?

SELECT * FROM t1 JOIN t2

Điều đó có giống với

SELECT * FROM t1, t2

OR

SELECT * FROM t1 INNER JOIN t2

Cũng là một câu hỏi liên quan, khi bạn sử dụng mệnh đề "WHERE", nó có giống như JOIN hay INNER JOIN không?

Hiện tại, tôi đang nghĩ rằng một JOIN độc lập giống hệt với việc sử dụng dấu phẩy và mệnh đề WHERE.

Câu trả lời:


125

Trong MySQL, viết JOINhàm ý không đủ tiêu chuẩn INNER JOIN. Nói cách khác, INNERtrong INNER JOINlà tùy chọn. INNERCROSSlà các từ đồng nghĩa trong MySQL. Để rõ ràng tôi viết JOINhoặc INNER JOINnếu tôi có điều kiện tham gia và CROSS JOINnếu tôi không có điều kiện.

Cú pháp được phép cho phép nối được mô tả trong tài liệu .


Hiện tại, tôi đang nghĩ một JOIN độc lập không hơn gì (giống hệt) sử dụng dấu phẩy và mệnh đề WHERE.


Hiệu quả là như nhau, nhưng lịch sử đằng sau chúng là khác nhau. Cú pháp dấu phẩy là từ tiêu chuẩn ANSI-89. Tuy nhiên, có một số vấn đề với cú pháp này nên trong tiêu chuẩn ANSI-92, từ khóa JOIN đã được giới thiệu.

Tôi thực sự khuyên bạn nên luôn sử dụng cú pháp JOIN thay vì dấu phẩy.

  • T1 JOIN T2 ON ...dễ đọc hơn T1, T2 WHERE ....
  • Nó dễ bảo trì hơn vì mối quan hệ bảng và bộ lọc được xác định rõ ràng thay vì trộn lẫn với nhau.
  • Cú pháp JOIN dễ chuyển đổi thành OUTER JOIN hơn cú pháp dấu phẩy.
  • Việc trộn lẫn cú pháp dấu phẩy và JOIN trong cùng một câu lệnh có thể gây ra các lỗi gây tò mò do các quy tắc ưu tiên.
  • Ít có khả năng vô tình tạo ra một sản phẩm cartesian khi sử dụng cú pháp JOIN do một mệnh đề nối bị quên, bởi vì các mệnh đề nối được viết bên cạnh các phép nối và rất dễ dàng để xem nếu thiếu một mệnh đề.

Ngọt ngào, cảm ơn vì đã làm rõ câu hỏi đơn giản này cho tôi :) Trước đây tôi luôn sử dụng dấu phẩy + mệnh đề where ... nhưng sẽ chuyển sang sử dụng JOIN theo lời khuyên của bạn. Cảm ơn
Quảng Văn

Này Mark, ý bạn là gì khi kết hợp giữa JOIN và dấu phẩy. Trộn các truy vấn như thế này, CHỌN * TỪ t1 THAM GIA TRÁI (t2, t3, t4) BẬT (t2.a = t1.a VÀ t3.b = t1.b VÀ t4.c = t1.c)?
Quảng Văn

2
@Quang: Ví dụ này sẽ không thành công:SELECT * FROM t1, t2 JOIN t3 ON t1.x=t3.y WHERE t1.a = t2.b
Mark Byers

0

Tất cả những thứ này đều tương đương và cũng bằng, CROSS JOIN ,.

Có một số khác biệt giữa việc sử dụng dấu phẩy và [INNER | CROSS] JOINcú pháp, điều này có thể quan trọng khi kết hợp nhiều bảng hơn. Khá nhiều điều bạn cần biết được mô tả ở đây trong tài liệu MySQLJOIN .


1
^ --- câu trả lời cho câu hỏi là JOIN (độc lập) về cơ bản là điều tương tự để INNER và dấu phẩy + nơi khoản
Quảng Văn
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.