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
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 đó.
-- 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:
-- 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ử
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.
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
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.
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ử