Day 5 - Intermediate: Conditional Expressions

Bối cảnh: Hệ thống E-commerce (Thương mại điện tử)


1. Mathematical functions and operators

  • Các hàm và toán tử toán học phổ biến trong SQL:

    • +: Cộng.

    • -: Trừ.

    • *: Nhân.

    • /: Chia.

    • %: Chia lấy dư.

    • ABS(): Giá trị tuyệt đối.

    • ROUND(): Làm tròn số.

  • Ví dụ:

      SELECT product_name, price, ROUND(price * 0.9, 2) AS discounted_price 
      FROM products;
    

    Câu lệnh này sẽ trả về tên sản phẩm, giá gốc và giá sau khi giảm 10%.


2. Challenge: Mathematical functions and operators

  • Yêu cầu: Viết truy vấn để tính tổng giá trị đơn hàng (total_amount) sau khi áp dụng thuế 8% từ bảng orders.

3. Solution: Mathematical functions and operators

  • Giải pháp:

      SELECT order_id, total_amount, ROUND(total_amount * 1.08, 2) AS total_with_tax 
      FROM orders;
    

4. CASE WHEN - Theory

  • CASE WHEN dùng để thực hiện các phép kiểm tra điều kiện và trả về giá trị tương ứng.

  • Cú pháp:

      CASE 
        WHEN condition1 THEN result1
        WHEN condition2 THEN result2
        ELSE default_result
      END
    
  • Ví dụ:

      SELECT product_name, price, 
             CASE 
               WHEN price > 100 THEN 'Expensive'
               WHEN price BETWEEN 50 AND 100 THEN 'Moderate'
               ELSE 'Cheap'
             END AS price_category
      FROM products;
    

    Câu lệnh này sẽ phân loại sản phẩm thành "Expensive", "Moderate", hoặc "Cheap" dựa trên giá.


5. CASE WHEN - Hands-on

  • Thực hành sử dụng CASE WHEN để phân loại đơn hàng:

      SELECT order_id, total_amount, 
             CASE 
               WHEN total_amount > 500 THEN 'High Value'
               WHEN total_amount BETWEEN 200 AND 500 THEN 'Medium Value'
               ELSE 'Low Value'
             END AS order_category
      FROM orders;
    

6. Challenge: CASE WHEN

  • Yêu cầu: Viết truy vấn để phân loại khách hàng thành "VIP", "Regular", hoặc "New" dựa trên số lượng đơn hàng (order_count) từ bảng customers.

    • VIP: order_count > 10

    • Regular: order_count BETWEEN 5 AND 10

    • New: order_count < 5


7. Solution: CASE WHEN

  • Giải pháp:

      SELECT customer_id, customer_name, order_count, 
             CASE 
               WHEN order_count > 10 THEN 'VIP'
               WHEN order_count BETWEEN 5 AND 10 THEN 'Regular'
               ELSE 'New'
             END AS customer_category
      FROM customers;
    

8. CASE WHEN & SUM

  • Kết hợp CASE WHEN với SUM để tính toán có điều kiện.

  • Ví dụ:

      SELECT 
        SUM(CASE WHEN payment_method = 'Credit Card' THEN total_amount ELSE 0 END) AS credit_card_revenue,
        SUM(CASE WHEN payment_method = 'PayPal' THEN total_amount ELSE 0 END) AS paypal_revenue
      FROM orders;
    

    Câu lệnh này sẽ tính tổng doanh thu từ các phương thức thanh toán khác nhau.


9. Challenge: CASE WHEN & SUM

  • Yêu cầu: Viết truy vấn để tính tổng doanh thu từ các danh mục sản phẩm (category) trong bảng orders.

10. Solution: CASE WHEN & SUM

  • Giải pháp:

      SELECT 
        SUM(CASE WHEN category = 'Electronics' THEN total_amount ELSE 0 END) AS electronics_revenue,
        SUM(CASE WHEN category = 'Clothing' THEN total_amount ELSE 0 END) AS clothing_revenue,
        SUM(CASE WHEN category = 'Home Appliances' THEN total_amount ELSE 0 END) AS home_appliances_revenue
      FROM orders;
    

11. COALESCE

  • COALESCE: Trả về giá trị đầu tiên không phải NULL trong danh sách.

  • Ví dụ:

      SELECT customer_name, COALESCE(email, 'No Email') AS customer_email 
      FROM customers;
    

    Câu lệnh này sẽ trả về email của khách hàng, nếu email là NULL thì trả về 'No Email'.


12. Challenge: COALESCE

  • Yêu cầu: Viết truy vấn để lấy tên sản phẩm (product_name) và mô tả sản phẩm (description). Nếu mô tả là NULL, hãy trả về 'No Description' từ bảng products.

13. Solution: COALESCE

  • Giải pháp:

      SELECT product_name, COALESCE(description, 'No Description') AS product_description 
      FROM products;
    

14. CAST

  • CAST: Chuyển đổi kiểu dữ liệu của một cột.

  • Ví dụ:

      SELECT order_id, CAST(total_amount AS INTEGER) AS total_amount_int 
      FROM orders;
    

    Câu lệnh này sẽ chuyển đổi cột total_amount từ kiểu số thập phân sang kiểu số nguyên.


15. Challenge: CAST & COALESCE

  • Yêu cầu: Viết truy vấn để lấy ngày đặt hàng (order_date) và chuyển đổi thành kiểu chuỗi (VARCHAR). Nếu ngày đặt hàng là NULL, hãy trả về 'No Date' từ bảng orders.

16. Solution: CAST & COALESCE

  • Giải pháp:

      SELECT order_id, COALESCE(CAST(order_date AS VARCHAR), 'No Date') AS order_date_str 
      FROM orders;
    

17. REPLACE

  • REPLACE: Thay thế một chuỗi con bằng chuỗi khác.

  • Ví dụ:

      SELECT product_name, REPLACE(product_name, 'Old', 'New') AS updated_name 
      FROM products;
    

    Câu lệnh này sẽ thay thế từ "Old" bằng "New" trong tên sản phẩm.


18. Today's slides

  • Tổng kết lại các hàm và biểu thức điều kiện đã học trong ngày hôm nay.

  • Cung cấp slide tham khảo để bạn ôn tập và thực hành thêm.


19. Today's summary

  • Hôm nay, bạn đã học:

    • Cách sử dụng các hàm toán học và toán tử.

    • Cách sử dụng CASE WHEN để thực hiện các phép kiểm tra điều kiện.

    • Cách sử dụng COALESCECAST để xử lý dữ liệu NULL và chuyển đổi kiểu dữ liệu.

    • Cách sử dụng REPLACE để thay thế chuỗi.

  • Hẹn gặp lại bạn vào ngày 6 với chủ đề Intermediate: Joins!


20. Today's challenges

  • Thử thách 1: Viết truy vấn để tính tổng giá trị đơn hàng (total_amount) và phân loại đơn hàng thành "High", "Medium", hoặc "Low" dựa trên giá trị từ bảng orders.

  • Thử thách 2: Viết truy vấn để lấy tên khách hàng (customer_name) và địa chỉ email (email). Nếu email là NULL, hãy trả về 'No Email' từ bảng customers.

  • Thử thách 3: Viết truy vấn để thay thế từ "Sale" bằng "Discount" trong tên sản phẩm (product_name) từ bảng products.