🎯 Mục tiêu bài Quiz
Kiểm tra kiến thức của bạn qua các câu hỏi trắc nghiệm và bài tập thực hành!
✅ 18 câu hỏi trắc nghiệm (6 phần)
✅ 3 bài tập SQL viết truy vấn hoàn chỉnh
✅ Yêu cầu: Hoàn thành bài 1-10
Thời gian: 30 phút | Độ khó: Tổng hợp | Đạt yêu cầu: ≥ 13/18 câu đúng
| Phần | Chủ đề | Số câu |
|---|---|---|
| 1 | SELECT cơ bản (WHERE, ORDER BY) | 3 |
| 2 | Aggregate Functions (COUNT, SUM, AVG, GROUP BY, HAVING) | 3 |
| 3 | JOINs (INNER, LEFT, RIGHT, FULL, CROSS, SELF) | 3 |
| 4 | Subqueries và CTEs | 3 |
| 5 | Window Functions (ROW_NUMBER, RANK, LAG, LEAD, NTILE) | 3 |
| 6 | Optimization và Advanced (CASE WHEN, Views, Indexes, Stored Procedures) | 3 |
Phần 1: SELECT cơ bản
Phần 2: Aggregate Functions
Phần 3: JOINs
Phần 4: Subqueries & CTEs
Phần 5: Window Functions
Phần 6: Optimization & Advanced
Phần 7: Bài tập SQL
Bài tập 1: Phân tích doanh thu theo danh mục sản phẩm
Cho bảng products và order_items:
1-- Bảng products2CREATE TABLE products (3 product_id INT PRIMARY KEY,4 product_name VARCHAR(100),5 category VARCHAR(50),6 price DECIMAL(10,2)7);89INSERT INTO products VALUES10(1, 'Laptop Pro', 'Electronics', 25000000),11(2, 'Wireless Mouse', 'Electronics', 350000),12(3, 'SQL Mastery Book', 'Books', 250000),13(4, 'Data Science Book', 'Books', 300000),14(5, 'Office Chair', 'Furniture', 3500000);1516-- Bảng order_items17CREATE TABLE order_items (18 order_id INT,19 product_id INT,20 quantity INT,21 order_date DATE22);2324INSERT INTO order_items VALUES25(1, 1, 2, '2025-01-15'),26(2, 2, 5, '2025-01-20'),27(3, 3, 10, '2025-02-01'),28(4, 1, 1, '2025-02-10'),29(5, 4, 8, '2025-02-15'),30(6, 5, 3, '2025-03-01'),31(7, 2, 4, '2025-03-10'),32(8, 3, 6, '2025-03-15');Yêu cầu: Viết truy vấn tính tổng doanh thu và số lượng đơn hàng cho mỗi danh mục sản phẩm. Sắp xếp theo doanh thu giảm dần. Chỉ hiển thị danh mục có doanh thu trên 1.000.000 VNĐ.
Kết quả mong đợi:
| category | total_orders | total_revenue |
|---|---|---|
| Electronics | 12 | 77.750.000 |
| Furniture | 3 | 10.500.000 |
| Books | 24 | 4.900.000 |
1SELECT2 p.category,3 SUM(oi.quantity) AS total_orders,4 SUM(oi.quantity * p.price) AS total_revenue5FROM products p6INNER JOIN order_items oi ON p.product_id = oi.product_id7GROUP BY p.category8HAVING SUM(oi.quantity * p.price) > 10000009ORDER BY total_revenue DESC;Giải thích:
INNER JOINđể kết hợp thông tin sản phẩm với đơn hàngSUM(oi.quantity * p.price)tính doanh thu = số lượng × đơn giáGROUP BY p.categorynhóm theo danh mụcHAVINGlọc sau khi nhóm (doanh thu trên 1 triệu)ORDER BY total_revenue DESCsắp xếp giảm dần
Bài tập 2: Xếp hạng nhân viên theo doanh số với Window Functions
Cho bảng sales:
1CREATE TABLE sales (2 employee_id INT,3 employee_name VARCHAR(100),4 department VARCHAR(50),5 sale_amount DECIMAL(12,2),6 sale_date DATE7);89INSERT INTO sales VALUES10(1, 'Nguyễn Văn An', 'Hà Nội', 15000000, '2025-01-15'),11(2, 'Trần Thị Bình', 'Hà Nội', 22000000, '2025-01-20'),12(3, 'Lê Văn Cường', 'TP.HCM', 18000000, '2025-01-25'),13(4, 'Phạm Thị Dung', 'TP.HCM', 25000000, '2025-02-01'),14(5, 'Hoàng Văn Em', 'Đà Nẵng', 12000000, '2025-02-10'),15(1, 'Nguyễn Văn An', 'Hà Nội', 20000000, '2025-02-15'),16(2, 'Trần Thị Bình', 'Hà Nội', 18000000, '2025-02-20'),17(3, 'Lê Văn Cường', 'TP.HCM', 30000000, '2025-03-01'),18(5, 'Hoàng Văn Em', 'Đà Nẵng', 16000000, '2025-03-05');Yêu cầu: Viết truy vấn sử dụng CTE và Window Functions để:
- Tính tổng doanh số của mỗi nhân viên
- Xếp hạng nhân viên trong phòng ban bằng
DENSE_RANK() - Tính doanh số của nhân viên xếp trên bằng
LAG()
Kết quả mong đợi:
| employee_name | department | total_sales | dept_rank | prev_employee_sales |
|---|---|---|---|---|
| Trần Thị Bình | Hà Nội | 40.000.000 | 1 | NULL |
| Nguyễn Văn An | Hà Nội | 35.000.000 | 2 | 40.000.000 |
| Lê Văn Cường | TP.HCM | 48.000.000 | 1 | NULL |
| Phạm Thị Dung | TP.HCM | 25.000.000 | 2 | 48.000.000 |
| Hoàng Văn Em | Đà Nẵng | 28.000.000 | 1 | NULL |
1WITH employee_totals AS (2 SELECT3 employee_id,4 employee_name,5 department,6 SUM(sale_amount) AS total_sales7 FROM sales8 GROUP BY employee_id, employee_name, department9)10SELECT11 employee_name,12 department,13 total_sales,14 DENSE_RANK() OVER (15 PARTITION BY department16 ORDER BY total_sales DESC17 ) AS dept_rank,18 LAG(total_sales) OVER (19 PARTITION BY department20 ORDER BY total_sales DESC21 ) AS prev_employee_sales22FROM employee_totals23ORDER BY department, dept_rank;Giải thích:
- CTE
employee_totals: Tính tổng doanh số mỗi nhân viên bằngSUM()+GROUP BY - DENSE_RANK(): Xếp hạng liên tiếp trong từng phòng ban (
PARTITION BY department) - LAG(): Lấy doanh số của nhân viên xếp ngay trên (theo thứ tự doanh số giảm dần), dòng đầu tiên mỗi partition sẽ trả về NULL
Bài tập 3: Phân loại khách hàng với CASE WHEN và Subquery
Cho bảng customers và orders:
1CREATE TABLE customers (2 customer_id INT PRIMARY KEY,3 customer_name VARCHAR(100),4 join_date DATE5);67CREATE TABLE orders (8 order_id INT PRIMARY KEY,9 customer_id INT,10 total_amount DECIMAL(12,2),11 order_date DATE12);1314INSERT INTO customers VALUES15(1, 'Công ty ABC', '2023-01-01'),16(2, 'Shop Online XYZ', '2023-06-15'),17(3, 'Cửa hàng 123', '2024-01-10'),18(4, 'Đại lý MNO', '2024-03-20'),19(5, 'Siêu thị PQR', '2024-08-01');2021INSERT INTO orders VALUES22(1, 1, 50000000, '2025-01-10'),23(2, 1, 35000000, '2025-02-15'),24(3, 2, 20000000, '2025-01-20'),25(4, 2, 15000000, '2025-03-01'),26(5, 3, 8000000, '2025-02-10'),27(6, 3, 5000000, '2025-03-15'),28(7, 4, 3000000, '2025-01-25'),29(8, 5, 60000000, '2025-02-01'),30(9, 5, 45000000, '2025-03-10'),31(10, 5, 30000000, '2025-03-20');Yêu cầu: Viết truy vấn phân loại khách hàng thành 3 nhóm dựa trên tổng chi tiêu:
- VIP: Tổng chi tiêu trên 50.000.000 VNĐ
- Regular: Tổng chi tiêu từ 10.000.000 đến 50.000.000 VNĐ
- Basic: Tổng chi tiêu dưới 10.000.000 VNĐ
Hiển thị: tên khách hàng, tổng chi tiêu, phân loại, và tổng chi tiêu trung bình toàn hệ thống (sử dụng scalar subquery).
Kết quả mong đợi:
| customer_name | total_spent | customer_type | system_avg |
|---|---|---|---|
| Siêu thị PQR | 135.000.000 | VIP | 54.200.000 |
| Công ty ABC | 85.000.000 | VIP | 54.200.000 |
| Shop Online XYZ | 35.000.000 | Regular | 54.200.000 |
| Cửa hàng 123 | 13.000.000 | Regular | 54.200.000 |
| Đại lý MNO | 3.000.000 | Basic | 54.200.000 |
1SELECT2 c.customer_name,3 SUM(o.total_amount) AS total_spent,4 CASE5 WHEN SUM(o.total_amount) > 50000000 THEN 'VIP'6 WHEN SUM(o.total_amount) >= 10000000 THEN 'Regular'7 ELSE 'Basic'8 END AS customer_type,9 (SELECT AVG(sub.total_spent)10 FROM (11 SELECT customer_id, SUM(total_amount) AS total_spent12 FROM orders13 GROUP BY customer_id14 ) sub15 ) AS system_avg16FROM customers c17INNER JOIN orders o ON c.customer_id = o.customer_id18GROUP BY c.customer_id, c.customer_name19ORDER BY total_spent DESC;Giải thích:
SUM(o.total_amount)tính tổng chi tiêu mỗi khách hàngCASE WHENphân loại dựa trên tổng chi tiêu- Scalar subquery tính trung bình tổng chi tiêu của tất cả khách hàng: subquery bên trong tính tổng từng khách, subquery bên ngoài tính trung bình
ORDER BY total_spent DESCsắp xếp theo chi tiêu giảm dần
📊 Đánh giá kết quả
| Số câu đúng | Đánh giá |
|---|---|
| 16-18 câu đúng + 3 bài tập | 🌟 Xuất sắc! Bạn đã nắm vững SQL cho Data Analysis! |
| 13-15 câu đúng + 2 bài tập | 👍 Giỏi! Kiến thức tốt, cần ôn thêm vài chủ đề |
| 10-12 câu đúng + 1 bài tập | 📚 Khá! Nền tảng ổn, nên ôn lại phần Window Functions và Optimization |
| 7-9 câu đúng | 📝 Trung bình, cần ôn lại JOINs, Subqueries và các khái niệm nâng cao |
| Dưới 7 câu đúng | 🔄 Cần cải thiện, nên học lại từ đầu, tập trung vào SELECT cơ bản và Aggregate Functions |
🎓 Hoàn thành khóa học!
Câu hỏi tự kiểm tra
- Khi nào dùng WHERE và khi nào dùng HAVING để lọc dữ liệu?
- Sự khác biệt giữa INNER JOIN, LEFT JOIN và CROSS JOIN là gì?
- CTE và Subquery có ưu nhược điểm gì? Khi nào nên dùng loại nào?
- Window Functions khác gì so với Aggregate Functions thông thường?
🎉 Chúc mừng bạn đã hoàn thành khóa học SQL cho Data Analysis! 🎓
Qua khóa học này, bạn đã được trang bị:
- ✅ SELECT, WHERE, ORDER BY — truy vấn và lọc dữ liệu
- ✅ Aggregate Functions — tổng hợp và phân tích dữ liệu theo nhóm
- ✅ JOINs — kết hợp dữ liệu từ nhiều bảng
- ✅ Subqueries & CTEs — truy vấn lồng và tái sử dụng logic
- ✅ Window Functions — phân tích nâng cao với xếp hạng, so sánh liền kề
- ✅ CASE WHEN, Views, Indexes — kỹ thuật nâng cao và tối ưu hiệu suất
Hãy thực hành thêm với các bài Challenge trên nền tảng hoặc tiếp tục với khóa học SQL Nâng cao để chinh phục các kỹ thuật phức tạp hơn!
