SQL Query là một câu truy vấn yêu cầu dữ liệu từ DBMS.
Thứ tự thực thi các từ khóa ở trong một câu truy vấn SQL:
FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> DISTINCT -> ORDER BY -> LIMIT
Quá trình thực thi câu truy vấn SQL sẽ bao gồm ba giai đoạn:
- Row filtering lần 1: thực thi các mệnh đề
FROM
,WHERE
,GROUP BY
vàHAVING
. - Column filtering: lọc các cột bằng cách thực thi mệnh đề
SELECT
. - Row filtering lần 2: thực thi các mệnh đề còn lại.
Giả sử ta có một bảng thông tin sinh viên:
id_ | name_ | marks | section_ |
---|---|---|---|
1 | Julia | 88 | A |
2 | Samantha | 68 | B |
3 | Maria | 10 | C |
4 | Scarlet | 78 | A |
5 | Ashley | 63 | B |
6 | Abir | 95 | D |
7 | Jane | 81 | A |
8 | Jahid | 25 | C |
9 | Sohel | 90 | D |
10 | Rahim | 80 | A |
11 | Karim | 81 | B |
12 | Abdullah | 92 | D |
Và ta gọi câu truy vấn sau:
SELECT section_, sum(marks)
FROM students
WHERE id_ < 10
GROUP BY section_
HAVING sum(marks) > 100
ORDER BY section_
LIMIT 2;
Kết quả của câu truy vấn:
section_ | sum |
---|---|
A | 247 |
B | 131 |
Các bước thực hiện:
FROM, WHERE Clause Execution
Câu truy vấn FROM students WHERE id_ < 10
sẽ loại bỏ các dòng có id_
lớn hơn hoặc bằng 10
.
Bảng dữ liệu trở thành:
id_ | name_ | marks | section_ |
---|---|---|---|
1 | Julia | 88 | A |
2 | Samantha | 68 | B |
3 | Maria | 10 | C |
4 | Scarlet | 78 | A |
5 | Ashley | 63 | B |
6 | Abir | 95 | D |
7 | Jane | 81 | A |
8 | Jahid | 25 | C |
9 | Sohel | 90 | D |
GROUP BY Clause Execution
Câu truy vấn GROUP BY section_
sẽ gom nhóm các dòng dữ liệu dựa trên thuộc tính section_
.
Bảng dữ liệu khi đó có thể có dạng như sau:
id_ | name_ | marks | section_ |
---|---|---|---|
9 | Sohel | 90 | D |
6 | Abir | 95 | D |
1 | Julia | 88 | A |
4 | Scarlet | 78 | A |
7 | Jane | 81 | A |
2 | Samantha | 68 | B |
5 | Ashley | 63 | B |
3 | Maria | 10 | C |
8 | Jahid | 25 | C |
HAVING Clause Execution
Câu lệnh having sum(marks) > 100
sẽ loại bỏ những nhóm mà có tổng điểm nhỏ hơn hoặc bằng 100
. Tổng điểm của các nhóm là:
D
: 185A
: 247B
: 131C
: 35
Do tổng điểm của nhóm C
nhỏ hơn 100
nên nó sẽ bị loại bỏ:
id_ | name_ | marks | section_ |
---|---|---|---|
9 | Sohel | 90 | D |
6 | Abir | 95 | D |
1 | Julia | 88 | A |
4 | Scarlet | 78 | A |
7 | Jane | 81 | A |
2 | Samantha | 68 | B |
5 | Ashley | 63 | B |
SELECT Clause Execution
Câu lệnh SELECT section_, sum(marks)
sẽ lọc ra các cột cần hiển thị:
section_ | sum |
---|---|
D | 185 |
A | 245 |
B | 131 |
ORDER BY Clause Execution
Câu lệnh ORDER BY section_
sẽ sắp xếp các dòng theo thứ tự tăng dần:
section_ | sum |
---|---|
A | 245 |
B | 131 |
D | 185 |
LIMIT Clause Execution
Câu lệnh LIMIT 2;
chỉ in ra hai dòng đầu tiên:
section_ | sum |
---|---|
A | 245 |
B | 131 |