MinAI - Về trang chủ
Quiz
12/1330 phút
Đang tải...

Quiz tổng hợp

Kiểm tra kiến thức toàn khóa học SQL cho Data Analysis

0

🎯 Mục tiêu bài Quiz

TB5 min

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ầnChủ đềSố câu
1SELECT cơ bản (WHERE, ORDER BY)3
2Aggregate Functions (COUNT, SUM, AVG, GROUP BY, HAVING)3
3JOINs (INNER, LEFT, RIGHT, FULL, CROSS, SELF)3
4Subqueries và CTEs3
5Window Functions (ROW_NUMBER, RANK, LAG, LEAD, NTILE)3
6Optimization và Advanced (CASE WHEN, Views, Indexes, Stored Procedures)3
1

Phần 1: SELECT cơ bản

TB5 min
2

Phần 2: Aggregate Functions

TB5 min
3

Phần 3: JOINs

TB5 min
4

Phần 4: Subqueries & CTEs

TB5 min
5

Phần 5: Window Functions

TB5 min
6

Phần 6: Optimization & Advanced

TB5 min
7

Phần 7: Bài tập SQL

TB5 min

Bài tập 1: Phân tích doanh thu theo danh mục sản phẩm

Cho bảng productsorder_items:

SQL
1-- Bảng products
2CREATE TABLE products (
3 product_id INT PRIMARY KEY,
4 product_name VARCHAR(100),
5 category VARCHAR(50),
6 price DECIMAL(10,2)
7);
8
9INSERT INTO products VALUES
10(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);
15
16-- Bảng order_items
17CREATE TABLE order_items (
18 order_id INT,
19 product_id INT,
20 quantity INT,
21 order_date DATE
22);
23
24INSERT INTO order_items VALUES
25(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:

categorytotal_orderstotal_revenue
Electronics1277.750.000
Furniture310.500.000
Books244.900.000
Đáp án
SQL
1SELECT
2 p.category,
3 SUM(oi.quantity) AS total_orders,
4 SUM(oi.quantity * p.price) AS total_revenue
5FROM products p
6INNER JOIN order_items oi ON p.product_id = oi.product_id
7GROUP BY p.category
8HAVING SUM(oi.quantity * p.price) > 1000000
9ORDER 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àng
  • SUM(oi.quantity * p.price) tính doanh thu = số lượng × đơn giá
  • GROUP BY p.category nhóm theo danh mục
  • HAVING lọc sau khi nhóm (doanh thu trên 1 triệu)
  • ORDER BY total_revenue DESC sắ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:

SQL
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 DATE
7);
8
9INSERT INTO sales VALUES
10(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 để:

  1. Tính tổng doanh số của mỗi nhân viên
  2. Xếp hạng nhân viên trong phòng ban bằng DENSE_RANK()
  3. Tính doanh số của nhân viên xếp trên bằng LAG()

Kết quả mong đợi:

employee_namedepartmenttotal_salesdept_rankprev_employee_sales
Trần Thị BìnhHà Nội40.000.0001NULL
Nguyễn Văn AnHà Nội35.000.000240.000.000
Lê Văn CườngTP.HCM48.000.0001NULL
Phạm Thị DungTP.HCM25.000.000248.000.000
Hoàng Văn EmĐà Nẵng28.000.0001NULL
Đáp án
SQL
1WITH employee_totals AS (
2 SELECT
3 employee_id,
4 employee_name,
5 department,
6 SUM(sale_amount) AS total_sales
7 FROM sales
8 GROUP BY employee_id, employee_name, department
9)
10SELECT
11 employee_name,
12 department,
13 total_sales,
14 DENSE_RANK() OVER (
15 PARTITION BY department
16 ORDER BY total_sales DESC
17 ) AS dept_rank,
18 LAG(total_sales) OVER (
19 PARTITION BY department
20 ORDER BY total_sales DESC
21 ) AS prev_employee_sales
22FROM employee_totals
23ORDER BY department, dept_rank;

Giải thích:

  • CTE employee_totals: Tính tổng doanh số mỗi nhân viên bằng SUM() + 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 customersorders:

SQL
1CREATE TABLE customers (
2 customer_id INT PRIMARY KEY,
3 customer_name VARCHAR(100),
4 join_date DATE
5);
6
7CREATE TABLE orders (
8 order_id INT PRIMARY KEY,
9 customer_id INT,
10 total_amount DECIMAL(12,2),
11 order_date DATE
12);
13
14INSERT INTO customers VALUES
15(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');
20
21INSERT INTO orders VALUES
22(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_nametotal_spentcustomer_typesystem_avg
Siêu thị PQR135.000.000VIP54.200.000
Công ty ABC85.000.000VIP54.200.000
Shop Online XYZ35.000.000Regular54.200.000
Cửa hàng 12313.000.000Regular54.200.000
Đại lý MNO3.000.000Basic54.200.000
Đáp án
SQL
1SELECT
2 c.customer_name,
3 SUM(o.total_amount) AS total_spent,
4 CASE
5 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_spent
12 FROM orders
13 GROUP BY customer_id
14 ) sub
15 ) AS system_avg
16FROM customers c
17INNER JOIN orders o ON c.customer_id = o.customer_id
18GROUP BY c.customer_id, c.customer_name
19ORDER BY total_spent DESC;

Giải thích:

  • SUM(o.total_amount) tính tổng chi tiêu mỗi khách hàng
  • CASE WHEN phâ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 DESC sắp xếp theo chi tiêu giảm dần
8

📊 Đánh giá kết quả

TB5 min
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
9

🎓 Hoàn thành khóa học!

TB5 min

Câu hỏi tự kiểm tra

  1. Khi nào dùng WHERE và khi nào dùng HAVING để lọc dữ liệu?
  2. Sự khác biệt giữa INNER JOIN, LEFT JOIN và CROSS JOIN là gì?
  3. CTE và Subquery có ưu nhược điểm gì? Khi nào nên dùng loại nào?
  4. 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
Bước tiếp theo

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!