Chuyển đến nội dung chính
Mô-đun 3 · Bài học 1 trong tổng số 49/57 trong khóa học~12 min
Bài học theo mô-đun (1/4)

Nối hai bảng: INNER JOIN

Cho đến bây giờ chúng ta đã đọc từng bảng một. Tuy nhiên, trong thế giới thực, dữ liệu trải rộng trên nhiều bảng có liên quan: ví dụ: trong tập dữ liệu của chúng tôi, mỗi bảng nhân viên có department_id trỏ đến bảng departments. Để xem tên của bộ phận (và không chỉ id của nó), chúng ta cần tham gia vào hai cái bàn. Toán tử thực hiện việc này được gọi là JOIN.

Cú pháp cơ bản

SQL
SELECT columns
FROM   table_a
JOIN   table_b ON table_a.x = table_b.y;

Đọc bằng tiếng Anh: "lấy table_a, đính kèm table_b vào đó bằng cách ghép nối mỗi hàng trong đó table_a.x bằng table_b.y". Kết quả là một ảo mới table với các cột của cả hai.

SQL
-- For each employee, also show the name of their department:
SELECT employees.first_name,
       employees.last_name,
       departments.name AS dipartimento
FROM   employees
JOIN   departments ON employees.department_id = departments.id;

Phần sau ON được gọi là điều kiện nối: nó cho biết engine "hai hàng này gần giống nhau, xếp thẳng hàng nhé". trong phần lớn các trường hợp đó là sự bình đẳng giữa khóa chính và khóa ngoại khóa (ở đây departments.id và employees.department_id).

INNER JOIN, chi tiết

Từ khóa đầy đủ là INNER JOIN, nhưng JOIN chỉ là tiêu chuẩn từ đồng nghĩa. "Bên trong" có nghĩa là chỉ những hàng có kết quả khớp trong cả hai các bảng được trả về:

  • nếu nhân viên có department_id = NULL, họ sẽ không xuất hiện trong kết quả;
  • nếu một bộ phận không có nhân viên, nó sẽ không xuất hiện trong kết quả.

Tên cột đủ điều kiện

Khi hai bảng có các cột có cùng tên (ở đây cả hai đều có id và cả hai đều có name nếu bạn nghĩ về điều đó), bạn cần chỉ định bảng nào một cột được tạo ra bằng cách viết table.column. Để tránh lặp lại tên dài, các bí danh thường được sử dụng (bạn đã thấy chúng trong Mô-đun 2):

SQL
SELECT e.first_name, e.last_name, d.name AS dipartimento
FROM   employees   AS e
JOIN   departments AS d ON e.department_id = d.id;

AS ở đây cũng là tùy chọn: FROM employees e hoạt động tương tự.

Hãy thử nó

tập thể dục#sql.m3.l1.e1
Nỗ lực: 0Đang tải…

Đối với mỗi nhân viên trong bộ phận Ingegneria, hãy hiển thị tên (first_name), họ (last_name) và thành phố của bộ phận (departments.city). Ba cột, một hàng cho mỗi nhân viên.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Hoàn thành điều kiện BẬT với đẳng thức giữa e.department_id và d.id, sau đó chọn d.city làm cột thứ ba.

Giải pháp khả dụng sau 3 lần thử

Xem lại bài tập

tập thể dục#sql.m3.l1.e2
Nỗ lực: 0Đang tải…

Liệt kê tên (first_name) và họ (last_name) của tất cả nhân viên làm việc trong bộ phận có trụ sở tại Milano. Lọc theo Department.city, không phải theo tên bộ phận.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Tương tự THAM GIA như bài tập trước, nhưng lọc theo d.city = 'Milano' thay vì theo tên bộ phận.

Giải pháp khả dụng sau 3 lần thử