Thứ tự thực hiện các mệnh đề trong câu truy vấn SQL

Tram Ho

SQL được xem là một ngôn ngữ lập trình mang tính lừa bịp khá cao. Rất nhiều developers dành rất nhiều thời gian chỉ làm việc với các thao tác CRUD và các truy vấn khá đơn giản. Điều đó tạo ra xu hướng rằng họ đủ khả năng làm chủ SQL và làm giảm đi động lực tìm hiểu sâu hơn về SQL trong khi SQL thực sự khá khó để nắm bắt.

Một điều mà khá nhiều người bỏ qua khi xem xét một câu truy vấn SQL đó là thứ tự thực hiện các mệnh đề trong câu truy vấn đó. Nó thực sự quan trong bởi nó giúp ta hiểu rõ hơn về cách câu truy vấn đó thực hiện đối với dữ liệu.

Một câu truy vấn cơ bản thường có dạng như sau

Truy vấn này được viết theo trình tự dễ đọc như sau lấy cái gì (SELECT) ở đâu (FROM) với điều kiện gì (WHERE), … Nhưng khi thực hiện nó sẽ thực hiện theo trình tự dưới đây

1. Thực thi mệnh đề FROM

Thực thi mệnh đề FROM và khởi tạo bảng kết quả làm việc. Bảng kết quả này có thể là một bảng đơn hoặc kết quả của một vài bảng khác thông qua phép JOIN nhưng kết quả cuối cùng của nó sẽ luôn là 1 bảng.

2. Thực hiện mệnh đề WHERE (nếu có)

Trong một câu truy vấn không nhất thiết lúc nào cũng phải có mệnh đề WHERE. Nhưng khi có mệnh đề WHERE nó sẽ thực thi ngay sau mệnh đề FROM. Mệnh đề WHERE sẽ áp dụng điều kiện tìm kiếm <search condition> cho từng hàng của bảng kết quả từ mệnh đề FROM.
Các hàng được kiểm tra (thông qua <search condition>) nếu trả về TRUE sẽ được giữ lại ở bảng kết quả, còn trả về FALSE, hoặc UNKNOWN sẽ bị loại bỏ.

Nếu có mệnh đề GROUP BY <nhóm danh sách cột>, hãy thực hiện nó tiếp theo. Nó sử dụng bảng làm việc mệnh đề TỪ và WHERE và chia các hàng này thành các nhóm trong đó các cột trong danh sách <nhóm nhóm> đều có cùng một giá trị. Các NULL được đối xử như thể tất cả đều bằng nhau và tạo thành nhóm riêng của họ. Mỗi nhóm sau đó được giảm xuống một hàng trong bảng kết quả mới thay thế cho hàng cũ

3. Thực hiện mệnh đề GROUP BY (nếu có)

Nếu có mệnh đề GROUP BY trong câu truy vấn, nó sẽ thực hiện ngay sau mệnh đề WHERE. Nó sử dụng bảng kết quả từ mệnh đề WHERE, sau đó chia các hàng thành các nhóm mà trong đó các cột trong danh sách <nhóm nhóm> đều có cùng một giá trị. Các NULL được đối xử như thể tất cả đều bằng nhau và tạo thành nhóm riêng của chúng.

4. Thực hiện mệnh đề HAVING (nếu có)

Mệnh đề HAVING sẽ áp dụng <group condition> cho từng nhóm. Các nhóm kiểm tra TRUE được giữ lại; các nhóm kiểm tra FALSEor UNKNOWN sẽ bị xóa.

5. Cuối cùng là mệnh đề SELECT

Cuối cùng, áp dụng mệnh đề SELECT cho bảng kết quả. Nếu một cột không xuất hiện trong <danh sách biểu thức>, nó sẽ bị loại khỏi kết quả cuối cùng. Biểu thức có thể là hằng hoặc tên cột hoặc chúng có thể là các phép tính được tạo từ các hằng, cột, hàm và các truy vấn.

Trên đây là thứ tự thực hiện một truy vấn đơn giản không có subquery. Trong TH có subquery nó sẽ thực hiện subquery trong cùng trước và cũng theo thứ tự trên và kết quả của 1 subquery cũng là 1 bảng. Ngoài ra một câu truy vấn khi đưa vào chương trình quản lý CSDL quan hệ cũng được tự động tối ưu do đó truy vấn đưa vào và truy vấn thực hiện cũng có thể khác nhau để tối ưu.

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo