Chuyển đến nội dung chính
Mô-đun 5 · Bài học 1 trong tổng số 417/57 trong khóa học~12 min
Bài học theo mô-đun (1/4)

THAM GIA trên ba bảng trở lên

Trong Mô-đun 3, bạn đã tham gia hai bảng. Trong thế giới thực, dữ liệu gần như luôn nằm rải rác trên ba hoặc nhiều hơn bảng được liên kết bằng khóa ngoại: tới trả lời một câu hỏi kinh doanh bạn phải vượt qua chuỗi các mối quan hệ. Đó chính xác là chức năng của JOIN nhiều bảng.

Từ mô-đun này trở đi, chúng ta sẽ sử dụng tập dữ liệu ecommerce (khách hàng, danh mục, sản phẩm, đơn đặt hàng, mặt hàng đặt hàng, đánh giá). Bạn có thể khám phá nó từ Playground bằng cách chọn ecommerce từ tập dữ liệu người nhặt.

Cú pháp: một chuỗi THAM GIA

SQL
SELECT colonne
FROM   tabella_a
JOIN   tabella_b ON tabella_a.x = tabella_b.y
JOIN   tabella_c ON tabella_b.z = tabella_c.w
[JOIN  tabella_d ON …]
…;

Mỗi JOIN thêm một "mắt xích" vào chuỗi: động cơ đảm nhận vai trò trung gian kết quả của THAM GIA trước đó và đính kèm bảng tiếp theo vào đó.

SQL
-- Per ogni riga d'ordine: cliente, prodotto e quantità.
SELECT c.email,
       p.name AS prodotto,
       oi.quantity
FROM   orders      AS o
JOIN   customers   AS c  ON o.customer_id = c.id
JOIN   order_items AS oi ON oi.order_id   = o.id
JOIN   products    AS p  ON oi.product_id = p.id;

Ba JOIN, bốn bảng. Kết quả có một hàng cho mỗi order_items — mỗi hàng sản phẩm trong mỗi đơn hàng — được bổ sung thêm email khách hàng và tên sản phẩm.

Thứ tự logic

Công cụ nối các bảng từ trái sang phải. Điều kiện JOIN có thể tham khảo bất kỳ bảng nào đã được giới thiệu ở trên. Để dễ đọc:

  • đặt "bảng chính" của câu hỏi lên đầu tiên (ở đây orders);
  • thêm những người khác theo thứ tự bạn truy cập chúng bằng cách làm theo các mối quan hệ.

Tổng hợp trên chuỗi THAM GIA

Nhiều JOIN kết hợp với GROUP BY để tạo báo cáo:

SQL
-- Spesa totale per cliente (solo ordini consegnati):
SELECT c.email,
       SUM(oi.quantity * oi.unit_price) AS total
FROM   customers   AS c
JOIN   orders      AS o  ON o.customer_id = c.id
JOIN   order_items AS oi ON oi.order_id   = o.id
WHERE  o.status = 'delivered'
GROUP BY c.email
ORDER BY total DESC;

Bạn không cần JOIN products ở đây: mọi thứ bạn cần (quantity, unit_price) đã có trong order_items. Nguyên tắc nhỏ: không thêm bảng bạn không sử dụng — chúng làm ảnh hưởng đến hiệu suất và khả năng đọc.

Hãy tự mình thử

tập thể dục#sql.m5.l1.e1
Nỗ lực: 0Đang tải…

Per ogni riga d'ordine degli ordini consegnati (trạng thái = 'đã gửi'), hầu hết các email của khách hàng, tên sản phẩm và số lượng. Tre Colonne. Ordina per id ordine crescente và id prodotto crescente.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Ba THAM GIA: đơn hàng→khách hàng trên customer_id, đơn hàng→order_items trên order_id, order_items→sản phẩm trên Product_id.

Giải pháp khả dụng sau 3 lần thử

Xem lại bài tập

tập thể dục#sql.m5.l1.e2
Nỗ lực: 0Đang tải…

3 khách hàng hàng đầu trên tổng số chi phí (somma di số lượng * unit_price) sui soli ordini consegnati. Do dấu hai chấm: email e tổng cộng. Ordina trên tổng số lần giảm dần, giới hạn a 3.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Non ti phục vụ sản phẩm JOIN: số lượng e đơn_giá sono già trong order_items.

Giải pháp khả dụng sau 3 lần thử