Việc biết được thứ tự thực hiện trước sau của các thành phần trong câu query sẽ giúp chúng ta rất lớn trong quá trình design ra câu query sao cho tối ưu (đẹp, ngắn và performance tốt). Dưới đây là thứ tự thực hiện của các thành phần trong một câu truy vấn SQL.
- FROM
- JOIN
- WHERE
- GROUP BY
- HAVING
- SELECT
- DISTINCT
- ORDER BY
- OFFSET
- LIMIT/FETCH/TOP
1. FROM
Mệnh đề FROM trong SQL được dùng để liệt kê các bảng cần thiết sử dụng trong truy vấn. Chính vì vậy khi thực hiện SELECT thì nó phải biết SELECT từ đâu, nên đương nhiên FROM nó sẽ phải chạy trước để xác định được những bảng cần dùng đến.
2. JOIN
Mệnh đề JOIN được dùng để kết hợp từ hai hay nhiều bảng trong một Database. Các loại JOIN gồm có: INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN, SELF JOIN.
Cú pháp:
FROM table1
[ { INNER JOIN
| LEFT OUTER JOIN
| RIGHT OUTER JOIN
| FULL OUTER JOIN } table2
ON table1.column1 = table2.column1 ]
Lưu ý:
- Thường xuyên sử dụng INNER JOIN thay vì subquery để nối các bảng. INNER JOIN thường có hiệu suất tốt hơn.
- Luôn đặt JOIN từ các bảng lớn nhất đến các bảng nhỏ nhất
3. WHERE
Đây là mệnh đề được dùng để lọc kết quả bởi các điều kiện, kết quả trả về phải đáp ứng các điều kiện trong mệnh đề này. Khi đã có các table đích để lấy dữ liệu, thì mới đến WHERE để lọc lại dữ liệu đó.
Cú pháp:
SELECT column1, column2, columnN
FROM table_name
WHERE [conditions]
Lưu ý:
- Đặt điều kiện lọc sớm nhất có thể trong phần WHERE để giảm số lượng hàng cần xử lý.
- Tránh dùng subquery trong mệnh đề WHERE
4. GROUP BY
Mệnh đề GROUP BY được sử dụng để kết hợp với câu lệnh SELECT để sắp xếp dữ liệu giống nhau thành các nhóm, nó tuân theo mệnh đề WHERE và đứng trước ORDER BY.
Ví dụ:
SELECT CustomerID, SUM(Amount) AS TotalAmount
FROM Orders
GROUP BY CustomerID;
5. HAVING
Mệnh đề này cho phép bạn khả năng để xác định các điều kiện để lọc nhóm kết quả nào sẽ xuất hiện trong kết quả cuối cùng.
Ví dụ:
SELECT department, AVG(salary) as avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 60000
Lưu ý:
Dưới đây là một số lý do mà người ta thường khuyến cáo cẩn thận khi sử dụng mệnh đề HAVING trong truy vấn dữ liệu SQL:
- Hiệu Suất:
- Mệnh đề HAVING thường có thể tạo ra hiệu suất kém hơn so với mệnh đề WHERE. Khi bạn sử dụng HAVING để lọc dữ liệu sau khi đã nhóm, có thể tạo ra nhiều dòng dữ liệu tạm thời trước khi lọc, điều này có thể ảnh hưởng đến hiệu suất.
- Độ Phức Tạp Cao:
- Sử dụng HAVING có thể làm tăng độ phức tạp của truy vấn, đặc biệt là khi bạn có nhiều điều kiện lọc phức tạp hoặc khi sử dụng các hàm tính toán trong điều kiện.
- Thứ Tự Thực Hiện Câu Lệnh:
- Trong một số trường hợp, thứ tự thực hiện câu lệnh có thể khác với mong đợi của bạn, điều này có thể tạo ra kết quả không như bạn dự kiến. Việc hiểu rõ về thứ tự thực hiện câu lệnh SQL là quan trọng để tránh những kết quả không mong muốn.
- Khả Năng Nhầm Lẫn:
- Sử dụng HAVING có thể tạo ra các câu lệnh phức tạp hơn và có thể dễ gây hiểu lầm. Khi có thể, nếu bạn chỉ cần lọc dữ liệu trước khi nhóm, sử dụng WHERE sẽ là lựa chọn đơn giản và dễ hiểu hơn.
- HAVING chỉ được dùng để lọc Aggregate function, không được dùng để lọc bản ghi từ bảng
6. SELECT
Dùng để lấy kết quả từ một hay nhiều bảng. Sau khi các truy vấn thực hiện đến các bảng cần sử dụng, các điều kiện lấy giữ liệu, nhóm các dữ liệu, thì SELECT sẽ quyết định lấy về những thông tin nào (các cột) trong những bảng nào.
Ví dụ:
SELECT b.Id, b.Name, t.TypeName
FROM Books b
INNER JOIN Type t
ON b.TypeId = t.Id
Ví trụ trên SELECT sẽ lấy ra các thông tin từ bảng Books là: Id, Name và thông tin từ bảng Type là: TypeName
SELECT sẽ kết hợp với các mệnh đề khác để trở thành một câu truy vấn hoàn chỉnh, tuỳ thuộc vào yêu cầu lấy dữ liệu như thế nào.
Lưu ý:
- Chọn Đúng Cột:
- Chỉ chọn những cột cần thiết trong phần SELECT thay vì chọn tất cả các cột. Việc giảm số lượng cột giúp giảm tải và tăng tốc độ truy vấn.
- Tránh Sử Dụng SELECT *:
- Tránh sử dụng SELECT * nếu có thể. Việc chọn tất cả các cột có thể tạo ra nhiều dữ liệu không cần thiết, ảnh hưởng đến hiệu suất.
7. DISTINCT
Mệnh đề Distinct được dùng kết hợp với SELECT để loại bỏ các bản ghi trùng lặp, chỉ lấy một bản ghi duy nhất trong kết quả trả về.
Ví dụ:
SELECT DISTINCT b.Id, b.Name, b.Price, t.TypeName
FROM Books b
INNER JOIN Type t
ON b.TypeId = t.Id
Mục đích sử dụng của nó như trên, nên hiển nhiên nó phải chạy sau SELECT rồi, phải SELECT ra được data thì mới có data để mà xét trùng đúng không?
Lưu ý:
- Hạn Chế Sử Dụng DISTINCT: Sử dụng DISTINCT một cách cẩn thận, vì nó có thể tăng thời gian thực hiện. Nếu có thể, cân nhắc sử dụng các cách khác để tránh sử dụng DISTINCT.
8. ORDER BY
Mệnh đề này dùng để sắp xếp dữ liệu theo thứ tự tăng dần hoặc giảm dần dựa trên một hoặc nhiều cột. Lệnh ASC được sử dụng để sắp xếp tăng giần, còn lệnh DESC được sử dụng để sắp xếp theo giảm dần. Mặc định ASC nếu không chỉ rõ.
Khi có đủ dữ liệu trả về thì đúng theo như yêu cầu đặt ra, khi đó chúng ta mới sắp xếp lại trật tự của chúng.
9. OFFSET
OFFSET là một mệnh đề trong SQL được sử dụng để xác định số lượng dòng bắt đầu từ đâu kết quả của truy vấn sẽ được trả về. Nó thường được sử dụng cùng với LIMIT để xác định một phạm vi con của kết quả.
Ví dụ:
SELECT column1, column2, ...
FROM table_name
ORDER BY column1, column2, ...
LIMIT number_of_rows OFFSET offset_value;
- number_of_rows: Số lượng dòng bạn muốn lấy.
- offset_value: Số lượng dòng mà bạn muốn bỏ qua từ đầu kết quả.
10. LIMIT/FETCH/TOP
Mệnh đề dùng để lấy ra N bản ghi hoặc X phần trăm bản ghi từ kết quả trả về.
Dùng để giới hạn kết quả trả ra, tuỳ vào platform mà ta dùng mệnh đề phù hợp.
SQL Server / MS Access Syntax:
SELECT TOP number|percent column_name(s)
FROM table_name
WHERE condition;
MySQL Syntax:
SELECT column_name(s)
FROM table_name
WHERE condition
LIMIT number;
– Xem ngay Lộ trình học Data Analyst chuyển ngành thành công trong vòng 6 tháng
– Xem ngay Lộ trình học Marketing Automation & Analytics Coaching 1 on 1 để upgrade kỹ năng phân tích cho Marketer
– Tham gia Vietnam Data Analyst Forum – #1 Informative Group để học hỏi và chia sẻ kiến thức về Data Analytics
– Cập nhật lịch khai giảng, chương trình ưu đãi và nhận tư vấn chuyển ngành miễn phí tại Data Coaching 1 on 1 – UniGap