Left outer join là gì

  -  

Học SQL Joins cơ bản: một trong những khái niệm quan trọng nhất trong sử dụng SQL cho Data Analyst.Bạn đang xem: Left outer join là gì

Chào các bạn, chúng ta sẽ tiếp tục chuỗi các bài viết về SQL cơ bản cho một Data Analyst. Nếu các bạn chưa đọc phần 0 thì đọc bài trước tại đây. Còn những bạn khác thì “enjoy your time”.Bạn đang xem: Left outer join là gì

Trong bài viết lần này chúng ta sẽ làm quen với khái niệm mà bắt buộc các bạn phải nắm vững. Mình xin nhấn mạnh lại là các bạn phải thật sự hiểu được sự hoạt động của nó để tránh những khó khăn về sau.

Như tiêu đề, trong loạt bài này mình sẽ giải thích các loại JOINs khác nhau trong SQL và những chú ý khi sử dụng JOINs.

Bạn đang xem: Left outer join là gì

Các loại JOINs cơ bản Inner, Outer, Left và Right JoinsMột số loại JOINs đặc biệt khác Self và Cross, Natural JoinsLàm gì nếu các bạn muốn Join nhiều hơn 2 bảng (3+)Những lưu ý khi thực hiện Join, đặc biệt là từ 3+

Đầu tiên chúng ta cần hiểu được SQL Join là gì và vì sao vận dụng đúng SQL Join lại cực kỳ quan trọng?

Mục Lục

1 SQL JOINs là gì và tại sao lại cần SQL Join?2 4 loại SQL Joins cơ bản

SQL JOINs là gì và tại sao lại cần SQL Join?

Trả lời cho câu hỏi thứ nhất, “SQL Join là gì?”: các bạn hiểu đơn giản là lệnh Join trong SQL giúp chúng ta lấy được dữ liệu từ nhiều bảng khác nhau dựa trên một (hoặc nhiều) trường dữ liệu liên kết.

Một định nghĩa bằng tiếng anh từ W3school:

“A JOIN clause is used to combine rows from two or more tables, based on a related column between them.”

Chỉ có vậy thôi. Không cần suy nghĩ gì nhiều cho phức tạp cả. Những trường dữ liệu liên kết này thường sẽ là một mã (ID) nào đó, hoặc là ngày tháng hoặc một thành phố,…

Vậy tại sao chúng ta lại phải cần đến SQL Joins?

Đọc xong định nghĩa chắc ai cũng có thể tự trả lời câu hỏi này nhĩ…

Đơn giản là dữ liệu của chúng ta sẽ không bao giờ nằm ở một bảng mà sẽ được chia ra nhiều bảng khác nhau. Điều này giúp việc quản lý cơ sở dữ liệu (CSDL) hiệu quả hơn nhiều.

Chính vì vậy chúng ta luôn cần phải sử dụng SQL joins cho việc lấy dữ liệu. Hiện tại mình đang làm một dự án cho bộ phận Sale và mình chả nhớ nỗi là mình dùng đến bao nhiêu bảng dữ liệu khác nhau (-_-!)

Vậy nên các bạn đừng xem nhẹ phần này nhé. Theo mình cảm nhận thì SQL Joins, nếu không quan trọng nhất thì cũng đứng thứ 2.

Cái còn lại sẽ được nói trong các bài sau.

Okay… Vậy cách thức hoạt động của SQL Joins cơ bản như thế nào và sử dụng ra sao?

Cách thức hoạt động và sử dụng cơ bản của SQL Joins


*

Nguồn

SQL Joins được hoạt động dựa trên nguyên tắc đơn giản là thông qua trường dữ liệu liên kết (chung) để lấy dữ liệu từ 2 (hay nhiều) bảng khác nhau. Nếu các bạn học về Relational Database, thì những trường này sẽ THƯỜNG là các Primary Key và Foreign Key. Nhưng không phải lúc nào cũng vậy!

Chúng ta hãy làm quen với cú pháp trước nhé.

Cú pháp sử dụng SQL Joins cơ bản

Cách sử dụng lệnh SQL Joins như sau

Join phải luôn luôn đi SÁT ngay sau lệnh From2 bảng phải có ít nhất một trường dữ liệu chungCú pháp sử dụng:

select Table1 as t1 -- bắt buộc Table2 as t2 -- bắt buộcTrong đó Table1 và Table2 là 2 bảng chúng ta cần nối lại để lấy thông tin. T1 và T2 là tên viết tắt (tên thay thế ngắn gọn) của Table1 và Table2. t1.ID = t2.ID là điều kiện chúng ta nối bảng. Và sẽ quyết định dữ liệu chúng ta lấy ra sẽ có kết quả ntn. Cụ thể từng loại Join và cách sử dụng sẽ được giải thích ở phần sau. Trước tiên chúng ta đến phần giải thích cụ thể hơn cách dùng. 

Cách gộp 2 bảng dữ liệu – SQL Join cơ bản

Để minh họa cho phần này, mình sẽ sử dụng ví dụ trong bài viết trước của mình về công việc của một data analyst (ai chưa đọc thì đọc tại đây nhé).

Chúng ta có 3 bảng dữ liệu khác nhau gồm Orders, Returns và People. Và yêu cầu là kiểm tra xem ở tiểu bang X có bao nhiêu Order bị trả về. Để trả lời cho yêu cầu này, chúng ta cần phải có dữ liệu từ 2 bảng khác nhau là Orders và Returns.

Nhưng để làm được đó, trước tiên, chúng ta cần tìm xem trong bảng Orders và Returns thì cột nào là chung của cả 2 bảng. Dễ dàng thấy được đó sẽ là Order_ID.

Tiếp đến sẽ là những thông tin cần thiết khác như State và Returned.

Cuối cùng chúng ta sẽ có đoạn mã sau đây:

Selec O.State, count (R.Order_ID) as Num_ReturnsFrom Orders as O Right Join Returns as R on R.Order_id = O.Order_idWhere O.State = ‘X’Đối với những bạn chưa đọc bài cơ bản thì đọc lại trước nhé, sau đó sẽ hiểu tại sao lại có lệnh trên nhé.

Đối với các bạn còn lại, chúng ta sẽ thấy có một đoạn code mới ở đây là Right Join Returns as R on R.Order_id = O.Order_id

Nó hoạt động ntn thì đọc tiếp nhé.

4 loại SQL Joins cơ bản

Trong phần này chúng ta sẽ làm quen với 4 loại SQL Join cơ bản mà gần như ngày nào mình cũng dùng ít nhất một. Đặc biệt là LEFT JOIN, đây là kinh nghiệm được sếp chia sẻ (lý do được giải thích phần sau)

Bây giờ mình bắt đầu nhé

Left (Outer) Join và Right (Outer) Join

Đầu tiên giải thích cái tên trước nhé. Left Join và Left Outer Join là một và bạn có thể sử dụng cái nào mình thích. Không có gì khác nhau ở đây. Tương tự với Right Join và Right Outer Join. Vì về mặt bản chất, LEFT JOIN và RIGHT JOIN hoạt động tương tự nhau nên mình gộp chung lại 1 phần.

Phần này mình sẽ nói kỹ một chút để các phần sau các phần sau ko phải nói lại. Không phí thời gian đâu các bạn ha. Cứ hiểu cái gốc xong sau này khỏe lắm.

Trước đây mình hời hợt với phần này vì nghĩ nó đơn giản. Đến lúc đi làm lại loài ra cả núi vấn để. Thế là phải đi đọc lại.

Ok, mình tiếp tục nhé

Vậy LEFT JOIN và RIGHT JOIN hoạt động ntn?

Các bạn xem hình sau trước nhé:

Bây giờ nhìn hình chắc hiểu sơ sơ rồi ha.

Để giải thích kỹ hơn mình sẽ bắt đầu bằng cú pháp trước nhé

Select *From TableA as TALeft (Right) Join TableB as TB on TA.ID = TB.IDKhi các bạn thực hiện bất cứ một phép SQL JOINS nào cũng nên nhớ là Table ở lệnh FROM sẽ là trung tâm chính của cả khối lệnh. Trong ví dụ trên sẽ là TableA.

Sau khi đã có được bảng dữ liệu trung tâm, chúng ta thực hiện gộp (JOIN) các bảng dữ liệu khác đến sau vào với bảng chính, ở đây là TableB.

Lưu ý: dữ liệu chung ở đây được tính theo mỗi dòng dữ liệu (1 row) thỏa điều kiện đưa ra và nó sẽ bao gồm dữ liệu của tất cả các cột (all columns). Hiểu đơn giản là các bạn filter bảng phụ theo điều kiện trước sau đó thực hiện phép Join.

Xem thêm: Nằm Mơ Ăn Thịt Chó Đánh Con Gì ❤️️ Đánh Con Gì, Giải Mã Giấc Mơ Ăn Thịt Chó

Các bạn xem tiếp phần ví dụ nhé.

Left (Outer) Join và Right (Outer) Join (tt)

Để minh họa cụ thể mình sẽ sử dụng 2 bảng dữ liệu là Orders và Returns trong bài viết trước của mình. Nhìn lại hình bên dưới nếu bạn quên nhé.


*

Tiếp theo chúng ta sẽ phân biệt 2 lệnh LEFT và RIGHT qua 2 câu hỏi sau:

Hãy cho biết tổng giá trị của các đơn hàng bị trả lại và không bị trả lạiHãy cho biết tổng giá trị của các đơn hàng bị trả lại

Trả lời cho câu 1: LEFT JOIN

Chúng ta sẽ có được lệnh SQL như sau

Select R.Returned as TraHang, -- yes/nullsum(O.Sales * O.Quantity) as TongGiaTriFrom Order as OLeft join Returns as R on O.Order_id = R.Order IDGroup by TraHangĐầu tiên, vì chúng ta sử dụng LEFT JOIN nên hệ thống sẽ lấy tất cả dữ liệu của bảng Orders trước. Sau đó sẽ thêm những dữ liệu từ bảng Returns tương ứng với điều kiện O.Order_id = R.Order_ID. Chúng ta sẽ có được bảng tương tự như sau

O.Order_IDR.Order_IDTraHangTongGiaTri
CA-2017-125451nullnull2.22
CA-2017-156391CA-2017-156391Yes2.224
CA-2015-146829nullnull2.224
US-2017-102288nullnull2.264
US-2015-128090US-2015-128090Yes2.304

Lúc này bạn sẽ thấy ở cột TraHang và cột R.Order_ID, sẽ có những ô với giá trị là Yes và những ô khác sẽ có giá trị NULL. Cột TraHang và R.Order_ID là cột dữ liệu lấy từ bảng Returns.

Thật ra chữ NULL là mình tự gắn vào, trên thực tế nếu bạn thấy NULL có nghĩa là ô đó đang trống và ko có dữ liệu gì cả.

Lưu ý chỗ này quan trọng nè:

Những ô có giá trị Yes là những ô có giá trị Order_ID cùng xuất hiện ở cả bảng Orders và bảng Returns. Tất cả dữ liệu khác đều được giữ lại. Và …

Những ô có giá trị Order_ID ko liên kết ở bảng Orders sẽ được giữ lại toàn bộ và những trường lấy từ Returns sẽ có giá trị NULL (ko có gì cả). Nhưng những ô có giá trị Oder_ID ko liên kết ở bảng returns sẽ bị loại bỏ tất cả.

Đây là lý do tại sao chúng ta có bảng dữ liệu trên.

Tiếp đến hệ thống sẽ thực hiện gộp các dữ liệu trên thành nhóm là yes hoặc null. Và sau cùng sẽ là thực hiện phép tính tổng giá trị cho mỗi nhóm. Cuối cùng chúng ta được kết quả sau:

TraHangTongGiaTri
null10599341
Yes888721.3

Lúc này chúng ta sẽ có được bảng dữ liệu cho thấy sự khác nhau giữa giá trị của các đơn hàng bị trả lại và những đơn hàng thành công.

Nhìn lại hình của LEFT JOIN chút nha.

Tổng kết: với SQL Left Join, mọi giá trị của bảng dữ liệu chính (Table A) sẽ được giữ nguyên và chỉ lấy thêm những cột dữ liệu từ bảng phụ (Table B) được liên kết theo điều kiện cụ thể. Những ô dữ liệu ko có liên kết từ bảng phụ sẽ được hiển thị là null (ko có giá trị)

Với nguyên tắc tương tự chúng ta đến với câu thứ 2

Câu thứ 2: RIGHT JOIN

Nguyên tắc tương tự như với LEFT JOIN nhé, chỉ khác nhau một vài điểm thôi

Đầu tiên là lệnh SQL, chúng ta thay LEFT thành RIGHT

Select R.Returned as TraHang, -- yes/nullsum(O.Sales * O.Quantity) as TongGiaTriFrom Order as ORight join Returns as R on O.Order_id = R.Order IDGroup by TraHangNgược lại với lệnh LEFT JOIN, bảng dữ liệu sau khi RIGHT JOIN sẽ bao gồm toàn bộ dữ liệu ở bảng Returns (bảng phụ) và chỉ những dữ liệu được liên kết ở bảng Orders (bảng chính). Chúng ta sẽ có kết quả như bảng:

Order_IDOrder_IDTraHangTongGiaTri
CA-2017-140151CA-2017-140151Yes55999.84
CA-2017-100111CA-2017-100111Yes31769.4
CA-2017-123491CA-2017-123491Yes23829.68
CA-2017-166093CA-2017-166093Yes22664.61
US-2015-126214US-2015-126214Yes21038.81

Trường hợp này chúng ta sẽ ko thấy giá trị null vì tất cả các Order_ID ở bảng Returns đều có mặt ở bảng Orders. Nếu các bạn thêm vào một vài điều kiện khác, chúng ta sẽ có thấy có giá trị null. Bài viết sau sẽ đi sâu vào vấn đề này.

Và cuối cùng, hệ thống sẽ tính toán và trả lại kết quả sau

TraHangTongGiaTri
Yes888721.3

Cùng nhìn lại mô hình của RIGHT Join nhé

Tổng kết: Với SQL Right Join, toàn bộ dữ liệu ở bảng phụ (Table B) sẽ được giữ lại cộng với dữ cột liệu liên kết từ bảng chính (Table A). Những ô dữ liệu ko có liên kết từ bảng chính sẽ có giá trị là null.

Đến đây hy vọng là các bạn hiểu được cách thức hoạt động của LEFT JOIN và RIGHT JOIN. Nếu chưa hiểu thì

… hmmm …

Đọc lại lần nữa nhé (-_*)

Từ phần sau mình sẽ dựa trên nguyên tắc phía trên và đi khá nhanh.

Inner Join (Join)

Trước khi mình giải thích các bạn thử nhìn hình đoán nghĩa trước nhé.

Các bạn có 1p để suy nghĩ. Bắt đầu


*

Sao nào? Dựa theo hình bạn có thể đoán được cách thức hoạt động của Inner Join chưa nào?

Nếu các bạn đoán được thì chúc mừng nhé. Còn nếu chưa đoán được thì mình cũng chúc mừng vì bạn đã cố gắng suy nghĩ.

Cách thức hoạt động của Inner Join khá đơn giản. Nó sẽ chỉ trả về những dữ liệu được liên kết giữa 2 bảng. Có nghĩa là chỉ những row có dữ liệu chung thuộc cả 2 bảng mới được giữ lại.

Xem thêm: Xem Tử Vi Trọn Đời Sinh Năm 1954 Tuổi Gì Mệnh Gì? Tuổi Nam 1954 Cung Gì Mệnh Gì

Với 2 bảng dữ liệu trên chúng ta sẽ có lệnh SQL như sau

Order_IDOrder_IDTraHangTongGiaTri
CA-2017-140151CA-2017-140151Yes55999.84
CA-2017-100111CA-2017-100111Yes31769.4
CA-2017-123491CA-2017-123491Yes23829.68
CA-2017-166093CA-2017-166093Yes22664.61
US-2015-126214US-2015-126214Yes21038.81

Bạn sẽ thấy nó giống như là với RIGHT JOIN. Đơn giản là vì trong trường hợp này, bảng Returns là bảng con của Orders và tất cả các Order_ID đều lấy từ bảng Orders gốc. Nếu chúng ta thêm vào một số điều kiện thì kết quả sẽ khác đi. (Giới thiệu trong bài viết sau)

Cuối cùng chúng ta có kết quả sau:

TraHangTongGiaTri
Yes888721.3

Tổng kết: với SQL Inner Join, dữ liệu cuối cùng sẽ chỉ bao gồm những dữ liệu thỏa mãn điều kiện liên kết có ở cả 2 bảng

Full (Outer) Join

Đọc tên thôi chắc cũng hiểu sơ ý nghĩa của nó rồi ha. Chúng ta tiếp tục với xem hình đoán ý nghĩa nhé.

Các bạn có 1p. Bắt đầu!

Hy vọng lần này 100% các bạn sẽ đoán được ý nghĩa của Full Join. Comment phần kết quả của bạn nhé!


*

Giờ đến lượt mình!

Hiểu đơn giản thế này, nó sẽ lấy toàn bộ dữ liệu từ chung từ Table A và Table B cộng với những dữ liệu riêng của từng bảng. Những dòng dữ liệu nào ko có liên kết sẽ có giá trị null.

Chúng ta thử Full Join với 2 bảng dữ liệu trên:

Select R.Returned as TraHang, -- yes/nullsum(O.Sales * O.Quantity) as TongGiaTriFrom Order as OFull Outer Join Returns as R on O.Order_id = R.Order IDGroup by TraHangLúc này các bạn sẽ có bảng dữ liệu sau khi JOIN tương tự như LEFT JOIN phía trên. Lý do là vì bảng Orders có tất cả Order_ID trong bảng Returns. Với những điều kiện phụ chúng ta có thể sẽ có 2 kết quả khác nhau (giải thích trong bài sau)

O.Order_IDR.Order_IDTraHangTongGiaTri
CA-2017-125451nullnull2.22
CA-2017-156391CA-2017-156391Yes2.224
CA-2015-146829nullnull2.224
US-2017-102288nullnull2.264
US-2015-128090US-2015-128090Yes2.304

Và cuối cùng chúng ta sẽ có được kết quả giống hệt với LEFT JOIN

TraHangTongGiaTri
null10599341
Yes888721.3

Tổng kết: vơi FULL Outer Join, chúng ta sẽ có được dữ liệu liên kết từ 2 bảng chính và phụ cộng thêm với những dữ liệu ko liên kết từ cả 2 bảng. Những ô dữ liệu ko liên kết sẽ có giá trị 

Tổng kết

Bài này mình dự kiến sẽ viết chung tất cả nhưng đến lúc viết thì nội dung hơi dài nên sẽ chia ra làm 2 phần. Phần này các bạn đã được giới thiệu sơ về những kiểu SQL Joins cơ bản. Trong phần tiếp theo mình sẽ đi sâu hơn một tí về Join. Viết luôn một lần sau này khỏi phải viết lại. Bài sau sẽ bao gồm những nội dung sau:

Những “biến thể” từ những SQL Joins cơ bảnNhững loại SQL Joins đặc biệt khácNếu bạn muốn join nhiều hơn 2 bảng thì sao (3+)Những lưu ý đặc biệt khi dùng SQL Joins Những kinh nghiệm để dùng SQL Joins một cách hiệu quả nhất

Thực hành

Phần việc của mình cũng xong rồi. Đến lượt các bạn thực hành rồi nhé. Cách tốt nhất để hiểu là thực hành thôi các bạn.

Vậy thực hành ntn?

Các bạn đã có được database mẫu của mình rồi, bây giờ các bạn thực hiện lại tất cả những câu lệnh SQL Join cơ bản trên và sử dụng bảng People và Orders nhé. Nếu chưa có thì lấy nó ở link này

Chắc tốn của các bạn tầm 15p là tối đa cho bài thực hành này thôi.

Nhớ là comment phần code của bạn lên đây nhé! Và chia sẻ ý kiến cũng như kinh nghiệm.

Chúc các bạn vui vẻ! Và hẹn gặp lại các bạn trong phần sau của bài viết với những thông tin nâng cao hơn chút nhé!