SQL join types
2024-02-19
minh họa các phép join sql
Khởi tạo
Khởi tạo data base
DROP TABLE IF EXISTS Orders;
DROP TABLE IF EXISTS customers;
-- Tạo bảng Customers
CREATE TABLE customers (
CustomerID INT PRIMARY KEY,
CustomerName VARCHAR(255)
);
-- Tạo bảng Orders
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
CustomerID INT,
FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);
-- Chèn dữ liệu vào bảng Customers
INSERT INTO Customers (CustomerID, CustomerName)
VALUES (1, 'John Doe'),
(2, 'Jane Smith');
-- Chèn dữ liệu vào bảng Orders
INSERT INTO Orders (OrderID, CustomerID)
VALUES (101, 1),
(102, 1),
(103, 2);
- schema
cus_id, name
*
order_id, cus_id
Các phép join
- inner join
- self join
- outer join (left, right, full)
- cross join
inner join
sql
SELECT customers.customer_id, customer_name, order_id
FROM customers
INNER JOIN orders ON customers.customer_id = orders.customer_id;
- các giá trị ở bảng 1 không có ở bảng 2 VÀ bảng 2 không có ở bảng 1 thì sẽ bị bỏ đi
(1, 'Long')
(2, 'Huy Black') -- cus_id 2 có trong bảng cus nhưng không có trong bảng order
(101, 1)
(103, 3) -- order 103 có trong bảng order nhưng cus_id = 3 không có trong bảng cus
kết quả chỉ có 1 row
"1" "Long" "101"
- chú ý vẫn có trường hợp bùng nổ join nếu join trên các trường k unique
(2, 'Huy Black')
(2, 'Huy White')
(103, 2)
(104, 2)
"2" "Huy White" "103"
"2" "Huy Black" "103"
"2" "Huy White" "104"
"2" "Huy Black" "104"
full outer join
sql
SELECT customers.customer_id, customer_name, order_id
FROM customers
OUTER JOIN orders ON customers.customer_id = orders.customer_id;
- lấy cả các giá trị và điền null vào
(1, 'Long')
(2, 'Huy Black')
(101, 1)
(103, 3)
"1" "Long" "101"
"null" "null" "103" -- order 103 có trong bảng 2 mà không có trong bảng 1
"2" "Huy Black" "null" -- cus 2 có trong bảng 1 mà không có trong bảng 1
left join
sql
SELECT customers.customer_id, customer_name, order_id
FROM customers
LEFT OUTER JOIN orders ON customers.customer_id = orders.customer_id;
- bảng bên trái phép join sẽ được lấy hết các giá trị (bên trái k có giá trị tương ứng thì null)
(1, 'Long')
(2, 'Huy Black')
(101, 1)
(103, 3)
"1" "Long" "101"
"2" "Huy Black" "null" -- lấy hết giá trị ở bảng trái, không có giá trị tương ứng bên bảng phải thì null
right join
- dùng left đi đổi trái sang phải là được
self join
- dùng cho mấy câu lệnh kiểu hierachy (child task, quản lí phòng ban)
sql
tasks
id, name, parent_id
SELECT
child.id,
child.name,
parent.name AS parent_name
FROM tasks AS child
JOIN tasks AS parent ON child.parent_id = parent.id;
cross join
- dùng cho bài toán cần tính toán trên tất cả các giá trị của tb này kết hợp với tb khác. ví dụ như có một bảng user, cần so sánh từng cặp user trong bảng này thì ta lấy bảng user cross join với chính nó
sql
SELECT column1, column2, ...
FROM table1
CROSS JOIN table2