Bài đăng nổi bật

JOIN là gì?

JOIN giúp lấy dữ liệu từ hai hoặc nhiều bảng cơ sở dữ liệu. 
Các bảng có liên quan với nhau bằng cách sử dụng khóa chính và khóa ngoài.

Lưu ý: JOIN là chủ đề bị hiểu lầm nhiều nhất trong số các trình tạo SQL. Để đơn giản và dễ hiểu, chúng tôi sẽ sử dụng Cơ sở dữ liệu mới để thực hành mẫu. Như hình dưới đây
idfirst_namelast_namemovie_id
1AdamSmith1
2RaviKumar2
3SusanDavidson5
4JennyAdrianna8
6LeePong10

idtitlecategory
1ASSASSIN'S CREED: EMBERSAnimations
2Real Steel(2012)Animations
3Alvin and the ChipmunksAnimations
4The Adventures of Tin TinAnimations
5Safe (2012)Action
6Safe House(2012)Action
7GIA18+
8Deadline 200918+
9The Dirty Picture18+
10Marley and meRomance
 

Các loại Join


CROSS JOIN
Cross Join là một hình thức JOIN đơn giản nhất khớp với từng hàng từ một bảng cơ sở dữ liệu với tất cả các hàng khác.
Nói cách khác, nó cung cấp cho chúng ta kết hợp của từng hàng của bảng đầu tiên với tất cả các bản ghi trong bảng thứ hai.
Giả sử chúng tôi muốn có được tất cả các hồ sơ thành viên chống lại tất cả các hồ sơ phim, chúng tôi có thể sử dụng kịch bản hiển thị bên dưới để có được kết quả mong muốn của chúng tôi.
Hướng dẫn tham gia MySQL: INNER, OUTER, LEFT, RIGHT, CROSS
SELECT * FROM `movies` CROSS JOIN `members`
Thực thi đoạn script trên trong bàn làm việc của MySQL cho chúng ta kết quả như sau.

idtitle idfirst_namelast_namemovie_id
1ASSASSIN'S CREED: EMBERSAnimations1AdamSmith1
1ASSASSIN'S CREED: EMBERSAnimations2RaviKumar2
1ASSASSIN'S CREED: EMBERSAnimations3SusanDavidson5
1ASSASSIN'S CREED: EMBERSAnimations4JennyAdrianna8
1ASSASSIN'S CREED: EMBERSAnimations6LeePong10
2Real Steel(2012)Animations1AdamSmith1
2Real Steel(2012)Animations2RaviKumar2
2Real Steel(2012)Animations3SusanDavidson5
2Real Steel(2012)Animations4JennyAdrianna8
2Real Steel(2012)Animations6LeePong10
3Alvin and the ChipmunksAnimations1AdamSmith1
3Alvin and the ChipmunksAnimations2RaviKumar2
3Alvin and the ChipmunksAnimations3SusanDavidson5
3Alvin and the ChipmunksAnimations4JennyAdrianna8
3Alvin and the ChipmunksAnimations6LeePong10
4The Adventures of Tin TinAnimations1AdamSmith1
4The Adventures of Tin TinAnimations2RaviKumar2
4The Adventures of Tin TinAnimations3SusanDavidson5
4The Adventures of Tin TinAnimations4JennyAdrianna8
4The Adventures of Tin TinAnimations6LeePong10
5Safe (2012)Action1AdamSmith1
5Safe (2012)Action2RaviKumar2
5Safe (2012)Action3SusanDavidson5
5Safe (2012)Action4JennyAdrianna8
5Safe (2012)Action6LeePong10
6Safe House(2012)Action1AdamSmith1
6Safe House(2012)Action2RaviKumar2
6Safe House(2012)Action3SusanDavidson5
6Safe House(2012)Action4JennyAdrianna8
6Safe House(2012)Action6LeePong10
7GIA18+1AdamSmith1
7GIA18+2RaviKumar2
7GIA18+3SusanDavidson5
7GIA18+4JennyAdrianna8
7GIA18+6LeePong10
8Deadline(2009)18+1AdamSmith1
8Deadline(2009)18+2RaviKumar2
8Deadline(2009)18+3SusanDavidson5
8Deadline(2009)18+4JennyAdrianna8
8Deadline(2009)18+6LeePong10
9The Dirty Picture18+1AdamSmith1
9The Dirty Picture18+2RaviKumar2
9The Dirty Picture18+3SusanDavidson5
9The Dirty Picture18+4JennyAdrianna8
9The Dirty Picture18+6LeePong10
10Marley and meRomance1AdamSmith1
10Marley and meRomance2RaviKumar2
10Marley and meRomance3SusanDavidson5
10Marley and meRomance4JennyAdrianna8
10Marley and meRomance6LeePong10

INNER JOIN

THAM GIA bên trong được sử dụng để trả về các hàng từ cả hai bảng thỏa mãn điều kiện đã cho.
Giả sử, bạn muốn có được danh sách các thành viên đã thuê phim cùng với các tựa phim được họ thuê. Bạn chỉ có thể sử dụng INNER JOIN cho điều đó, trả về các hàng từ cả hai bảng thỏa mãn với các điều kiện đã cho.
Hướng dẫn tham gia MySQL: INNER, OUTER, LEFT, RIGHT, CROSS

SELECT members.`first_name` , members.`last_name` , movies.`title`
FROM members ,movies
WHERE movies.`id` = members.`movie_id`
Thực hiện các kịch bản trên cho
first_namelast_nametitle
AdamSmithASSASSIN'S CREED: EMBERS
RaviKumarReal Steel(2012)
SusanDavidsonSafe (2012)
JennyAdriannaDeadline(2009)
LeePongMarley and me
Lưu ý kịch bản kết quả trên cũng có thể được viết như sau để đạt được kết quả tương tự.
SELECT A.`first_name` , A.`last_name` , B.`title`
FROM `members`AS A
INNER JOIN `movies` AS B
ON B.`id` = A.`movie_id`

OUTER JOIN

Outer Join trả về tất cả các bản ghi khớp từ cả hai bảng.
Nó có thể phát hiện các bản ghi không có kết quả khớp trong bảng đã tham gia. Nó trả về giá trị NULL cho các bản ghi của bảng đã tham gia nếu không tìm thấy kết quả khớp.
Nghe có vẻ khó hiểu? Hãy xem xét một ví dụ -

LEFT JOIN

Giả sử bây giờ bạn muốn có được tiêu đề của tất cả các bộ phim cùng với tên của các thành viên đã thuê chúng. Rõ ràng là một số bộ phim đã không được thuê bởi bất kỳ ai. Chúng ta chỉ đơn giản có thể sử dụng LEFT JOIN cho mục đích này.
 LEFT JOIN trả về tất cả các hàng từ bảng bên trái ngay cả khi không tìm thấy hàng phù hợp trong bảng bên phải. Trường hợp không tìm thấy kết quả phù hợp trong bảng bên phải, NULL được trả về.
SELECT A.`title` , B.`first_name` , B.`last_name`
FROM `movies` AS A
LEFT JOIN `members` AS B
ON B.`movie_id` = A.`id`
 Bạn có thể thấy rằng trong kết quả trả về được liệt kê bên dưới, đối với các phim không được thuê, các trường tên thành viên đang có giá trị NULL. Điều đó có nghĩa không có thành viên phù hợp với tìm thấy bảng thành viên cho rằng bộ phim cụ thể.
titlefirst_namelast_name
ASSASSIN'S CREED: EMBERSAdamSmith
Real Steel(2012)RaviKumar
Safe (2012)SusanDavidson
Deadline(2009)JennyAdrianna
Marley and meLeePong
Alvin and the ChipmunksNULLNULL
The Adventures of Tin TinNULLNULL
Safe House(2012)NULLNULL
GIANULLNULL
The Dirty PictureNULLNULL
Note: Null is returned for non-matching rows on right

RIGHT JOIN

RIGHT JOIN rõ ràng là trái ngược với LEFT JOIN. RIGHT JOIN trả về tất cả các cột từ bảng bên phải ngay cả khi không tìm thấy hàng phù hợp trong bảng bên trái. Trường hợp không tìm thấy kết quả trùng khớp trong bảng bên trái, NULL được trả về.
Trong ví dụ của chúng tôi, hãy giả sử rằng bạn cần lấy tên của các thành viên và phim do họ thuê. Bây giờ chúng tôi có một thành viên mới chưa thuê bất kỳ bộ phim nào
Hướng dẫn tham gia MySQL: INNER, OUTER, LEFT, RIGHT, CROSS

SELECT  A.`first_name` , A.`last_name`, B.`title`
FROM `members` AS A
RIGHT JOIN `movies` AS B ON B.`id` = A.`movie_id` 
Thực thi đoạn script trên trong bàn làm việc của MySQL cho kết quả như sau.
first_namelast_nametitle
AdamSmithASSASSIN'S CREED: EMBERS
RaviKumarReal Steel(2012)
SusanDavidsonSafe (2012)
JennyAdriannaDeadline(2009)
LeePongMarley and me
NULLNULLAlvin and the Chipmunks
NULLNULLThe Adventures of Tin Tin
NULLNULLSafe House(2012)
NULLNULLGIA
NULLNULLThe Dirty Picture
Lưu ý: Null được trả về cho các hàng không khớp ở bên trái

Mệnh đề "ON" và "USING"

Trong các ví dụ truy vấn THAM GIA ở trên, chúng tôi đã sử dụng mệnh đề ON để khớp với các bản ghi giữa bảng.
Điều khoản sử dụng cũng có thể được sử dụng cho cùng một mục đích. Sự khác biệt với SỬ DỤNG là nó cần phải có tên giống hệt nhau cho các cột khớp trong cả hai bảng.
 Trong bảng "phim" cho đến nay, chúng tôi đã sử dụng khóa chính của nó với tên "id". Chúng tôi đã đề cập đến cùng trong bảng "thành viên" với tên "movie_id".
Hãy đổi tên trường "phim" bảng "id" để có tên "movie_id". Chúng tôi làm điều này để có tên trường trùng khớp.
ALTER TABLE `movies` CHANGE `id` `movie_id` INT( 11 ) NOT NULL AUTO_INCREMENT;
Tiếp theo, hãy sử dụng SỬ DỤNG với ví dụ TRÊN TRÁI trên.
SELECT A.`title` , B.`first_name` , B.`last_name`
FROM `movies` AS A
LEFT JOIN `members` AS B
USING ( `movie_id` )
Ngoài việc sử dụng ON và USING with JOINs, bạn có thể sử dụng nhiều mệnh đề MySQL khác như GROUP BY, WHERE và thậm chí các chức năng như SUM , AVG , v.v.
Tại sao chúng ta nên sử dụng JOIN?
Bây giờ bạn có thể nghĩ, tại sao chúng ta sử dụng JOIN khi chúng ta có thể thực hiện cùng một tác vụ chạy truy vấn. Đặc biệt nếu bạn có một số kinh nghiệm về lập trình cơ sở dữ liệu, bạn biết rằng chúng ta có thể chạy từng truy vấn một, sử dụng đầu ra của từng truy vấn liên tiếp. Tất nhiên, điều đó là có thể. Nhưng bằng cách sử dụng JOIN, bạn có thể hoàn thành công việc bằng cách chỉ sử dụng một truy vấn với bất kỳ tham số tìm kiếm nào. 
Mặt khác, MySQL có thể đạt được hiệu suất tốt hơn với JOIN vì nó có thể sử dụng Lập chỉ mục. Chỉ cần sử dụng truy vấn JOIN duy nhất thay vì chạy nhiều truy vấn sẽ giảm chi phí máy chủ. Thay vào đó, sử dụng nhiều truy vấn sẽ dẫn đến việc chuyển nhiều dữ liệu hơn giữa MySQL và các ứng dụng (phần mềm). Hơn nữa, nó đòi hỏi nhiều thao tác dữ liệu hơn trong ứng dụng cuối cùng.
Rõ ràng là chúng ta có thể đạt được hiệu suất ứng dụng và MySQL tốt hơn bằng cách sử dụng JOIN
 Tóm lược
  • JOIN cho phép chúng tôi kết hợp dữ liệu từ nhiều hơn một bảng vào một tập kết quả.
  • JOIN có hiệu suất tốt hơn so với các truy vấn phụ
  • INNER JOINS  chỉ trả về các hàng đáp ứng các tiêu chí nhất định.
  • OUTER JOINS cũng có thể trả về các hàng mà không tìm thấy kết quả khớp nào. Các hàng chưa từng có được trả về với từ khóa NULL.
  • Các loại JOIN chính bao gồm Nội, Bên trái, Bên ngoài Bên phải, THAM GIA chéo, v.v.
  • Mệnh đề thường được sử dụng trong các hoạt động JOIN là "ON". Mệnh đề "USING" yêu cầu các cột khớp phải cùng tên.
  • JOINS cũng có thể được sử dụng trong các mệnh đề khác, chẳng hạn như GROUP BY, WHERE, SUB QUERIES, AGGREGATE FUNCTIONS etc.

Post a Comment

Mới hơn Cũ hơn