0

SQL Advance - Joins

Việc truy vấn data trên 1 bảng thì khá đơn giản và dễ dùng trong SQL. Nhưng với từ 2 bảng trở lên, query sẽ trở nên khó khăn hơn khi phải móc nối nhiều table với nhau. Phải tìm được điều kiện và cách nối thích hợp để truy vấn được data mà bạn mong muốn.

Trong bài này mình sẽ giới thiệu tới những cách sử dụng câu lệnh Joins trong SQL. Tùy theo ngữ cảnh và mục đích sử dụng. Hi vọng bạn sẽ lựa chọn được cách dùng thích hợp.

Dữ liệu mình đưa ra để ví dụ có 2 bảng như sau

table1: Orders

OrderID CustomerID OrderDate
10101 CU001 2021-09-18
10102 CU002 2021-09-18
10103 CU001 2021-09-20
10104 CU004 2021-09-20

table2: Customers

CustomerID CustomerName Address City
CU001 Nam Hà 16 Lý Thường Kiệt Đà Nẵng
CU002 Văn Thanh 10 Hùng Vương Hà Nội
CU003 Cẩm Tú 14 An Thượng Hải Phòng

1. INNER JOIN

--> Kết nối dựa trên dữ liệu chung của 2 bảng

Syntax

SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;

Example

SELECT Orders.OrderID, Customers.CustomerName,Customers.Address,Customers.City
FROM Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID;

Thực hiện so sánh bảng [Orders] và [Customers].

  • Với mỗi dòng ở table Orders thực hiện tìm các dòng tương ứng ở bảng Customers.
  • Nếu tìm thấy dòng thỏa mãn điều kiện có cùng CustomerID sẽ thực hiện thêm dòng vào kết quả tương ứng.
  • Trường hợp tìm được nhiều dòng thõa mãn thì nhiều dòng kết quả sẽ được hiển thị

Result

OrderID CustomerName Address City
10101 Nam Hà 16 Lý Thường Kiệt Đà Nẵng
10102 Văn Thanh 10 Hùng Vương Hà Nội
10103 Nam Hà 16 Lý Thường Kiệt Đà Nẵng

2. LEFT JOIN

Syntax

SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;

Example

SELECT Orders.OrderID, Customers.CustomerName,Customers.Address,Customers.City
FROM Orders
LEFT JOIN Customers 
ON Orders.CustomerID = Customers.CustomerID;

Thực hiện so sánh bảng [Orders] và [Customers].

  • Cách làm tương tự với INNER JOIN tuy nhiên với các dòng ở bảng Orders nếu không tìm được dòng tương ứng ở Customers vẫn được hiển thị. Lúc này các giá trị tương ứng ở table Customers sẽ hiển thị NULL

Result

OrderID CustomerName Address City
10101 Nam Hà 16 Lý Thường Kiệt Đà Nẵng
10102 Văn Thanh 10 Hùng Vương Hà Nội
10103 Nam Hà 16 Lý Thường Kiệt Đà Nẵng
10104 null null null

3. RIGHT JOIN

Syntax

SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;

Note: RIGHT JOIN hoặc RIGHT OUTER JOIN đều được nhé.

Example

SELECT Orders.OrderID, Customers.CustomerName,Customers.Address,Customers.City
FROM Orders
RIGHT JOIN Customers 
ON Orders.CustomerID = Customers.CustomerID;

Thực hiện so sánh bảng [Orders] và [Customers].

  • Cách làm tương tự với INNER JOIN tuy nhiên với các dòng ở bảng Customers không tương ứng với bảng Orders vẫn được hiển thị. Lúc này các giá trị tương ứng ở table Orders sẽ hiển thị NULL

Result

OrderID CustomerName Address City
10101 Nam Hà 16 Lý Thường Kiệt Đà Nẵng
10102 Văn Thanh 10 Hùng Vương Hà Nội
10103 Nam Hà 16 Lý Thường Kiệt Đà Nẵng
null Cẩm Tú 14 An Thượng Hải Phòng

4. FULL JOIN

Syntax

SELECT column_name(s)
FROM table1
FULL JOIN table2
ON table1.column_name = table2.column_name

Note: FULL JOIN hoặc FULL OUTER JOIN đều được nhé.

Example

SELECT Orders.OrderID, Customers.CustomerName,Customers.Address,Customers.City
FROM Orders
FULL JOIN Customers 
ON Orders.CustomerID = Customers.CustomerID;

Thực hiện so sánh bảng [Orders] và [Customers].

  • Cách làm tương tự với INNER JOIN tuy nhiên với các dòng ở bảng Customers không tương ứng với bảng Orders vẫn được hiển thị. Lúc này các giá trị tương ứng ở table Orders sẽ hiển thị NULL
  • Các dòng ở bảng Orders không tương ứng với bảng Customers vẫn được được hiển thị. Lúc này các giá trị tương ứng ở table Customers sẽ hiển thị NULL

Result

OrderID CustomerName Address City
10101 Nam Hà 16 Lý Thường Kiệt Đà Nẵng
10102 Văn Thanh 10 Hùng Vương Hà Nội
10103 Nam Hà 16 Lý Thường Kiệt Đà Nẵng
10104 null null null
null Cẩm Tú 14 An Thượng Hải Phòng

5. SELF JOIN

--> Ngoài việc join từ 2 bảng thì chúng ta có thể tự join chính nó để truy vấn và tìm ra những dữ liệu cần dùng tới.

Syntax

SELECT column_name(s)
FROM table1 T1, table1 T2
WHERE condition;

Example

SELECT A.OrderID as Order01, B.OrderID as Order02, A.OrderDate
FROM Orders A, Orders B
WHERE A.OrderID <> B.OrderID
AND A.OrderDate = B.OrderDate 

Bảng [Orders] được kết hợp ngay với chính nó, để tìm ra các OrderID có cùng OrderDate

Result

Order01 Order02 OrderDate
10101 10102 2021-09-18
10103 10104 2021-09-20

Different Types of SQL JOINs

Dưới đây là một cái nhìn tổng quát để bạn dễ dàng so sánh sự khác nhau giữa các loại Joins. Hi vọng bài viết sẽ có ích giúp bạn.

Bài viết có tham khảo https://www.w3schools.com


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.