Truy vấn dữ liệu – Liên kết nhiều bảng dữ liệu

Liên kết nhiều bảng dữ liệu
Liên kết nhiều bảng dữ liệu

Trong nhiều trường hợp, để rút trích được đầy đủ dữ liệu. Chúng ta cần liên kết nhiều bảng dữ liệu lại với nhau và truy vấn thông tin từ chúng. Sau khi thuần thục với các thao tác truy xuất dữ liệu trên từng bảng đơn lẻ. Tới bài viết này, chúng ta sẽ tìm hiểu cách kết nối các bảng dữ liệu lại. Để rút trích được dữ liệu hoàn chỉnh nhất.

Tiền đề

Khi làm việc với CSDL Chinook, các bạn đã thấy, các đối tượng được phân tách và lưu vào các bảng khác nhau. Mọi thứ rất ổn, ngoại trừ chúng ta chưa thể lấy hết thông tin cần thiết trong câu truy vấn. Ví dụ, khi truy vấn các bài hát trong bảng Track, chúng ta nhận được giá trị GenreId. Để biết chính xác chúng là thể loại gì. Chúng ta cần thêm 1 câu truy vấn khác.

Chắc chắn, CSDL quan hệ được thiết kế ra không với mục đích làm phiền chúng ta như vậy. Dựa vào sự liên kết giữa các bảng (chúng ta có thể thấy rõ qua ràng buộc khóa ngoại). Chúng ta có thể kết hợp dữ liệu giữa các bảng và trích xuất những phần cần thiết. Tất nhiên là chỉ trong 1 câu truy vấn duy nhất.

Cú pháp

Để làm được điều đó, T-SQL cung cấp cho chúng ta cú pháp JOIN. Với cú pháp JOIN, chúng ta có thể kết nối các bảng dữ liệu trong mệnh đề FROM lại với nhau.

Cú pháp cũng rất đơn giản bao gồm 2 phần:

  • Tên 2 bảng liên kết với nhau, giữa tên hai bảng sẽ là phương thức nối. Có 4 phương thức nối 2 bảng dữ liệu là:
    • INNER JOIN
    • LEFT JOIN
    • RIGHT JOIN
    • FULL JOIN
  • Điều kiệu liên kết. Các bạn có thể hiểu một cách đơn giản, điều kiện liên kết mô tả cách mà các dữ liệu trong 2 bảng liên kết với nhau. Ví dụ: trong bảng ‘Sinh Viên’ có một thuộc tính ‘Lớp’. Giá trị của thuộc tính này là mã lớp học. Trong bảng ‘Lớp Học’ có một thuộc tính là ‘Mã Lớp’.  Vậy, đứng trên khía cạnh chúng ta làm thủ công. Chúng ta sẽ lấy thuộc tính ‘Lớp’ của 1 sinh viên dò vào thuộc tính ‘Mã Lớp’ trong bảng ‘Lớp’ để biết được 1 sinh viên đang thuộc lớp nào. Vậy điều kiện liên kết trong ví dụ này là [Sinh Viên].[Lớp] = [Lớp Học].[Mã Lớp]

Tiếp theo, chúng ta sẽ tìm hiểu kỹ hơn về 4 phương pháp kết bảng. Với từng phương thức, chúng ta sẽ thực hiện các ví dụ để hiểu rõ hơn.

(INNER) JOIN

Phương thức INNER JOIN cho chúng ta kết các cột dữ liệu từ các dòng tương ứng trong 2 bảng dữ liệu. Như hình minh họa bên dưới, bạn có thể dễ dàng nhận thấy, kết quả của INNER JOIN chỉ bao gồm những dòng dữ liệu có mối trương quan từ 2 bảng.

inner join

Để hiểu rõ hơn về phép kết này. Các bạn hãy xem thêm 1 ví dụ bên dưới:

mô tả inner join
mô tả inner join

Rất tường minh đúng không nào. Bây giờ chúng ta hãy thử truy vấn vài bài hát đầu tiên trong bảng Track, liên kết nó với bảng Genre. Thay vì chúng ta nhận về giá trị GenreId, bây giờ chúng ta sẽ lấy giá trị Name trong bảng Genre nhé.

Và đây là kết quả của mình:

kết quả truy vấn
kết quả truy vấn

Nhìn vào kết quả và phân tích kỹ câu truy vấn, có một vài điểm các bạn cần lưu ý.

  • Mệnh đề WHERE. Sau phép kết INNER JOIN, những dữ liệu có mối liên hệ của cả 2 bảng sẽ được liên kết lại thành một bảng dữ liệu tạm thời (nhìn hình minh họa thứ 2). Chúng ta có thể tiếp tục sử dụng mệnh đề WHERE để lọc dữ liệu trong bảng kết quả của phép kết.
  • Bí danh, trong trường hợp này rất quan trọng. Cả 2 bảng dữ liệu của chúng ta đều có thuộc tính Name. Lúc này có một vài trường hợp có thể xảy ra.

Trường hợp 1

Các bạn không có mô tả rõ ràng cần truy vấn thuộc tính Name của bảng nào. Hệ thống sẽ trả về một lỗi.

Trường hợp 2

Không sử dụng bí danh

Câu truy vấn này vẫn hợp lệ, nhưng kết quả trả về không được tường minh lắm:

Trường hợp 3

Câu truy vấn đầy đủ thông tin và tường minh như trong ví dụ của mình. Qua đó, chúng ta có thể thấy, khi lượng dữ liệu nhiều lên. Chúng ta cần kết hợp các kỹ thuật của SQL thật nhuần nhuyễn để câu truy vấn có kết quả chính xác và rõ ràng nhất.

LEFT (OUTER) JOIN

Phương thức kết LEFT OUTER JOIN sẽ trả về kết quả gồm:

  • Tất cả các dòng dữ liệu có mối liên hệ giữa bảng 1 và bảng 2. Các bạn có thể nhìn hình minh họa phía dưới. Phần giao chính là INNER JOIN.
  • Tất cả các dòng dữ liệu của bảng 1 còn lại, và các thuộc tính của bảng 2 sẽ bị giá trị NULL. Trong trường hợp ở bảng 2 không có dòng dữ liệu tương ứng.

Left join

Để hiểu rõ hơn về phép kết này. Các bạn hãy xem thêm 1 ví dụ bên dưới:

Mô tả left join
Mô tả left join

Có thể giải thích ngắn gọn. Khi sử dụng phương thức LEFT OUTER JOIN. Tất cả các dòng dữ liệu trong bảng bên trái đều xuất hiện trong kết quả. Các dòng dữ liệu tương ứng ở bảng bên phải sẽ được điền giá trị vào. Nếu dòng dữ liệu ở bảng bên trái không có dữ liệu tương ứng. Hệ thống sẽ điền giá trị NULL vào chỗ trống.

Để minh họa cho ví dụ này, chúng ta nhìn lại CSDL Chinook

Liên kết 2 bảng dữ liệu
Liên kết 2 bảng dữ liệu

Trong mối quan hệ này, có một số ca sĩ sẽ không phát hành Album nào. Nhưng mình vẫn muốn liệt kê tất cả các ca sĩ và Album tương ứng của họ. Nếu mình sử dụng phương thức INNER JOIN khi các ca sĩ không có Album. Nghĩa là ở bảng Album không có dữ liệu tương ứng. Hệ thống sẽ loại bỏ ca sĩ đó ra khỏi kết quả. Lúc này, mình sẽ cần đến LEFT OUTER JOIN. Như đã trình bày và giải thích chi tiết phía trên. Tất cả ca sĩ sẽ xuất hiện trong kết quả. Nếu Album tương ứng được tìm thấy, nó sẽ xuất hiện. Nếu không giá trị NULL sẽ được điền bào cột tương ứng.

Và kết quả mình nhận được:

kết quả truy vấn
kết quả truy vấn

Các bạn có thể copy và thực thi câu truy vấn trên, để có thể xem được toàn bộ kết quả nhé.

RIGHT (OUTER) JOIN

Ngược lại với LEFT OUTER JOIN. Ở một số hệ quản trị CSDL khác, phương thức RIGHT OUTER JOIN có thể bị loại bỏ. Chúng ta có thể sử dụng LEFT OUTER JOIN và thay thế vị trí các bảng dữ liệu cho phù hợp là được.

Về mọi thứ RIGHT OUTER JOIN đều tương tự LEFT OUTER JOIN. Chỉ khác về chiều dữ liệu. Do đó, mình sẽ để các bạn tự tìm ví dụ và kiểm chứng nhé.

right join

FULL (OUTER) JOIN

Theo lý thuyết, chúng ta có FULL OUTER JOIN là sự kết hợp của LEFT OUTER JOIN và RIGHT OUTER JOIN. Kết quả sẽ tự động điền giá trị NULL cho các thuộc tính mà dòng dữ liệu của nó không khớp với bảng kia.

full outer join

Kết nhiều hơn 2 bảng dữ liệu

Trong thực tế, chúng ta thường gặp các trường hợp kết từ 2 đến 3 bảng dữ liệu lại với nhau. Nhưng cũng có một số trường hợp cần nhiều hơn thế nữa.

Và nếu để ý kỹ, trong CSDL Chinook của chúng ta. Để lấy được cùng lúc thông tin giữa bài hát và nhạc sĩ. Chúng ta cần liên kết tận 3 bảng dữ liệu lại với nhau.

Liên kết 3 bảng dữ liệu
Liên kết 3 bảng dữ liệu

Nhìn thì có vẻ phức tạp, nhưng trong những trường hợp này. Chúng ta chỉ cần bình tĩnh, kết lần lượt từng bảng lại với nhau và sử dụng mệnh đề WHERE để lọc dữ liệu muốn lấy. Mình sẽ ví dụ một câu truy vấn: tất cả tên bài hát, tên album và tên ca sĩ của ca sĩ có id = 20:

Các bạn hãy thực thi câu truy vấn này và xem kết quả nhé. Và quan trọng hơn hết, khi chúng ta hiểu rõ về CSDL của mình. Nắm vững các lý thuyết căn bản. Thì dù dữ liệu nằm trải như thế nào, chúng ta cũng sẽ luôn tìm được giải pháp để truy vấn những dữ liệu chúng ta cần.

Lưu ý

Có thể đặt bí danh cho bảng

Trong ví dụ tại phương thức INNER JOIN. Chúng ta đã thấy những rắc rối khi các bảng dữ liệu có các thuộc tính trùng tên. Trong thực tế, chúng ta cũng gặp phải rất nhiều những trường hợp tương tự. Dưới đây là một ví dụ khác, mình muốn truy vấn họ tên khách hàng và họ tên nhân viên hỗ trợ tương ứng. Nhưng tên bảng Customer và Employee cũng tương đối dài. Do đó, mình đặt bí danh cho cả 2 bảng. Và sử dụng bí danh trong cả câu truy vấn ở tất cả các mệnh đề khác. Thật tiện đúng không nào.

Các bạn nhớ copy và thực thi thử câu truy vấn trên để xem kết quả nhé.

Rút ngắn tên phương thức

Các bạn có thể thấy, ở tiêu đề các phương thức kết. Mình có sử dụng dấu ngoặc tròn. Ví dụ (INNER) JOIN hay LEFT (OUTER) JOIN. Các tính từ INNER và OUTER chỉ có công dụng làm cho câu truy vấn thêm tường minh. Các bạn có thể bỏ nó đi để rút gọn câu truy vấn của mình.

Tuy nhiên, đó là khi bạn đi làm, tham gia các dự án thực tế. Cần tối ưu về không gian và thời gian. Còn bây giờ, trong lúc các bạn đang tìm hiểu về SQL. Chúng ta hãy cứ cố gắng viết những câu truy vấn tường minh nhất có thể nhé.