Áp dụng các câu điều kiện trong ON / WHERE
Ở đây tôi đã giải thích về các bước xử lý truy vấn logic.
Tham khảo: Bên trong Microsoft® SQL Server ™ 2005
Nhà xuất bản truy vấn T-SQL : Microsoft Press
Pub Ngày: 07 tháng 3 năm 2006
In ISBN-10: 0-7356-2313-9
In ISBN-13: 980-0-7356-2313-2
Trang: 640
Bên trong Microsoft® SQL Server ™ 2005 Truy vấn T-SQL
(8) SELECT (9) DISTINCT (11) TOP <top_specification> <select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) WITH {CUBE | ROLLUP}
(7) HAVING <having_condition>
(10) ORDER BY <order_by_list>
Khía cạnh đáng chú ý đầu tiên của SQL khác với các ngôn ngữ lập trình khác là thứ tự xử lý mã. Trong hầu hết các ngôn ngữ lập trình, mã được xử lý theo thứ tự được viết. Trong SQL, mệnh đề đầu tiên được xử lý là mệnh đề TỪ, trong khi mệnh đề SELECT, xuất hiện đầu tiên, được xử lý gần như cuối cùng.
Mỗi bước tạo một bảng ảo được sử dụng làm đầu vào cho bước sau. Các bảng ảo này không có sẵn cho người gọi (ứng dụng khách hoặc truy vấn bên ngoài). Chỉ bảng được tạo bởi bước cuối cùng được trả về cho người gọi. Nếu một mệnh đề nhất định không được chỉ định trong truy vấn, bước tương ứng chỉ đơn giản là bỏ qua.
Mô tả ngắn gọn về các giai đoạn xử lý truy vấn logic
Đừng quá lo lắng nếu việc mô tả các bước dường như không có ý nghĩa gì cho đến bây giờ. Chúng được cung cấp như một tài liệu tham khảo. Các phần xuất hiện sau ví dụ kịch bản sẽ bao gồm các bước chi tiết hơn nhiều.
TỪ: Một sản phẩm của Cartesian (nối chéo) được thực hiện giữa hai bảng đầu tiên trong mệnh đề TỪ và kết quả là bảng ảo VT1 được tạo.
ON: Bộ lọc ON được áp dụng cho VT1. Chỉ các hàng có <join_condition>
TRUE được chèn vào VT2.
OUTER (tham gia): Nếu một OUTER THAM GIA được chỉ định (trái ngược với CROSS THAM GIA hoặc INNER THAM GIA), các hàng từ bảng được bảo tồn hoặc các bảng không tìm thấy kết quả khớp được thêm vào các hàng từ VT2 dưới dạng các hàng ngoài, tạo ra VT3. Nếu có nhiều hơn hai bảng xuất hiện trong mệnh đề TỪ, các bước từ 1 đến 3 được áp dụng lặp đi lặp lại giữa kết quả của lần nối cuối cùng và bảng tiếp theo trong mệnh đề TỪ cho đến khi tất cả các bảng được xử lý.
WHERE: Bộ lọc WHERE được áp dụng cho VT3. Chỉ các hàng có <where_condition>
TRUE được chèn vào VT4.
NHÓM THEO: Các hàng từ VT4 được sắp xếp theo nhóm dựa trên danh sách cột được chỉ định trong mệnh đề GROUP BY. VT5 được tạo ra.
CUBE | ROLLUP: Siêu nhóm (nhóm các nhóm) được thêm vào các hàng từ VT5, tạo VT6.
HAVING: Bộ lọc HAVING được áp dụng cho VT6. Chỉ các nhóm có <having_condition>
TRUE được chèn vào VT7.
CHỌN: Danh sách CHỌN được xử lý, tạo VT8.
DISTINCT: Các hàng trùng lặp được xóa khỏi VT8. VT9 được tạo ra.
ORDER BY: Các hàng từ VT9 được sắp xếp theo danh sách cột được chỉ định trong mệnh đề ORDER BY. Một con trỏ được tạo ra (VC10).
TOP: Số lượng hoặc tỷ lệ phần trăm của các hàng được chỉ định từ đầu VC10. Bảng VT11 được tạo và trả lại cho người gọi.
Do đó, (INNER THAM GIA) BẬT sẽ lọc dữ liệu (số lượng dữ liệu của VT sẽ bị giảm ở đây) trước khi áp dụng mệnh đề WHERE. Các điều kiện nối tiếp theo sẽ được thực hiện với dữ liệu được lọc giúp cải thiện hiệu suất. Sau đó, chỉ điều kiện WHERE sẽ áp dụng điều kiện lọc.
(Áp dụng các câu lệnh có điều kiện trong ON / WHERE sẽ không tạo ra nhiều khác biệt trong một số trường hợp. Điều này phụ thuộc vào số lượng bảng bạn đã tham gia và số lượng hàng có sẵn trong mỗi bảng tham gia)