Phép JOIN trong SQL là công cụ mạnh mẽ giúp kết hợp dữ liệu từ nhiều bảng, xây dựng cái nhìn toàn diện và chính xác về thông tin. Trong lĩnh vực dữ liệu, việc kết hợp dữ liệu từ nhiều bảng là rất quan trọng để có được bức tranh tổng thể. Trong bài viết này, chúng ta sẽ khám phá sâu hơn về các phép JOIN.

Đọc bài viết này để hiểu về:

  • Các phép JOIN trong SQL
  • Cú pháp và cách sử dụng các phép JOIN
  • DELETE JOIN là gì?

Phép JOIN trong SQL là gì?

Phép JOIN (nối) là một trong những chức năng quan trọng trong SQL, cho phép người dùng kết hợp dữ liệu từ hai hoặc nhiều bảng khác nhau trong cùng một cơ sở dữ liệu chỉ với 1 câu truy vấn.

Nó được sử dụng khi cần truy vấn dữ liệu từ nhiều bảng để trả về kết quả trong cùng một tập dữ liệu. Hai bảng có thể được kết nối với nhau khi có một trường chung giữa hai bảng này (thường là khóa chính và khóa ngoại).

Trong trường hợp cần kết nối nhiều hơn hai bảng, có thể sử dụng nhiều phép JOIN dựa trên cùng cơ chế như khi kết nối hai bảng.

Phép JOIN giúp tối ưu hóa quá trình truy vấn dữ liệu, cho phép truy cập thông tin từ nhiều bảng một cách dễ dàng và là một công cụ mạnh mẽ cho các nhà phân tích dữ liệu, lập trình viên và bất kỳ ai cần truy vấn dữ liệu từ các bảng khác nhau.

Tìm hiểu thêm về SQL Database – Ngôn ngữ truy vấn mạnh mẽ cho cơ sở dữ liệu

Các loại JOIN trong SQL

Trước hết, cùng xem xét 3 bảng dữ liệu sau:

  • Bảng A: Customer (Khách hàng)
Customer_id Name City
1 Alice New York

2

Bob Los Angeles
3 Charlie

Chicago

4 David Miami
  • Bảng B: Order (Đơn hàng)

Order_id

Customer_id Product_id Price
101 1 1

1000

102

2 2 800
103 1 3

500

104

3 4 200
105 5 5

300

  • Bảng C: Product (Sản phẩm)
Product_id Product_name Category
1 Laptop Electronics
2 Smartphone Electronics
3 Tablet Electronics
4 Headphones Accessories

Chúng ta sẽ sử dụng các bảng dữ liệu này trong các ví dụ về các phép JOIN dưới đây:

Inner Join

join trong sql - inner join

INNER JOIN là một lệnh được sử dụng để kết hợp các hàng từ cả hai bảng thỏa mãn điều kiện cho trước. Sử dụng INNER JOIN sẽ trả về những hàng có giá trị khớp nhau trong cả hai bảng. Điều này có nghĩa là chỉ những hàng từ mỗi bảng phù hợp với điều kiện được liên kết mới được xuất hiện trong kết quả truy vấn. Đây là loại JOIN được sử dụng phổ biến nhất và được coi là thao tác JOIN mặc định.

  • Cú pháp 1:
SELECT columns 

FROM tableA 

INNER JOIN tableB 

ON tableA.column = tableB.column;

Trong đó:

  • SELECT columns: Liệt kê các cột mà bạn muốn lấy dữ liệu.
  • FROM tableA: Chỉ định bảng cơ sở từ đó bạn muốn lấy dữ liệu.
  • INNER JOIN tableB: Chỉ định bảng mà bạn muốn kết hợp với bảng cơ sở (bởi vì inner join được xem là phép JOIN mặc định nên chúng ta có thể viết gọn là JOIN table B)
  • ON tableA.column = tableB.column: Chỉ định điều kiện để kết hợp các hàng từ hai bảng.

Ví dụ:

Để lấy thông tin của khách hàng và đơn hàng của họ, ta thực hiện phép kết nối INNER JOIN như sau:

SELECT Customers.name, Customers.City, Orders.Order_id, Orders.Product_name, Orders.Price 

FROM Customers 

INNER JOIN Orders 

ON Customers.Customer_id = Orders.Customer_id;

Bảng kết quả:

Name

City Order_id Product_name Price
Alice New York 101 Laptop

1000

Alice

New York 103 Tablet 500
Bob Los Angeles 102 Smartphone

800

Charlie

Chicago 104 Headphones

200

Giải thích: INNER JOIN trả về các hàng có giá trị khớp giữa bảng Customers và Orders dựa trên điều kiện JOIN là Customer_id giữa 2 bảng phải giống nhau. Hàng không thỏa mãn điều kiện JOIN (như Customer_id = 5 trong bảng Orders) sẽ không xuất hiện trong kết quả.

  • Cú pháp 2: Bên cạnh cú pháp INNER JOIN thông thường, ta cũng có thể sử dụng cú pháp khác bằng cách liệt kê các bảng cần kết hợp và điều kiện kết hợp trong phần WHERE. Cú pháp này giúp viết câu lệnh truy vấn SQL một cách ngắn gọn hơn mà vẫn đảm bảo kết quả tương đương.
SELECT columns 

FROM tableA, tableB

WHERE tableA.column = tableB.column;
  • Cú pháp 3: Ngoài ra, cú pháp JOIN có thể kết hợp với điều kiện phức tạp hơn cho phép kết hợp dữ liệu từ hai bảng dựa trên một hoặc nhiều điều kiện logic. 

Để viết câu truy vấn SQL mà tất cả các điều kiện đều phải thỏa mãn ta sẽ sử dụng AND:

SELECT columns 

FROM tableA 

INNER JOIN tableB ON tableA.column = tableB.column

AND <Điều kiện>

Hoặc nếu muốn chọn các bản ghi thỏa mãn ít nhất một trong các điều kiện, ta sẽ sử dụng OR :

SELECT columns 

FROM tableA 

INNER JOIN tableB ON tableA.column = tableB.column

OR <Điều kiện>

Ví dụ:

Để lấy thông tin từ bảng Customers và Orders mà thỏa mãn điều kiện khách hàng có đơn hàng với giá lớn hơn 500, ta viết câu truy vấn như sau:
SELECT Customers.Customer_id, Customers.Name, Customers.City, Orders.Product_name, Orders.Price 

FROM Customers 

INNER JOIN Orders 

ON Customers.Customer_Id = Orders.Customer_id 

AND Orders.Price > 500;

Bảng kết quả:

Customer_id

Name City Product_name Price

1

Alice New York Laptop 1000

2

Bob Los Angeles Smartphone

800

  • Cú pháp 4: Cú pháp JOIN ba bảng tương tự như cú pháp JOIN hai bảng, nhưng tăng số lượng INNER JOIN lên. Điều kiện là phải có một bảng có cột khớp với hai bảng còn lại. Điều này đảm bảo rằng chúng ta có thể liên kết tất cả các bảng lại với nhau dựa trên các cột chung.
SELECT columns 

FROM tableA 

INNER JOIN tableB ON tableA.column = tableB.column 

INNER JOIN tableC ON tableB.column = tableC.column;

Ví dụ:

Để lấy thông tin khách hàng với đơn hàng và danh mục hàng hoá tương ứng, ta thực hiện phép INNER JOIN như sau:

SELECT Customer.Customer_id, Customer.Name, Customer.City, Orders.Order_id, Orders.Product_name, Orders.Price, Products.Category

FROM Customer

INNER JOIN Orders ON Customer.Customer_id = Orders.Customer_id

INNER JOIN Products ON Orders.Product_id = Products.Product_id;

Bảng kết quả:

Customer_id Name City Order_id Product_name Price Category
1 Alice New York 101 Laptop 1000

Electronics

1

Alice New York 103 Tablet 500 Electronics
2 Bob Los Angeles 102 Smartphone 800

Electronics

3

Charlie Chicago 104 Headphones 200

Accessories

Left Join

join trong sql - left join

LEFT JOIN (hay LEFT OUTER JOIN) là một loại JOIN trong SQL được sử dụng để kết hợp dữ liệu từ hai bảng dựa trên một điều kiện nhất định. Điểm khác biệt của LEFT JOIN so với INNER JOIN là nó trả về tất cả các hàng từ bảng bên trái (bảng A), cùng với các hàng tương ứng từ bảng bên phải (bảng B). Nếu không có hàng tương ứng trong bảng B, các cột từ bảng B sẽ chứa giá trị NULL.

Cú pháp:

SELECT columns 

FROM left_table 

LEFT JOIN right_table 

ON left_table.common_column = right_table.common_column;

Ví dụ:

Để lấy thông tin của tất cả khách hàng và đơn hàng của họ, bất kể khách hàng có đơn hàng hay không, ta thực hiện phép kết nối LEFT JOIN như sau:

SELECT Customers.Name, Customers.City, Orders.Order_id, Orders.Product_name, Orders.Price 

FROM Customers 

LEFT JOIN Orders 

ON Customers.Customer_id = Orders.Customer_id;

Bảng kết quả:

Name

City Order_id Product_name Price
Alice New York 101 Laptop

1000

Alice

New York 103 Tablet 500
Bob Los Angeles 102 Smartphone

800

Charlie

Chicago 104 Headphones 200
David Miami NULL NULL

NULL

Giải thích: LEFT JOIN trả về tất cả các hàng từ bảng customers và các hàng khớp từ bảng orders. Nếu không có sự khớp, các cột từ bảng orders sẽ chứa giá trị NULL.

Right Join

join trong sql - right join

RIGHT JOIN (hay RIGHT OUTER JOIN) là một loại JOIN trong SQL hoạt động ngược lại so với LEFT JOIN. Khi sử dụng RIGHT JOIN, tất cả các hàng từ bảng bên phải (bảng B) sẽ được trả về, ngay cả khi không có hàng tương ứng trong bảng bên trái (bảng A). Nếu không có hàng tương ứng trong bảng A, các cột từ bảng A trong kết quả sẽ chứa giá trị NULL.

Cú pháp:

SELECT columns 

FROM left_table 

RIGHT JOIN right_table 

ON right_table.common_column = left_table.common_column;

Ví dụ: 

SELECT Customers.Name, Customers.City, Orders.Order_id, Orders.Product_Name, Orders.Price 

FROM Customers 

RIGHT JOIN Orders 

ON Customers.Customer_id = Orders.Customer_id;

Bảng kết quả:

Name

City Order_id Product_name

Price

Alice New York 101 Laptop

1000

Alice

New York 103 Tablet 500
Bob Los Angeles 102 Smartphone

800

Charlie

Chicago 104 Headphones 200
NULL NULL 105 Monitor

300

Giải thích: RIGHT JOIN trả về tất cả các hàng từ bảng orders và các hàng khớp từ bảng customers. Nếu không có sự khớp, các cột từ bảng customers sẽ chứa giá trị NULL.

Full Join

join trong sql - full join

FULL JOIN (hay FULL OUTER JOIN) là một loại JOIN kết hợp cả kết quả của LEFT OUTER JOIN và RIGHT OUTER JOIN. FULL JOIN trả về tất cả các hàng từ cả hai bảng, và điền các giá trị NULL cho các hàng không có tương ứng trong bảng kia. Điều này có nghĩa là FULL JOIN có thể phát hiện và trả về các hàng mà không có kết quả khớp trong bảng được kết hợp.

Cú pháp:

SELECT columns 

FROM table1 

FULL JOIN table2 

ON table1.common_column = table2.common_column;

Ví dụ: Để lấy thông tin tất cả khách hàng và đơn hàng, bao gồm cả những khách hàng không có đơn hàng và đơn hàng không có khách hàng, ta dùng phép kết FULL JOIN như sau:

SELECT Customers.Name, Customers.City, Orders.Order_id, Orders.Product_name, Orders.Price 

FROM Customers 

FULL JOIN Orders 

ON Customers.Customer_id = Orders.Customer_id;

Bảng kết quả:

Name

City Order_id Product_name

Price

Alice

New York 101 Laptop 1000
Alice New York 103 Tablet

500

Bob

Los Angeles 102 Smartphone 800
Charlie Chicago 104 Headphones

200

David

Miami NULL NULL NULL
NULL NULL 105 Monitor

300

Giải thích: FULL JOIN trả về tất cả các bản ghi khi thỏa mãn điều kiện ở một trong hai bảng. Các bản ghi không khớp với điều kiện trong bảng còn lại sẽ chứa giá trị NULL.

Cross Join

join trong sql - cross join

CROSS JOIN là dạng JOIN đơn giản nhất trong SQL. Nó kết hợp mỗi hàng từ một bảng với tất cả các hàng từ bảng khác. Nói cách khác, CROSS JOIN tạo ra sự kết hợp của mỗi hàng từ bảng đầu tiên với tất cả các hàng trong bảng thứ hai.

Cú pháp:

SELECT columns 

FROM table1 

CROSS JOIN table2;

Ví dụ: Để lấy tất cả các kết hợp có thể của khách hàng và đơn hàng, ta dùng phép kết CROSS JOIN như sau

SELECT Customers.Name, Customers.City, Orders.Order_id, Orders.Product_name, Orders.Price 

FROM Customers 

CROSS JOIN Orders;

Bảng kết quả:

Name

City Order_id Product_name

Price

Alice

New York 101 Laptop 1000
Alice New York 102 Smartphone

800

Alice

New York 103 Tablet 500
Alice New York 104 Headphones

200

Alice

New York 105 Monitor 300
Bob Los Angeles 101 Laptop

1000

Bob

Los Angeles 102 Smartphone 800
Bob Los Angeles 103 Tablet

500

Bob

Los Angeles 104 Headphones 200
Bob Los Angeles 105 Monitor

300

Charlie

Chicago 101 Laptop 1000
Charlie Chicago 102 Smartphone

800

Charlie

Chicago 103 Tablet 500
Charlie Chicago 104 Headphones

200

Charlie

Chicago 105 Monitor 300
David Miami 101 Laptop

1000

David

Miami 102 Smartphone 800
David Miami 103 Tablet

500

David

Miami 104 Headphones 200
David Miami 105 Monitor

300

Giải thích: CROSS JOIN trả về tất cả các kết hợp có thể giữa các hàng trong bảng customers và orders, tạo thành sản phẩm Cartesian của hai bảng. Mỗi hàng của bảng customers được kết hợp với mỗi hàng của bảng orders.

Natural JOIN

Natural join là một loại JOIN trong SQL sử dụng để kết hợp các bảng dựa trên các cột chung có cùng tên và kiểu dữ liệu trong cả hai bảng. NATURAL JOIN tự động phát hiện và sử dụng các cột chung này để thực hiện phép kết hợp mà không cần chỉ định rõ ràng điều kiện kết hợp.

Cú pháp:

SELECT

FROM TableA 

NATURAL JOIN TableB;

Điểm đặc biệt của NATURAL JOIN là:

  • Hai bảng phải có ít nhất một cột chung với cùng tên và kiểu dữ liệu.
  • Kết quả của phép kết hợp chỉ bao gồm các hàng mà giá trị trong các cột chung đó khớp nhau.

Quá trình thực hiện Natural join có thể được hiểu như sau:

  • Natural JOIN có thể tạo tích Descartes của hai bảng (giống như CROSS JOIN), nhưng tùy vào trường hợp mà nó sẽ tạo tích toàn phần hoặc 1 phần
  • Lọc các hàng trong kết quả tích Descartes này sao cho các giá trị trong các cột chung khớp nhau.
  • Chỉ giữ lại các hàng có giá trị khớp và loại bỏ các cột trùng lặp.

Ví dụ:

Giả sử ta có 2 bảng sau:

  • Table A:
ID Name

City

1

Alice Ha Noi
2 Bob

Ho Chi Minh

  • Table B:

ID

Age City

Email

1

25 Ha Noi alice@gmail.com
3 30 Vung Tau

brian@gmail.com

  • Phép kết hợp Natural join giữa TableA và TableB:
SELECT

FROM TableA 

NATURAL JOIN TableB;
  • Kết quả sẽ được:

ID

Name City Age Email
1 Alice Ha Noi 25 alice@gmail.com

Giải thích: mặc dù ở cả 2 bảng đều có cột Id và cột City nhưng NATURAL JOIN chỉ giữ lại các hàng khớp giá trị và loại bỏ các cột trùng lặp nên cột Id và cột City chỉ xuất hiện một lần trong bảng kết quả.

DELETE JOIN là gì?

DELETE JOIN trong SQL là một thao tác cho phép xóa các hàng trong một bảng dựa trên các điều kiện liên quan đến một bảng khác. Bằng cách sử dụng câu lệnh DELETE kết hợp với JOIN, có thể xóa các hàng mà thỏa mãn các điều kiện được định nghĩa thông qua phép kết hợp (join) giữa các bảng.

Tuy nhiên, cần lưu ý rằng cú pháp DELETE JOIN không phải là tiêu chuẩn SQL và có thể không được hỗ trợ ở một số hệ quản trị cơ sở dữ liệu (DBMS). Ngoài ra, cú pháp DELETE JOIN sẽ phụ thuộc vào cú pháp cụ thể của hệ quản trị cơ sở dữ liệu đang được sử dụng. Ví dụ, cú pháp DELETE JOIN trong MySQL có thể khác với trong SQL Server hoặc PostgreSQL.

Cú pháp:

DELETE table1 

FROM table1 

JOIN table2 

ON table1.attribute_name = table2.attribute_name 

WHERE condition;

Ví dụ: 

Giả sử ta có 2 bảng Order và Customer như sau:

  • Bảng Order:

OrderID

CustomerID OrderDate
1 1

2023-01-01

2

2 2023-01-02
3 3

2023-01-03

  • Bảng Customer:

CustomerID

CustomerName
1

Alice

2

Bob
3

Charlie

Để xóa các đơn hàng từ bảng Orders của khách hàng có tên là “Bob”. Câu lệnh DELETE JOIN sẽ như sau:

DELETE

FROM Orders O 

JOIN Customers C 

ON O.CustomerID = C.CustomerID 

WHERE C.CustomerName = 'Bob';

Sau khi thực hiện cú pháp trên thì bảng Order sẽ như sau:

OrderID

CustomerID OrderDate
1 1

2023-01-01

3 3

2023-01-03

Giải thích: Tất cả các hàng trong bảng Orders mà CustomerID tương ứng với khách hàng có tên là “Bob” sẽ bị xóa. Trong bảng Customers, CustomerID của Bob là 2 nên hàng trong Orders có CustomerID là 2 sẽ bị xóa. Còn bảng Customers vẫn giữ nguyên vì chúng ta chỉ xóa các hàng trong bảng Orders.

Câu hỏi thường gặp về cách sử dụng JOIN trong SQL

SELF JOIN là gì?

SELF JOIN là một trường hợp đặc biệt của JOIN trong SQL, trong đó một bảng được kết hợp với chính nó. Thao tác này hữu ích khi bạn cần so sánh các hàng trong cùng một bảng hoặc khi bạn cần truy xuất dữ liệu theo mối quan hệ giữa các hàng trong cùng một bảng.

SQL Server sử dụng những loại phép nối vật lý nào để thực hiện các phép nối logic?

SQL Server sử dụng bốn loại phép nối vật lý để thực hiện các phép nối logic:

  • Nested Loops joins (Phép nối vòng lặp lồng nhau): Là phương pháp nối đơn giản nhất. Với Nested Loops joins, SQL Server lặp qua từng hàng của bảng ngoài và với mỗi hàng, nó tìm kiếm các hàng khớp trong bảng trong. Phép nối này thường được sử dụng khi một trong hai bảng nhỏ hoặc khi chỉ có một số lượng nhỏ các hàng phù hợp từ bảng ngoài.
  • Merge joins (Phép nối hợp nhất): Yêu cầu cả hai bảng đầu vào phải được sắp xếp trước theo cột nối. Khi các bảng đã được sắp xếp, SQL Server có thể hợp nhất hai bảng bằng cách quét cả hai bảng một cách tuần tự và kết hợp các hàng khớp. Phép nối này thường hiệu quả khi cả hai bảng đầu vào đã được sắp xếp theo thứ tự hoặc khi các bảng được sắp xếp bằng cách sử dụng các chỉ mục.
  • Hash joins (Phép nối băm): Sử dụng một bảng băm để nối các hàng. Đầu tiên, SQL Server xây dựng một bảng băm từ bảng đầu vào nhỏ hơn, và sau đó nó quét bảng đầu vào lớn hơn và dò tìm các hàng khớp trong bảng băm. Phép nối này thường được sử dụng khi các bảng đầu vào không được sắp xếp và không có chỉ mục trên các cột nối.
  • Adaptive joins (Phép nối thích ứng): Là một cải tiến mới cho phép SQL Server chọn giữa Nested Loops joins và Hash joins trong thời gian thực, dựa trên số lượng hàng thực tế được xử lý. Điều này giúp tối ưu hóa hiệu suất của các truy vấn trong các tình huống mà số lượng hàng có thể thay đổi đáng kể.

Ngoài JOIN trong SQL thì còn cách nào kết hợp dữ liệu từ nhiều bảng không?

Ngoài việc sử dụng các phép JOIN, ta còn có thể kết hợp dữ liệu từ nhiều bảng bằng cách sử dụng phép UNION. Sự khác biệt cơ bản giữa hai phương pháp này là trong câu lệnh JOIN kết hợp các CỘT từ các bảng khác nhau (dựa trên một cột liên quan), trong khi với UNION kết hợp các DÒNG từ các bảng có cột giống nhau. 

Có thể kết hợp hai bảng mà không có mối quan hệ khóa chính và khóa ngoại không?

Có thể kết hợp hai bảng mà không cần mối quan hệ khóa chính và khóa ngoại. Điều này thường được thực hiện thông qua các điều kiện khác nhau, chẳng hạn như các điều kiện so sánh giữa các cột trong hai bảng. Tuy nhiên, việc sử dụng các mối quan hệ khóa chính và khóa ngoại thường giúp quản lý cơ sở dữ liệu một cách hiệu quả hơn và giảm thiểu sự phức tạp trong việc truy vấn dữ liệu.

Tổng kết cách sử dụng JOIN trong SQL

Như vậy, qua bài viết này, chúng ta đã có cơ hội tìm hiểu về sức mạnh và tầm quan trọng của các phép join trong SQL. Từ INNER JOIN đến LEFT, RIGHT, FULL JOIN và CROSS JOIN, mỗi loại join đều mang lại những cách tiếp cận riêng để kết hợp dữ liệu từ các bảng khác nhau.

Việc hiểu rõ về cách hoạt động của chúng sẽ giúp các chuyên viên phân tích dữ liệu và phát triển ứng dụng tương tác với dữ liệu hiệu quả hơn với khả năng truy vấn và xử lý dữ liệu một cách linh hoạt và chính xác. ITviec hy vọng bài viết trên đã cung cấp cho bạn những thông tin cần thiết về cú pháp và cách sử dụng các phép JOIN trong SQL.