Có vẻ như kết hợp hai hoặc nhiều bảng, chúng ta có thể sử dụng phép nối hoặc ở đâu. Ưu điểm của cái này hơn cái kia là gì?
Có vẻ như kết hợp hai hoặc nhiều bảng, chúng ta có thể sử dụng phép nối hoặc ở đâu. Ưu điểm của cái này hơn cái kia là gì?
Câu trả lời:
Bất kỳ truy vấn nào liên quan đến nhiều hơn một bảng đều yêu cầu một số dạng liên kết để liên kết các kết quả từ bảng "A" với bảng "B". Phương tiện truyền thống (ANSI-89) để làm điều này là:
Viết liên kết giữa các bảng trong mệnh đề WHERE
SELECT *
FROM TABLE_A a,
TABLE_B b
WHERE a.id = b.id
Đây là truy vấn được viết lại bằng cú pháp ANSI-92 JOIN:
SELECT *
FROM TABLE_A a
JOIN TABLE_B b ON b.id = a.id
Nếu được hỗ trợ (Oracle 9i +, PostgreSQL 7.2+, MySQL 3.23+, SQL Server 2000+), không có lợi ích về hiệu suất khi sử dụng cú pháp này so với cú pháp khác. Trình tối ưu hóa coi chúng là cùng một truy vấn. Nhưng các truy vấn phức tạp hơn có thể được hưởng lợi từ việc sử dụng cú pháp ANSI-92:
Có nhiều lý do để sử dụng cú pháp ANSI-92 JOIN trên ANSI-89:
Cú pháp ANSI-92 JOIN là mẫu, không phải phản mẫu:
Không quen thuộc và / hoặc thoải mái, tôi không thấy bất kỳ lợi ích nào khi tiếp tục sử dụng mệnh đề ANSI-89 WHERE thay vì cú pháp ANSI-92 JOIN. Một số người có thể phàn nàn rằng cú pháp ANSI-92 dài dòng hơn, nhưng đó là điều khiến nó rõ ràng. Càng rõ ràng, càng dễ hiểu và dễ bảo trì.
Hầu hết mọi người có xu hướng tìm thấy cú pháp JOIN rõ ràng hơn một chút về những gì đang được nối với những gì. Ngoài ra, nó có lợi ích là một tiêu chuẩn.
Cá nhân tôi "lớn lên" trên WHEREs, nhưng tôi càng sử dụng cú pháp JOIN, tôi càng bắt đầu thấy nó rõ ràng hơn.
Đây là những vấn đề với việc sử dụng cú pháp where (còn được gọi là liên kết ngầm):
Đầu tiên, việc kết hợp chéo ngẫu nhiên là quá dễ dàng vì các điều kiện tham gia không nằm ngay bên cạnh tên bảng. Nếu bạn có 6 bảng được nối với nhau, bạn rất dễ bỏ sót một bảng trong mệnh đề where. Bạn sẽ thấy điều này được cố định quá thường xuyên bằng cách sử dụng từ khóa riêng biệt. Đây là một cú đánh hiệu suất lớn đối với cơ sở dữ liệu. Bạn không thể nhận được một liên kết chéo ngẫu nhiên bằng cách sử dụng cú pháp liên kết rõ ràng vì nó sẽ không kiểm tra cú pháp.
Các phép nối phải và trái có vấn đề (Trong máy chủ SQl, bạn không được đảm bảo nhận được kết quả chính xác) theo cú pháp cũ trong một số cơ sở dữ liệu. Hơn nữa, chúng không được chấp nhận trong SQL Server mà tôi biết.
Nếu bạn định sử dụng phép nối chéo, thì cú pháp cũ không rõ ràng. Rõ ràng là sử dụng tiêu chuẩn ANSII hiện tại.
Người bảo trì sẽ khó hơn nhiều để xem chính xác các trường nào là một phần của phép nối hoặc thậm chí các bảng nào kết hợp với nhau theo thứ tự sử dụng cú pháp ngầm định. Điều này có nghĩa là có thể mất nhiều thời gian hơn để sửa đổi các truy vấn. Tôi đã biết rất ít người, một khi họ đã dành thời gian để cảm thấy thoải mái với cú pháp nối rõ ràng, đã từng quay lại cách cũ.
Tôi cũng nhận thấy rằng một số người sử dụng các phép nối ngầm này không thực sự hiểu cách các phép nối hoạt động và do đó nhận được kết quả không chính xác trong các truy vấn của họ.
Thành thật mà nói, bạn có sử dụng bất kỳ loại mã nào khác đã được thay thế bằng một phương pháp tốt hơn cách đây 18 năm không?
Các phép nối rõ ràng thể hiện ý định, để lại mệnh đề where để thực hiện việc lọc. Nó sạch hơn và nó là tiêu chuẩn, và bạn có thể làm những việc như bên trái bên ngoài hoặc bên phải bên ngoài khó làm hơn nếu chỉ ở đâu.
Bạn không thể sử dụng WHERE để kết hợp hai bảng. Những gì bạn có thể làm là viết:
SELECT * FROM A, B
WHERE ...
Dấu phẩy ở đây tương đương với cách viết:
SELECT *
FROM A
CROSS JOIN B
WHERE ...
Bạn sẽ viết nó? Không - bởi vì nó hoàn toàn không phải ý bạn. Bạn không muốn tham gia chéo, bạn muốn THAM GIA BÊN TRONG. Nhưng khi bạn viết dấu phẩy, bạn đang nói CROSS JOIN và điều đó thật khó hiểu.
Thực ra bạn thường cần cả "WHERE" và "THAM GIA".
"JOIN" được sử dụng để truy xuất dữ liệu từ hai bảng - dựa trên giá trị của một cột chung. Sau đó, nếu bạn muốn lọc thêm kết quả này, hãy sử dụng mệnh đề WHERE.
Ví dụ: "LEFT JOIN" lấy TẤT CẢ các hàng từ bảng bên trái, cộng với các hàng phù hợp từ bảng bên phải. Nhưng điều đó không lọc các bản ghi trên bất kỳ giá trị cụ thể nào hoặc trên các cột khác không phải là một phần của JOIN. Do đó, nếu bạn muốn lọc thêm kết quả này, hãy chỉ định các bộ lọc bổ sung trong mệnh đề WHERE.