Bài tập: lấy dữ liệu
Bạn sẽ học được
- Chuyển một yêu cầu bằng tiếng Việt thành câu SQL theo từng bước.
- Dùng
SELECT,FROM,ORDER BYcùng nhau để hoàn thành bài luyện đầu tiên. - Đọc phản hồi của hệ thống chấm bài và biết sửa gì trước.
- Phân biệt "kết quả đúng dữ liệu" với "kết quả đúng định dạng đề yêu cầu".
- Tự kiểm tra bài làm bằng một bộ câu hỏi trước khi nộp.
Khái niệm cốt lõi
Bài luyện trên DataHọc chấm bằng cách so sánh bảng kết quả của bạn với bảng kết quả đúng: cùng số cột, cùng tên cột, cùng số dòng, cùng giá trị, và với một số bài là cùng thứ tự dòng. Vì vậy "chạy không lỗi" chưa đủ; kết quả phải khớp cả về nội dung lẫn hình thức.
Cách làm việc với mọi bài toán SQL, áp dụng được từ bài đầu tiên đến bài phỏng vấn:
- Xác định nguồn dữ liệu. Đề nhắc đến bảng nào? Ở đây là
customers. - Xác định cột cần trả về. Đề nói "tất cả các cột" — dấu hiệu dùng
*. Nếu đề liệt kê cột, viết đúng danh sách đó, đúng thứ tự. - Xác định bộ lọc. Có điều kiện nào không? "Mọi khách hàng" nghĩa là không có
WHERE. - Xác định thứ tự. "Sắp xếp theo
idtăng dần" →ORDER BY id(mặc địnhASC). - Xác định giới hạn. Có chữ "năm", "ba", "top" không? Không có → không dùng
LIMIT.
Năm câu hỏi này là checklist. Người mới thường nhảy thẳng vào viết SQL rồi sửa mò; người làm nghề đọc đề, gạch đầu dòng yêu cầu, rồi viết một lần.
Một điểm nữa: đề bài là hợp đồng, không phải gợi ý. Nếu đề nói sắp xếp theo id, đừng sắp xếp theo name dù kết quả nhìn "cũng ổn". Nếu đề nói tất cả các cột, đừng chỉ chọn ba cột bạn thấy cần. Hệ thống chấm không biết ý định của bạn; nó chỉ so bảng.
Trước khi nộp, hãy ước lượng số dòng rồi đối chiếu với kết quả. Bạn biết bảng customers có 12 dòng, nên kết quả đúng phải có 12 dòng. Nếu màn hình chỉ hiện 3 dòng, gần như chắc chắn bạn còn LIMIT từ lần thử trước; nếu hiện 40 dòng, có thể bạn đang truy vấn nhầm bảng hoặc kết quả bị nhân đôi do một phép ghép. Ước lượng trước — đối chiếu sau — là thói quen rẻ nhất để bắt lỗi, và sẽ càng giá trị khi bảng lên tới hàng triệu dòng.
Ví dụ chạy được
Đề bài Lấy toàn bộ khách hàng:
Bảng
customerschứa thông tin khách hàng. Hãy viết truy vấn trả về tất cả các cột của mọi khách hàng, sắp xếp theoidtăng dần.
Áp checklist:
| Câu hỏi | Trả lời | Thành phần SQL |
|---|---|---|
| Bảng nào? | customers | FROM customers |
| Cột nào? | Tất cả | SELECT * |
| Lọc gì? | Không | không có WHERE |
| Thứ tự? | id tăng dần | ORDER BY id |
| Giới hạn? | Không | không có LIMIT |
Ghép lại:
SELECT *
FROM customers
ORDER BY id;Kết quả có 12 dòng, bắt đầu bằng khách id = 1 (An Nguyễn) và kết thúc bằng id = 12 (Nga Lý). Nộp truy vấn này, bài luyện sẽ chấm đạt.
Ba lần thử thường gặp trước khi ra đáp án:
Lần 1 — quên sắp xếp:
SELECT * FROM customers;Dữ liệu đúng nhưng thứ tự dòng không được đảm bảo. Trên bộ dữ liệu nhỏ, kết quả có thể tình cờ đúng thứ tự; trên bảng lớn hoặc sau khi có UPDATE, thứ tự thay đổi. Bài chấm sẽ báo sai thứ tự hoặc chỉ đạt một phần.
Lần 2 — thừa LIMIT:
SELECT * FROM customers ORDER BY id LIMIT 10;Chỉ trả 10 trong 12 khách. Thiếu hai dòng, chấm sai. Lỗi này hay xảy ra vì bạn copy truy vấn thử nghiệm trước đó mà quên xoá LIMIT.
Lần 3 — đúng:
SELECT * FROM customers ORDER BY id;Mẹo đọc phản hồi: nếu hệ thống báo "thiếu dòng", kiểm tra WHERE và LIMIT. Nếu báo "sai thứ tự", kiểm tra ORDER BY. Nếu báo "sai cột", kiểm tra danh sách sau SELECT. Đừng đổi cả truy vấn khi chỉ một phần sai.
Thực hành
- Nộp đáp án ở trên cho bài Lấy toàn bộ khách hàng (
select-all-customers). - Làm thêm một biến thể không chấm điểm: lấy toàn bộ sản phẩm sắp xếp theo giá giảm dần. Viết
SELECT * FROM products ORDER BY price DESC;— bạn sẽ thấy sản phẩm đắt nhất đứng đầu. - Tự đặt đề và tự trả lời: "Lấy
namevàstockcủa mọi sản phẩm, sắp xếp theostocktăng dần." Viết ra giấy trước, rồi chạy thử để đối chiếu. Kỹ năng tự ra đề là cách nhanh nhất để kiểm tra mình đã hiểu bài.
Khi đã quen, hãy thử đọc kết quả và kể một câu chuyện: "Trong 12 khách, có 2 người chưa có email, thành phố tập trung ở Hà Nội và TP. Hồ Chí Minh". Đó chính là tư duy phân tích — sẽ được luyện ở chương 6.
Lỗi thường gặp
| Triệu chứng | Nguyên nhân | Cách sửa |
|---|---|---|
| Chấm báo thiếu dòng | Còn LIMIT hoặc thêm WHERE không có trong đề | Xoá LIMIT, kiểm tra điều kiện lọc |
| Chấm báo sai thứ tự | Thiếu ORDER BY hoặc dùng DESC nhầm | Thêm ORDER BY id (mặc định tăng dần) |
| Chấm báo sai cột | Chọn thiếu cột hoặc đặt bí danh ngoài yêu cầu | Đề nói "tất cả các cột" thì dùng * |
| Truy vấn chạy nhưng bảng kết quả trống | WHERE loại hết dòng, thường do so sánh chuỗi sai | Bỏ WHERE hoặc kiểm tra giá trị so sánh |
| Lỗi cú pháp ở dòng cuối | Quên ; hoặc dư dấu phẩy | Đọc lại từ dòng báo lỗi; bỏ dấu phẩy cuối |
Tóm tắt
- Đọc đề theo năm câu hỏi: bảng, cột, lọc, thứ tự, giới hạn.
- Đề bài là hợp đồng: đúng dữ liệu chưa đủ, phải đúng cả tên cột và thứ tự dòng khi đề yêu cầu.
- Bài Lấy toàn bộ khách hàng dùng
SELECT * FROM customers ORDER BY id;. - Đọc phản hồi chấm bài theo từng phần sai thay vì sửa cả truy vấn.
- Tự đặt đề nhỏ và tự trả lời là cách kiểm tra hiểu bài nhanh nhất.
Bạn đã hoàn thành chương đầu tiên: biết SQL là gì, đọc được cấu trúc bảng, viết SELECT với danh sách cột và bí danh. Chương tiếp theo thêm WHERE — nơi bắt đầu lọc dữ liệu thật sự.
Use ← → to move between lessons