
Dù đã nắm được các kiến thức cơ bản về ngôn ngữ SQL. Nhưng các bạn vẫn gặp rất nhiều khó khăn trong quá trình xây dựng câu truy vấn của mình phải không?
Điều kiện cần để câu truy vấn trở nên đơn giản
Để dễ dàng làm việc với CSDL nói chung. Chúng ta cần đáp ứng một số điều kiện dưới đây. Nếu bạn cảm thấy mình còn một chút bối rối. Hãy ôn tập lại chúng.
Kiến thức toán
Toán là nền tảng của phần lớn các lĩnh vực CNTT. Do đó, chúng ta hãy cố vượt qua rào cản này để thành công hơn trên con đường của chúng ta. Với CSDL chúng ta cũng không cần quá nhiều toán. Nhưng các bạn cần nắm vững 2 chủ đề:
- Mệnh đề và các phép toán logic
- Tập hợp và các phép toán trên tập hợp
Chúng ta cũng không cần đi quá sâu và 2 chủ đề này. Nếu các bạn còn chút phân vân. Chúng ta có thể ôn tập toán một xíu.
Các cú pháp cơ bản
Chắc chắn rồi, các cú pháp cơ bản là điều kiện tiên quyết. Để bạn có thể sử dụng thuần thục SQL cũng như tìm ra các giải pháp tốt nhất cho bài toán của mình.
Thứ tự thực hiện trong câu truy vấn
Độ ưu tiên hay thứ tự thực hiện các mệnh đề, các toán tử trong câu truy vấn cũng là một yếu tố rất quan trọng. Ví dụ, trong một biểu thức 3 x (2 + 5). Chúng ta có thể làm tốt các phép tính nhưng không rõ về thứ tự các phép toán. Kết quả chúng ta nhận được cũng sẽ bị sai lệch.
Cấu trúc của CSDL
Đây chính là yếu tố cực kỳ quan trọng. Trước khi bắt đầu với bất kỳ một CSDL nào. Chúng ta cũng cần phải tìm hiểu về nó. Tối thiểu chúng ta phải nắm được một số thông tin cơ bản như:
- Mục đích chính của CSDL
- Số lượng bảng
- Cấu trúc của từng bảng
- Mối liên hệ giữa các bảng
Phương pháp xây dựng câu truy vấn
Cũng như giải một bài toán. Chúng ta có rất nhiều phương pháp để đi đến đáp án cuối cùng. Đây là một phương pháp khá cơ bản mình gợi ý cho các bạn. Tuy nhiên, bạn có thể xây dựng một phương pháp khác tốt hơn cho riêng mình.
Ý tưởng của phương pháp này dựa trên thứ tự thực hiện các mệnh đề. Mình tin rằng có nhiều bạn vẫn lầm tưởng. Câu truy vấn của chúng ta được thực hiện từ trên xuống. Nghĩa là mệnh đề nào viết trước thì thực thi trước. Việc lầm tưởng này làm các bạn khó hình dung và xây dựng câu truy vấn của mình.
Dưới đây mới thực sự là thứ tự các mệnh đề được thực hiện trong một câu truy vấn.
- FROM (JOIN)
- WHERE
- GROUP BY
- HAVING
- SELECT
- DISTINCT
- LIMIT / OFFSET
- …
Dựa trên thứ tự này. Phương pháp xây dựng câu truy vấn của chúng ta như sau:
- Tìm các nguồn (bảng) chứa đầy đủ thông tin chúng ta cần.
- Xác định điều kiện để trích xuất dữ liệu.
- Thực hiện các thao tác gom nhóm, các hàm tiện ích lên dữ liệu để xử lý dữ liệu.
- Rút trích dữ liệu cần thiết.
- Xử lý dữ liệu trả về.
Một vài ví dụ
Trong phần ví dụ này, mình cũng sử dụng CSDL Chinook. Nếu bạn chưa biết về nó, hãy xem lại bài viết CSDL mẫu.
Liệt kê tên của tất cả nhân viên
Bước 1: Xác định nguồn dữ liệu. Dựa trên yêu cầu và kiến thức về CSDL. Mình xác định toàn bộ thông tin chúng ta cần chỉ nằm trên bảng ‘Employee’. Lúc này, để đơn giản, chúng ta sẽ tạm thời bỏ qua không quan tâm đến mệnh đề SELECT. Nhưng tránh lỗi không sử dụng được các tiện ích trong SSMS. Mình sẽ để tạm SELECT *. Câu truy vấn của chúng ta lúc này:
1 2 |
SELECT * FROM Employee |
Bước 2: Trong yêu cầu của chúng ta không cần lọc, gom nhóm hay thao tác gì hết. Chúng ta sẽ quay lại bước rút trích dữ liệu. Lúc này, câu truy vấn được cập nhật:
1 2 |
SELECT FirstName, LastName FROM Employee |
Thử execute, kết quả thu về đã đúng như yêu cầu của đề bài.
Tuy nhiên, mình cảm thấy chưa hài lòng lắm. Mình sẽ thực hiện bước cuối cùng. Xử dụng hàm tiện ích để xử lý dữ liệu đầu ra:
Bước 3: Xử lý dữ liệu trả về.
1 2 |
SELECT CONCAT(FirstName, ' ',LastName) AS FullName FROM Employee |
Lúc này, dữ liệu trả về của mình đã được cập nhật và có vẻ cấu trúc đã đẹp hơn.
Liệt kê tất cả các track thuộc genre ‘Rock’
Bước 1: Xác định nguồn dữ liệu. Để lấy đủ thông tin, chúng ta sẽ cần truy vấn tới 2 bảng Track và Genre.
1 2 3 |
SELECT * FROM Track INNER JOIN Genre ON Track.GenreId = Genre. GenreId |
Thực thi thử và phân tích kết quả. Chúng ta đã thấy tên thể loại đã xuất hiện. Vậy chúng ta đã đi đúng hướng. Tiếp tục thực hiện bước 2.
Bước 2: Thêm điều kiện để lọc dữ liệu.
1 2 3 4 |
SELECT * FROM Track INNER JOIN Genre ON Track.GenreId = Genre. GenreId WHERE Genre.Name = 'Rock' |
Bước 3: Rút trích dữ liệu. Mình sẽ rút ra thông tin TrackId, Name (Track), Composer và Name (Genre).
1 2 3 4 5 6 7 8 |
SELECT Track.TrackId, Track.Name AS Track, Track.Composer, Genre.Name AS Genre FROM Track INNER JOIN Genre ON Track.GenreId = Genre. GenreId WHERE Genre.Name = 'Rock' |
Sau khi thực thi thử. Mình thấy dữ liệu trả về đã rất ổn. Tuy nhiên, còn lộn xộn một ít. Do đó, mình sẽ sử dụng thêm mệnh đề ORDER BY để sắp xếp lại.
Bước 4: Xử lý kết quả trả về
1 2 3 4 5 6 7 8 9 |
SELECT Track.TrackId, Track.Name AS Track, Track.Composer, Genre.Name AS Genre FROM Track INNER JOIN Genre ON Track.GenreId = Genre. GenreId WHERE Genre.Name = 'Rock' ORDER BY Track.Name |
Và đây là một phần kết quả trả về của chúng ta.
Liệt kê các composer có trên 5 tracks
Bước 1: Dữ liệu nằm toàn bộ trên bảng Track.
1 2 |
SELECT * FROM Track |
Bước 2: Khi thực hiện thử câu truy vấn bước 1. Mình thấy có rất nhiều dòng dữ liệu có composer với giá trị NULL. Do đó, mình sẽ thêm điều kiệu loại bỏ những dòng dữ liệu này.
1 2 3 |
SELECT * FROM Track WHERE Composer IS NOT NULL |
Bước 3: Trong trường hợp này, mình cần thực hiện gom nhóm và đếm dữ liệu. Do khi sử dụng mệnh đề GROUP BY, sẽ có một số điều kiện ràng buộc nên mình thay đổi một chút ở mệnh đề SELECT.
1 2 3 4 |
SELECT Composer FROM Track WHERE Composer IS NOT NULL GROUP BY Composer |
Bước 4: Rút trích dữ liệu.
1 2 3 4 |
SELECT Composer, COUNT(*) FROM Track WHERE Composer IS NOT NULL GROUP BY Composer |
Sau bước này, chúng ta đã nhận được tên Composer và số lượng track của họ. Tuy nhiên, đề yêu cầu chỉ hiển thị composer có tracks > 5. Do đó, chúng ta thực hiện thêm bước 5.
Bước 5: Xử lý dữ liệu trả về bằng mệnh đề HAVING. Với mệnh đề HAVING, chúng ta sẽ giới hạn được kết quả của mệnh đề GROUP BY.
1 2 3 4 5 |
SELECT Composer, COUNT(*) FROM Track WHERE Composer IS NOT NULL GROUP BY Composer HAVING COUNT(*) > 5 |
Và đây là kết quả cuối cùng của chúng ta. Lúc này, các bạn có thể làm thêm bước 5′ thêm mệnh đề ORDER BY hay TOP, DISTINCT để tiếp tục xử lý dữ liệu.