0

Trino SQL Bài học 21: Nền tảng kết nối bảng: INNER JOIN

Mục tiêu bài học:

  • Hiểu bản chất của cơ chế kết nối dữ liệu (Join) giữa các bảng.

  • Nắm vững cú pháp và logic hoạt động của INNER JOIN.

  • Nhận biết lỗi "Ambiguous column name" (Tên cột mơ hồ) và cách sử dụng Bí danh (Alias).

  • Ứng dụng INNER JOIN để giải quyết các bài toán tra cứu thông tin thực tế.

1. Tại sao phải JOIN bảng?

Trong thiết kế cơ sở dữ liệu chuẩn hóa (Normalized Database), dữ liệu hiếm khi được lưu trữ trong một bảng duy nhất khổng lồ. Việc này nhằm tránh dư thừa dữ liệu và dễ dàng cập nhật.

Ví dụ, thay vì lưu chi tiết thông tin khách hàng (Tên, Địa chỉ, Số điện thoại) vào từng dòng của bảng Đơn hàng (Orders), người ta sẽ lưu thông tin đó ở bảng Khách hàng (Customer). Bảng Đơn hàng chỉ cần lưu một mã tham chiếu (ví dụ: custkey) để biết đơn hàng đó thuộc về ai.

Mệnh đề JOIN chính là công cụ giúp bạn ghép nối các bảng rời rạc này lại với nhau dựa trên cột mã tham chiếu chung, tạo thành một báo cáo hoàn chỉnh.

2. INNER JOIN (Giao của hai tập hợp)

INNER JOIN (thường được viết tắt là JOIN) là loại kết nối phổ biến nhất và chặt chẽ nhất.

Logic hoạt động: Nó hoạt động như phép toán "Giao" (Intersection) của hai tập hợp. INNER JOIN sẽ lấy từng dòng ở Bảng A, đem đi đối chiếu với Bảng B dựa trên một điều kiện. Chỉ những dòng nào thỏa mãn điều kiện ở CẢ HAI BẢNG mới được giữ lại trong kết quả cuối cùng.

Nếu một Khách hàng ở Bảng A chưa từng mua hàng (không có dữ liệu trong Bảng B), khách hàng đó sẽ bị loại khỏi kết quả. Ngược lại, nếu một Đơn hàng ở Bảng B bị mồ côi (chứa mã khách hàng không tồn tại trong Bảng A), đơn hàng đó cũng bị loại bỏ.

3. Cú pháp và Thực hành

Cú pháp chuẩn của INNER JOIN bao gồm mệnh đề ON để xác định điều kiện kết nối.

SQL

SELECT 
    c.name,          -- Tên khách hàng (Từ bảng Customer)
    c.phone,         -- Số điện thoại (Từ bảng Customer)
    o.orderkey,      -- Mã đơn hàng (Từ bảng Orders)
    o.totalprice     -- Trị giá đơn hàng (Từ bảng Orders)
FROM tpch.tiny.customer AS c
INNER JOIN tpch.tiny.orders AS o 
    ON c.custkey = o.custkey; -- Điều kiện kết nối: Mã khách hàng phải khớp nhau

Ghi chú: Bạn có thể viết INNER JOIN hoặc chỉ viết JOIN, Trino đều hiểu đó là INNER JOIN.

4. Cạm bẫy: "Ambiguous column name" (Tên cột mơ hồ)

Khi bạn SELECT dữ liệu từ nhiều bảng, rất có thể các bảng đó sẽ có những cột trùng tên nhau.

Ví dụ, nếu cả bảng customer và bảng orders đều có cột tên là status (Một bên là trạng thái tài khoản, một bên là trạng thái đơn hàng). Nếu bạn viết SELECT status ..., Trino sẽ báo lỗi: Column 'status' is ambiguous (Không rõ cột 'status' thuộc về bảng nào).

Cách khắc phục (Best Practice): Luôn luôn sử dụng Bí danh bảng (Table Alias) và gọi tên cột kèm theo tiền tố bí danh (ví dụ: c.status, o.status). Điều này không chỉ sửa lỗi mà còn giúp code của bạn rõ ràng, dễ bảo trì hơn, đặc biệt khi hệ thống có hàng chục bảng.

5. JOIN nhiều bảng cùng lúc

Bạn không bị giới hạn số lượng bảng được JOIN. Bạn có thể dùng JOIN liên tiếp như một sợi dây chuyền để kéo dữ liệu từ nhiều nơi khác nhau.

Ví dụ: Truy xuất chi tiết từng mặt hàng (Lineitem) nằm trong Đơn hàng (Orders), và đơn hàng đó thuộc về Khách hàng (Customer) nào.

SQL

SELECT 
    c.name AS customer_name,
    o.orderdate,
    l.partkey AS product_id,
    l.quantity
FROM tpch.tiny.customer AS c
JOIN tpch.tiny.orders AS o 
    ON c.custkey = o.custkey
JOIN tpch.tiny.lineitem AS l 
    ON o.orderkey = l.orderkey
WHERE o.orderdate >= DATE '1995-01-01'
LIMIT 10;

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí