Nội dung chính
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
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
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
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
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
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 |
|
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 | |
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 O 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.