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 pháp truyền thống (ANSI-89) để làm điều này là:
- Liệt kê các bảng có liên quan trong một danh sách được phân tách bằng dấu phẩy trong mệnh đề FROM
-
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
Từ góc độ Hiệu suất:
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:
- Khả năng kiểm soát thứ tự JOIN - thứ tự mà các bảng được quét
- Khả năng áp dụng các tiêu chí bộ lọc trên một bảng trước khi tham gia
Từ quan điểm bảo trì:
Có nhiều lý do để sử dụng cú pháp ANSI-92 JOIN trên ANSI-89:
- Dễ đọc hơn, vì tiêu chí JOIN tách biệt với mệnh đề WHERE
- Ít có khả năng bỏ lỡ các tiêu chí THAM GIA
- Hỗ trợ cú pháp nhất quán cho các loại JOIN ngoài INNER, giúp các truy vấn dễ sử dụng trên các cơ sở dữ liệu khác
- Mệnh đề WHERE chỉ đóng vai trò lọc sản phẩm cacte của các bảng đã tham gia
Từ quan điểm thiết kế:
Cú pháp ANSI-92 JOIN là mẫu, không phải phản mẫu:
- Mục đích của truy vấn rõ ràng hơn; các cột được ứng dụng sử dụng rõ ràng
- Nó tuân theo quy tắc mô-đun về việc sử dụng cách nhập nghiêm ngặt bất cứ khi nào có thể. Rõ ràng hầu như tốt hơn.
Kết luận
Không quen thuộc và / hoặc cảm thấy 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 làm cho nó rõ ràng. Càng rõ ràng, càng dễ hiểu và dễ bảo trì.