Khóa học
SQL Server là một hệ quản trị cơ sở dữ liệu quan hệ. Một trong những nguyên tắc cốt lõi của cơ sở dữ liệu quan hệ là dữ liệu được lưu trữ trên nhiều bảng.

Chúng ta sẽ cần có khả năng nối các bảng với nhau để trích xuất dữ liệu cần thiết. Ta dùng các khóa primary và foreign để nối bảng.
Khóa chính
Khóa chính là một cột dùng để nhận diện duy nhất mỗi hàng trong một bảng. Tính duy nhất này có thể đạt được bằng cách dùng số nguyên tuần tự làm cột định danh. Hoặc đôi khi, các cột hiện có vốn dĩ đã chứa giá trị duy nhất và có thể sử dụng được.
Trong ví dụ dưới đây, ta thấy vài hàng đầu tiên từ bảng artist. Bảng có hai cột, artist_id và name. Cột artist_id đóng vai trò khóa chính cho bảng này, là cột số nguyên và mỗi giá trị đều khác nhau.
+-----------+-------------------+
| artist_id | name |
|-----------+-------------------|
| 1 | AC/DC |
| 2 | Accept |
| 3 | Aerosmith |
| 4 | Alanis Morissette |
| 5 | Alice In Chains |
+-----------+-------------------+
Bây giờ hãy xem bảng album. Bạn có nhận ra khóa chính không? Đúng vậy, đó là cột album_id. Thông thường khóa chính được đặt tên theo kiểu "tên-bảng gạch dưới id". Nhưng bạn cũng sẽ để ý có cột artist_id. Cột này cũng là số nguyên và trùng tên với cột artist_id trong bảng artist. Điều này có ý nghĩa gì?
+----------+-------------------------+-----------+
| album_id | title | artist_id |
|----------+-------------------------+-----------|
| 1 | For Those About To Rock | 1 |
| 2 | Balls to the Wall | 2 |
| 3 | Restless and Wild | 2 |
| 4 | Let There Be Rock | 1 |
| 5 | Big Ones | 3 |
+----------+-------------------------+-----------+
Khóa ngoại
Từ kết quả trước, rõ ràng artist_id trong bảng artist đóng vai trò là Foreign_key đối với bảng album. Ràng buộc FOREIGN KEY được dùng để ngăn các hành động có thể phá vỡ liên kết giữa các bảng.
- Bảng
artist
+-----------+-------------------+
| artist_id | name |
|-----------+-------------------|
| 1 | AC/DC |
| 2 | Accept |
| 3 | Aerosmith |
| 4 | Alanis Morissette |
| 5 | Alice In Chains |
+-----------+-------------------+
- Bảng
album
+----------+-------------------------+-----------+
| album_id | title | artist_id |
|----------+-------------------------+-----------|
| 1 | For Those About To Rock | 1 |
| 2 | Balls to the Wall | 2 |
| 3 | Restless and Wild | 2 |
| 4 | Let There Be Rock | 1 |
| 5 | Big Ones | 3 |
+----------+-------------------------+-----------+
Điều này có nghĩa là khi artist_id trong bảng album khớp với artist_id trong bảng artist, các hàng đó có thể được liên kết như một phép JOIN.
Nối bảng Album và Artist
Hàng 1 và 4 của bảng artist có artist_id bằng 1. artist_id 1 trong bảng artist là AC/DC. Vì vậy, khi nối hai bảng lại với nhau, ta trả về thông tin album từ bảng album, và thông tin nghệ sĩ tương ứng từ bảng artist - được nối bằng trường artist_id, vốn chung cho cả hai bảng.
Đây được gọi là phép nối inner.
SELECT
album_id,
title,
album.artist_id,
name AS artist_name
FROM album
INNER JOIN artist ON artist.artist_id = album.artist_id
WHERE album.artist_id = 1;
+----------+-------------------------+-----------+-------------+
| album_id | title | artist_id | artist_name |
|----------+---------------------------------------+-----------|
| 1 | For Those About To Rock | 1 | AC/DC |
| 4 | Let There Be Rock | 1 | AC/DC |
+----------+-------------------------+-----------+-------------|
Chúng ta đã nối các bảng album và artist bằng cách khớp artist_id từ bảng artist với artist_id trong bảng album.
Khi chọn các cột trùng tên từ những bảng khác nhau, bạn phải định danh đầy đủ tên cột. Nếu không, SQL Server sẽ không biết phải SELECT cột đó từ bảng nào.
Để định danh đầy đủ một cột, bạn phải thêm tiền tố là tên bảng tương ứng, theo sau là dấu chấm.
Cú pháp Inner Join
Dưới đây là ví dụ tổng quát để nhắc bạn về cú pháp. Khi ta chọn các cột liên quan từ bảng chính, trong trường hợp này là table_A, sau đó chọn bất kỳ cột bổ sung nào muốn nối đến, ở đây là table_B. Rồi ta chỉ định phép nối bằng các từ khóa INNER JOIN và ON, cung cấp các cột khóa cần thiết từ cả hai bảng.
SELECT
table_A.columnX,
table_A.columnY,
table_B.columnZ,
FROM table_A
INNER JOIN table_B ON table_B.foreign_key = table_A.primary_key;
Không dùng mệnh đề WHERE
Trong ví dụ này, chúng ta không chỉ định mệnh đề WHERE, nên sẽ trả về TẤT CẢ các tổ hợp của TẤT CẢ các kết quả khớp giữa bảng artist và album, vẫn dựa trên cột artist_id, là cột chung của cả hai.
SELECT
album_id,
title,
album.artist_id,
name AS artist_name
FROM album
INNER JOIN artist on artist.artist_id = album.artist_id;
+----------+---------------------------------------+-----------+
| album_id | title | artist_id | artist_name |
|----------+---------------------------------------+-----------|
| 1 | For Those About To Rock | 1 | AC/DC |
| 4 | Let There Be Rock | 1 | AC/DC |
| 2 | Balls To The Wall | 2 | Accept |
| 3 | Restless and Wild | 2 | Accept |
+----------+---------------------------------------+-----------+
Nhiều Inner Join
Bạn cũng có thể nối nhiều hơn hai bảng bằng các INNER JOINS. Chỉ cần cung cấp một INNER JOIN bổ sung cho mỗi cặp bảng cần nối. Trong đoạn mã dưới đây, chúng ta nối bảng A với B, và cả B với C.
SELECT
table_A.columnX,
table_A.columnY,
table_B.columnZ table_C columnW
FROM table_A
INNER JOIN table_B ON table_B.foreign_key = table_A.primary_key
INNER JOIN table_C ON table_C.foreign_key = table_B.primary_key;
Để tìm hiểu thêm về nối bảng, vui lòng xem video trong khóa học Introduction to SQL Server của chúng tôi.
Nội dung này được trích từ khóa học Introduction to SQL Server của DataCamp do John MacKintosh giảng dạy.