Ý nghĩa và các kiểu Joins trong SQL




 Trước khi vào vấn đề chính thì đầu tiên chúng ta cần phải hiểu join là gì trước ?

Join là gì ?

Trong SQL, Join là một thao tác kết hợp hai hoặc nhiều bảng dữ liệu để tạo thành một bảng duy nhất. Join được sử dụng để kết hợp dữ liệu từ các bảng khác nhau để có thể phân tích dữ liệu một cách hiệu quả hơn. Khi bạn cần truy vấn các cột dữ liệu từ nhiều bảng khác nhau để trả về trong cùng một tập kết quả, bạn cần dùng Join, SQL sẽ tạo ra một bảng tạm thời chứa dữ liệu kết quả từ Join. 
Có nhiều loại Join khác nhau, mỗi loại Join có một cách kết hợp dữ liệu từ các bảng khác nhau,  một số loại Join phổ biến như là Left Join, Right Join, Inner Join, Full Join. Chúng ta sẽ lần lượt tìm hiểu mỗi loại Join này hoạt động như nào.

Left Join

Left Join trả về tất cả hàng bảng bên trái (trong câu lệnh SQL), ngay cả khi không có sự phù hợp trong bảng bên phải, còn những hàng nào của bảng bên phải phù hợp với bảng trái thì dữ liệu hàng đó được dùng để kết hợp với hàng ở bảng trái, nếu không có dữ liệu sẽ Null.


Chúng ta có ví dụ như sau : 
Person table:
+----------+----------+-----------+
| personId | lastName | firstName |
+----------+----------+-----------+
| 1        | Wang     | Allen     |
| 2        | Alice    | Bob       |
+----------+----------+-----------+
Address table:
+-----------+----------+---------------+------------+
| addressId | personId | city          | state      |
+-----------+----------+---------------+------------+
| 1         | 2        | New York City | New York   |
| 2         | 3        | Hoai Nam City      | California |
+-----------+----------+---------------+------------+
Chúng ta có 2 bảng dư liệu là Person và Address, chúng ta sẽ dùng phép Left Join để Join hai bảng lại với nhau.

Select lastName, firstName 
From Person Left Join Address 
On (Person.personId=Address.personId)Inner Join

Kết quả trả về: 
| lastName | firstName |
| -------- | --------- |
| Wang     | Allen     |
| Alice    | Bob       |
Kết quả trả về bên trên là toàn bộ dữ liệu ở bảng Person, nhưng nếu ta lấy thêm một vài thông tin ở bảng Address nữa thì sẽ có kết quả sẽ thay đổi ra sao.

Select lastName, firstName, city
From Person left Join Address 
On (Person.personId=Address.personId)

| lastName | firstName | city          |
| -------- | --------- | ------------- |
| Wang     | Allen     | null          |
| Alice    | Bob       | New York City |

Kết quả vẫn trả về là toàn bộ dữ của bảng bên trái Person và thêm cột dữ liệu city của bảng Address, nhưng chú ý là có một dòng kết quả Null, bởi vì personId=1 không có tồn tại trong bảng Address, nên thông tin của Person với id=1 này là Null. Như đã định nghĩa đã nói nếu không có sự phù hợp nào từ bảng bên phải thì sẽ trả về kết quả là Null.

Right Join

Right Join hoạt động tương tự như Left Join nhưng theo chiều ngược lại. Right Join trả về tất cả các hàng từ bảng bên phải của join, ngay cả khi không có hàng khớp với bảng bên trái. Các hàng không khớp trong bảng bên trái sẽ có giá trị là Null.




Với ví dụ tương tự như Left Join. Lần này chúng ta sẽ sử dụng Right Join để xem kết quả trả về như nào. 
Select lastName, firstName
From Person Right Join Address 
On (Person.personId=Address.personId)

Kết quả: 
| lastName | firstName |
| -------- | --------- |
| Alice    | Bob       |
| null     | null      |

Kết quả trả về bên trên chỉ có 2 hàng và một hàng có giá trị là Null, dựa vào dữ liệu của bảng Address, chỉ có Person có id=2 là có địa chỉ, person còn lại có personId=3 có trong bảng Address nhưng không có trong bảng Person nên kết quả trả về cho lastName và firstName đều là Null.

Inner Join

Inner Join trả về các hàng có giá trị khớp trong cả hai bảng, loại bỏ các hàng không khớp. Công dụng của Inner Join là kết hợp dữ liệu từ các bảng khác nhau dựa trên một số tiêu chí chung và truy xuất thông tin chi tiết từ các bảng liên quan.



Cũng với ví dụ bên trên, chúng ta cùng nhìn lại dữ liệu từ hai bảng Person và Address: 
Person table:
+----------+----------+-----------+
| personId | lastName | firstName |
+----------+----------+-----------+
| 1        | Wang     | Allen     |
| 2        | Alice    | Bob       |
+----------+----------+-----------+
Address table:
+-----------+----------+---------------+------------+
| addressId | personId | city          | state      |
+-----------+----------+---------------+------------+
| 1         | 2        | New York City | New York   |
| 2         | 3        | Hoai Nam City      | California |
+-----------+----------+---------------+------------+ 

Lần này chúng ta sẽ sử dụng câu lệnh Inner Join: 
Select lastName, firstName
From Person Inner Join Address 
On (Person.personId=Address.personId)

Kết quả trả về: 
| lastName | firstName |
| -------- | --------- |
| Alice    | Bob       |

Ta có thể  thấy, kết quả trả về lần này chỉ có person có id=2 vì person này có thông tin tại cả hai bảng Person và Address. 

Full Join

Full Join trong SQL trả về tất cả bản ghi ở bảng trái và bảng phải kết hợp lại. Nói cách khác, mệnh đề này là kết hợp kết quả của cả hai loại Left Join và Right Join.
Bảng được kết hợp sẽ chứa tất cả hàng từ cả hai bảng và điền vào đó giá trị Null cho các giá trị không khớp nhau.


Với ví dụ như trên nhưng khi ta dùng Full Join thì kết quả sẽ trả về là:
SELECT lastName, firstName 
From Person Full Join Address 
On (Person.personId=Address.personId) 

| lastName | firstName |
| -------- | --------- |
| Wang     | Allen     |
| Alice    | Bob       |
| Alice    | Bob       |
| null     | null      |

Ta có thể thấy kết quả trả về ở Full Join, chính là kết quả của Left Join và Right Join kết hợp lại
Left Join:
| lastName | firstName |
| -------- | --------- |
| Wang     | Allen     |
| Alice    | Bob       |

Right Join: 
| lastName | firstName |
| -------- | --------- |
| Alice    | Bob       |
| null     | null      |

Tại sao cần dùng Join

Để kết hợp dữ liệu từ các bảng khác nhau: Nếu ta có dữ liệu được lưu trữ trong nhiều bảng khác nhau, ta có thể sử dụng Join để kết hợp dữ liệu từ các bảng này lại với nhau để tạo thành một bảng duy nhất. Điều này có thể giúp ta phân tích dữ liệu một cách hiệu quả hơn.
Để tìm các mối quan hệ giữa các bảng: Join có thể được sử dụng để tìm các mối quan hệ giữa các bảng. Ví dụ: Như ở ví dụ trên, ta có thể dùng Join để tìm các person đã có thông tin address. 
Và dùng Join là cách tốt nhất để kết hợp dữ liệu với một hoặc nhiều bảng. 

Reference

https://www.w3schools.com/sql/sql_join.asp 
https://learn.microsoft.com/en-us/sql/relational-databases/performance/joins?view=sql-server-ver16 
https://www.quora.com/Why-is-SQL-join-needed
https://www.geeksforgeeks.org/sql-join-set-1-inner-left-right-and-full-joins/ 
https://www.sqlshack.com/learn-sql-inner-join-vs-left-join/

Post a Comment

Comment

Previous Post Next Post
WANG !!!!!
https://s.shopee.vn/609U3II1Xf