50+ Bài tập SQL thực tế – Luyện truy vấn giỏi như chuyên gia
Tổng hợp 50+ bài tập SQL cơ bản đến nâng cao kèm lời giải chi tiết. Cùng MCI khám phá bí quyết luyện SQL nhanh, hiệu quả và áp dụng ngay vào công việc.
Nội dung bài viết
Bạn có biết rằng 80% kỹ sư dữ liệu, nhà phân tích, và developer sử dụng SQL mỗi ngày?
Thế nhưng phần lớn người học lại dừng ở “SELECT * FROM” mà không biết cách xử lý bài toán thực tế.
Nếu bạn đang tìm bài tập SQL có lời giải, kịch bản thực tế, và hướng dẫn dễ hiểu, thì bài viết này chính là thứ bạn cần. MCI đã tổng hợp 50+ bài tập SQL thực tế có lời giải, giúp bạn đi từ cơ bản đến chuyên sâu, và hiểu được SQL vận hành như thế nào trong doanh nghiệp.
1. SQL là gì? Vì sao học SQL là kỹ năng bắt buộc trong thời đại dữ liệu
SQL (Structured Query Language) là ngôn ngữ truy vấn dữ liệu – “ngôn ngữ chung” của mọi hệ thống cơ sở dữ liệu như MySQL, PostgreSQL, SQL Server hay Oracle.
Nếu Python là công cụ “phân tích dữ liệu”, thì SQL chính là chìa khóa mở kho dữ liệu để bạn trích xuất thông tin, tính toán và trực quan hóa.
Thực tế:
- 9/10 doanh nghiệp sử dụng SQL trong hệ thống dữ liệu nội bộ.
- Ngay cả AI như ChatGPT, Power BI hay Google Data Studio đều dựa vào SQL khi cần truy xuất dữ liệu lớn.

2. Học SQL bắt đầu từ đâu? – Đừng vội code, hãy hiểu cách dữ liệu vận hành
Trước khi nhảy vào bài tập, bạn cần hiểu 3 khái niệm nền tảng:
- Database (Cơ sở dữ liệu): nơi lưu trữ dữ liệu có cấu trúc (bảng, hàng, cột).
- Table (Bảng): giống như Excel, mỗi bảng chứa dữ liệu cho một chủ đề.
- Query (Truy vấn): lệnh bạn viết để “hỏi” hệ thống, ví dụ: “Cho tôi biết doanh thu tháng 10”.
Ví dụ cơ bản:
SELECT name, revenue
FROM customers
WHERE revenue > 100000;
→ Kết quả: Danh sách khách hàng có doanh thu > 100.000.
Xem thêm:
- Khóa học Database and SQL for Data Science
- Đăng ký học Combo SQL Level 1 & Level 2
- 3. Bộ bài tập SQL cơ bản – Nền móng cho mọi kỹ năng truy vấn
Nếu bạn mới bắt đầu, hãy luyện theo các nhóm bài tập sau để nắm chắc cấu trúc cơ bản.
3.1 Làm quen với SQL cơ bản – SELECT & WHERE
Bài 1: Hiển thị toàn bộ bảng nhân viên
→SELECT * FROM employees;
Bài 2: Lọc nhân viên làm việc tại phòng "Sales"
→SELECT name, department FROM employees WHERE department = 'Sales';
Bài 3: Tìm nhân viên có lương > 15 triệu
→SELECT name, salary FROM employees WHERE salary > 15000000;
Bài 4: Hiển thị khách hàng ở Hà Nội
→SELECT name, city FROM customers WHERE city = 'Hanoi';
Bài 5: Lấy 5 sản phẩm có giá cao nhất
→SELECT product_name, price FROM products ORDER BY price DESC LIMIT 5;
Ứng dụng thực tế: Báo cáo doanh thu theo vùng, lọc danh sách khách hàng tiềm năng.
3.2 Làm chủ sắp xếp, phân loại với ORDER BY, DISTINCT, LIMIT
Bài 6: Hiển thị tên khách hàng (không trùng lặp)
→SELECT DISTINCT customer_name FROM customers;
Bài 7: Lấy 10 khách hàng đầu tiên theo alphabet
→SELECT * FROM customers ORDER BY customer_name ASC LIMIT 10;
Bài 8: Lấy sản phẩm có giá thấp nhất
→SELECT product_name, price FROM products ORDER BY price ASC LIMIT 1;
3.3 Tổng hợp dữ liệu thông minh – GROUP BY & HAVING
Bài 9: Tính tổng lương theo phòng ban
→ SELECT department, SUM(salary) AS total_salary
FROM employees
GROUP BY department;
Bài 10: Tính lương trung bình từng phòng
→ SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department;
Bài 11: Tìm phòng có lương trung bình > 20 triệu
→ SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 20000000;
Bài 12: Đếm số nhân viên mỗi chức vụ
→ SELECT job_title, COUNT(*) AS total
FROM employees
GROUP BY job_title;
3.4 JOIN – Kết nối dữ liệu giữa các bảng
Bài 13: Liệt kê tên khách hàng và tổng giá trị đơn hàng
→ SELECT c.customer_name, SUM(o.amount) AS total_order
FROM customers c
JOIN orders o ON c.customer_id = o.customer_id
GROUP BY c.customer_name;
Bài 14: Tìm khách hàng chưa từng đặt hàng
→ SELECT c.customer_name
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id
WHERE o.order_id IS NULL;
Bài 15: Hiển thị sản phẩm và danh mục tương ứng
→ SELECT p.product_name, c.category_name
FROM products p
JOIN categories c ON p.category_id = c.category_id;
Bài 16: Lấy doanh thu mỗi nhân viên bán hàng
→ SELECT e.name, SUM(o.amount) AS total_sales
FROM employees e
JOIN orders o ON e.employee_id = o.sales_rep
GROUP BY e.name;

3.5 Subquery & CTE – SQL tư duy nhiều tầng
Bài 17: Tìm nhân viên có lương cao hơn trung bình công ty
→ SELECT name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);
Bài 18: Doanh thu theo tháng bằng CTE
→ WITH monthly_sales AS (
SELECT MONTH(order_date) AS month, SUM(amount) AS revenue
FROM orders
GROUP BY MONTH(order_date)
)
SELECT * FROM monthly_sales WHERE revenue > 5000000;
Bài 19: Tìm sản phẩm không bán trong 90 ngày gần nhất
→ SELECT product_name
FROM products
WHERE product_id NOT IN (
SELECT DISTINCT product_id FROM orders
WHERE order_date >= DATE_SUB(CURDATE(), INTERVAL 90 DAY)
);
3.6 SQL thực tế trong doanh nghiệp – Case Study
Bài 20: Tính doanh thu theo tháng
→ SELECT MONTH(order_date) AS month, SUM(amount) AS revenue
FROM orders
GROUP BY MONTH(order_date);
Bài 21: Tính tỷ lệ chuyển đổi quảng cáo
→ SELECT campaign_name, SUM(conversions)/SUM(clicks)*100 AS conversion_rate
FROM ads
GROUP BY campaign_name;
Bài 22: Tính lợi nhuận ròng theo sản phẩm
→ SELECT product_name, SUM(revenue - cost) AS net_profit
FROM products
GROUP BY product_name;
Bài 23: Tính doanh thu trung bình mỗi khách hàng
→ SELECT customer_id, AVG(amount) AS avg_order_value
FROM orders
GROUP BY customer_id;
Bài 24: Tính ROAS (Return On Ad Spend)
→ SELECT campaign, SUM(revenue)/SUM(cost) AS ROAS
FROM ads
GROUP BY campaign;
3.7 Window Function – Phân tích nâng cao
Bài 25: Phân hạng doanh thu nhân viên trong team
→ SELECT name, department,
RANK() OVER (PARTITION BY department ORDER BY SUM(amount) DESC) AS rank_in_team
FROM employees e
JOIN orders o ON e.employee_id = o.sales_rep
GROUP BY name, department;
Bài 26: Tính doanh thu cộng dồn (cumulative)
→ SELECT order_date, SUM(amount) OVER (ORDER BY order_date) AS total_revenue
FROM orders;
Bài 27: Trung bình trượt 3 tháng gần nhất
→ SELECT order_date, AVG(amount) OVER (ORDER BY order_date ROWS 3 PRECEDING) AS avg_3months
FROM orders;

4. Bộ bài tập nâng cao – Tự thử thách bản thân
Các bài dưới đây bạn nên tự viết và tối ưu truy vấn:
- Tìm top 3 khách hàng có tổng doanh thu cao nhất trong năm.
- Tính phần trăm khách quay lại mua hàng (Repeat Rate).
- Xác định khách hàng chưa mua hàng 6 tháng.
- Đếm số sản phẩm tồn kho trên 90 ngày.
- Phân tích tăng trưởng doanh thu theo quý.
- Xác định nhân viên có doanh số cao gấp 2 lần trung bình phòng ban.
- Tạo bảng tổng hợp tháng – doanh thu – khách hàng mới.
- Đếm số ngày không có đơn hàng.
- Tính doanh thu trung bình rolling 7 ngày.
- Báo cáo sản phẩm best-seller từng tháng.
- Phân tích hiệu quả kênh marketing đa nền tảng.
- Tính tỷ lệ hủy đơn hàng.
- So sánh doanh thu giữa 2 năm gần nhất.
- Xác định sản phẩm mang lại lợi nhuận cao nhất.
- Đếm số khách hàng mua hàng nhiều hơn 5 lần.
- Báo cáo lợi nhuận theo vùng.
- Tính doanh số trung bình mỗi nhân viên.
- Phân hạng khách hàng theo tổng chi tiêu (VIP – Regular – New).
- Tính tốc độ tăng trưởng doanh thu hằng tháng.
- Tổng hợp doanh số theo quốc gia.
- Xác định ngày có doanh thu cao nhất lịch sử.
- Tính số khách hàng “ngủ đông” > 12 tháng.
- Tạo dashboard SQL tổng hợp cho Ban Giám đốc.
5. 10 lỗi phổ biến khi làm bài tập SQL
| Lỗi thường gặp | Cách khắc phục |
| Viết SELECT * quá nhiều | Chỉ chọn cột cần thiết để tăng tốc độ truy vấn |
| Quên điều kiện JOIN | Luôn xác định khóa chung (foreign key) |
| GROUP BY sai cột | Nhớ rằng mọi cột không nằm trong hàm tổng hợp phải có trong GROUP BY |
| Nhầm INNER JOIN và LEFT JOIN | Học bằng sơ đồ Venn – dễ hiểu hơn code |
| Dữ liệu NULL làm sai kết quả | Dùng COALESCE() để xử lý giá trị rỗng |
| Lạm dụng Subquery | Hãy thử CTE hoặc JOIN thay thế |
| Thiếu chỉ mục (index) | Khi xử lý dữ liệu lớn, thêm index giúp query nhanh hơn |
| Không kiểm tra dữ liệu gốc | Trước khi debug query, hãy xem cấu trúc bảng |
| Không đặt bí danh (alias) | Sử dụng AS giúp code dễ đọc và tái sử dụng |
| Không test với dataset nhỏ | Test trước với mẫu nhỏ để tránh lỗi logic |
Tự học SQL giúp bạn hiểu cú pháp nhưng học cùng mentor tại MCI Việt Nam giúp bạn làm chủ tư duy dữ liệu thực chiến.
Khóa “Phân tích dữ liệu và SQL thực chiến” tại MCI được thiết kế cho cả người mới và người đang làm trong lĩnh vực data.
Bạn sẽ:
- Học qua hơn 100 bài tập SQL có lời giải thực tế.
- Làm dự án kết hợp Power BI + SQL + Python.
- Được mentor hỗ trợ 1:1, feedback từng bài.
- Có chứng chỉ và portfolio để ứng tuyển Data Analyst.
Đăng ký ngay tại mcivietnam.com để nhận tài liệu “50+ Bài tập SQL thực chiến” và ưu đãi học phí sớm nhất.
Thông tin liên hệ:
- Website: https://www.mcivietnam.com/
- Tư vấn khóa học: 0352.433.233
- Tư vấn đào tạo doanh nghiệp: 0352.433.233
- CSKH: cskh@mcivietnam.com
Các khóa học
- Mastering AWS : From Basics to Applications Specialized
- Data Engineer Track Specialized
- Combo Data Engineering Professional Hot
- AI & DASHBOARD – CHỈ 990K Hot
- Combo Python Level 1 & Level 2 Bestseller
- Business Intelligence Track Hot
- Data Science Track Bestseller
- Data Analyst Professional (Data Analyst with Python Track) Bestseller
- RPA UiPath Nâng Cao: Chiến Thuật Automation Cho Chuyên Gia Specialized
- RPA UiPath cho Người Mới Bắt Đầu: Thành Thạo Automation Chỉ Trong 1 Ngày Specialized
- Business Analyst Fast Track Bestseller
- Business Analyst Bestseller
Đăng ký tư vấn khóa học
*Vui lòng nhập số điện thoại của bạn
*Vui lòng nhập họ tên của bạn
*Vui lòng chọn giới tính
*Vui lòng chọn 1 trường
