Day 6 - Intermediate: Joins

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


1. What are joins?

  • Joins dùng để kết hợp dữ liệu từ hai hoặc nhiều bảng dựa trên một điều kiện liên quan.

  • Trong hệ thống E-commerce, chúng ta thường cần kết hợp dữ liệu từ các bảng như orders, customers, và products để phân tích toàn diện.

  • Ví dụ: Kết hợp bảng orderscustomers để biết thông tin khách hàng của mỗi đơn hàng.


2. INNER JOIN - Theory

  • INNER JOIN: Trả về các bản ghi có giá trị khớp trong cả hai bảng.

  • Cú pháp:

      SELECT columns
      FROM table1
      INNER JOIN table2
      ON table1.column = table2.column;
    
  • Ví dụ:

      SELECT orders.order_id, customers.customer_name
      FROM orders
      INNER JOIN customers
      ON orders.customer_id = customers.customer_id;
    

    Câu lệnh này sẽ trả về thông tin đơn hàng và tên khách hàng tương ứng.


3. INNER JOIN - Practice

  • Thực hành sử dụng INNER JOIN để kết hợp bảng ordersproducts:

      SELECT orders.order_id, products.product_name, orders.quantity
      FROM orders
      INNER JOIN products
      ON orders.product_id = products.product_id;
    

    Câu lệnh này sẽ trả về thông tin đơn hàng và tên sản phẩm tương ứng.


4. Challenge: INNER JOIN

  • Yêu cầu: Viết truy vấn để lấy thông tin đơn hàng (order_id), tên khách hàng (customer_name), và phương thức thanh toán (payment_method) từ bảng orderscustomers.

5. Solution: INNER JOIN

  • Giải pháp:

      SELECT orders.order_id, customers.customer_name, orders.payment_method
      FROM orders
      INNER JOIN customers
      ON orders.customer_id = customers.customer_id;
    

6. FULL OUTER JOIN

  • FULL OUTER JOIN: Trả về tất cả các bản ghi từ cả hai bảng, kể cả những bản ghi không khớp.

  • Ví dụ:

      SELECT customers.customer_name, orders.order_id
      FROM customers
      FULL OUTER JOIN orders
      ON customers.customer_id = orders.customer_id;
    

    Câu lệnh này sẽ trả về tất cả khách hàng và đơn hàng, kể cả những khách hàng chưa đặt hàng và những đơn hàng không có thông tin khách hàng.


7. JOIN & WHERE

  • Kết hợp JOIN với WHERE để lọc dữ liệu.

  • Ví dụ:

      SELECT orders.order_id, customers.customer_name
      FROM orders
      INNER JOIN customers
      ON orders.customer_id = customers.customer_id
      WHERE orders.total_amount > 200;
    

    Câu lệnh này sẽ trả về các đơn hàng có tổng giá trị lớn hơn 200 và thông tin khách hàng tương ứng.


8. LEFT OUTER JOIN

  • LEFT OUTER JOIN: Trả về tất cả các bản ghi từ bảng bên trái và các bản ghi khớp từ bảng bên phải. Nếu không có bản ghi khớp, kết quả sẽ trả về NULL.

  • Ví dụ:

      SELECT customers.customer_name, orders.order_id
      FROM customers
      LEFT OUTER JOIN orders
      ON customers.customer_id = orders.customer_id;
    

    Câu lệnh này sẽ trả về tất cả khách hàng và đơn hàng tương ứng, kể cả những khách hàng chưa đặt hàng.


9. Challenge: LEFT OUTER JOIN

  • Yêu cầu: Viết truy vấn để lấy tất cả sản phẩm (product_name) và đơn hàng tương ứng (order_id) từ bảng productsorders. Nếu sản phẩm chưa được đặt hàng, hãy trả về NULL cho order_id.

10. Solution: LEFT OUTER JOIN

  • Giải pháp:

      SELECT products.product_name, orders.order_id
      FROM products
      LEFT OUTER JOIN orders
      ON products.product_id = orders.product_id;
    

11. RIGHT OUTER JOIN

  • RIGHT OUTER JOIN: Trả về tất cả các bản ghi từ bảng bên phải và các bản ghi khớp từ bảng bên trái. Nếu không có bản ghi khớp, kết quả sẽ trả về NULL.

  • Ví dụ:

      SELECT orders.order_id, customers.customer_name
      FROM orders
      RIGHT OUTER JOIN customers
      ON orders.customer_id = customers.customer_id;
    

    Câu lệnh này sẽ trả về tất cả đơn hàng và khách hàng tương ứng, kể cả những đơn hàng không có thông tin khách hàng.


12. Challenge: Joins

  • Yêu cầu: Viết truy vấn để lấy tất cả đơn hàng (order_id) và tên sản phẩm tương ứng (product_name) từ bảng ordersproducts. Nếu đơn hàng không có thông tin sản phẩm, hãy trả về NULL cho product_name.

13. Solution: Joins

  • Giải pháp:

      SELECT orders.order_id, products.product_name
      FROM orders
      LEFT OUTER JOIN products
      ON orders.product_id = products.product_id;
    

14. Joins on multiple conditions

  • JOIN có thể kết hợp nhiều điều kiện.

  • Ví dụ:

      SELECT orders.order_id, customers.customer_name, products.product_name
      FROM orders
      INNER JOIN customers ON orders.customer_id = customers.customer_id
      INNER JOIN products ON orders.product_id = products.product_id;
    

    Câu lệnh này sẽ trả về thông tin đơn hàng, khách hàng và sản phẩm tương ứng.


15. Solution: Joins on multiple conditions

  • Giải pháp:

      SELECT orders.order_id, customers.customer_name, products.product_name
      FROM orders
      INNER JOIN customers ON orders.customer_id = customers.customer_id
      INNER JOIN products ON orders.product_id = products.product_id;
    

16. Joining multiple tables

  • Kết hợp nhiều bảng trong một truy vấn.

  • Ví dụ:

      SELECT orders.order_id, customers.customer_name, products.product_name, orders.total_amount
      FROM orders
      INNER JOIN customers ON orders.customer_id = customers.customer_id
      INNER JOIN products ON orders.product_id = products.product_id;
    

    Câu lệnh này sẽ trả về thông tin đơn hàng, khách hàng, sản phẩm và tổng giá trị đơn hàng.


17. Challenge: Joining multiple tables

  • Yêu cầu: Viết truy vấn để lấy thông tin đơn hàng (order_id), tên khách hàng (customer_name), tên sản phẩm (product_name), và phương thức thanh toán (payment_method) từ bảng orders, customers, và products.

18. Solution: Joining multiple tables

  • Giải pháp:

      SELECT orders.order_id, customers.customer_name, products.product_name, orders.payment_method
      FROM orders
      INNER JOIN customers ON orders.customer_id = customers.customer_id
      INNER JOIN products ON orders.product_id = products.product_id;
    

19. More challenges

  • Thử thách 1: Viết truy vấn để lấy tất cả khách hàng (customer_name) và số lượng đơn hàng (order_count) của họ từ bảng customersorders.

  • Thử thách 2: Viết truy vấn để lấy tất cả sản phẩm (product_name) và tổng số lượng đã bán (total_quantity) từ bảng productsorders.


20. Today's slides

  • Tổng kết lại các loại JOIN đã 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.


21. Today's summary

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

    • Cách sử dụng INNER JOIN, FULL OUTER JOIN, LEFT OUTER JOIN, và RIGHT OUTER JOIN để kết hợp dữ liệu từ nhiều bảng.

    • Cách kết hợp JOIN với WHERE để lọc dữ liệu.

    • Cách kết hợp nhiều bảng trong một truy vấn.

  • Hẹn gặp lại bạn vào ngày 7 với chủ đề Advanced: UNION & Subqueries!