JOIN

Giới thiệu về JOIN

Câu lệnh JOIN sẽ gộp chung hai hoặc nhiều bảng với nhau, dựa trên một điều kiện liên kết giữa hai bảng đó.

Ở ví dụ sử dụng JOIN, chúng ta sẽ tạo hai bảng studentsclasses như sau:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
DROP TABLE IF EXISTS students;
DROP TABLE IF EXISTS classes;

CREATE TABLE students (
  id INTEGER PRIMARY KEY AUTOINCREMENT, -- SQLite 
  -- id INT AUTO_INCREMENT PRIMARY KEY, -- MySQL 
  -- id SERIAL PRIMARY KEY,  -- PostgreSQL
  name VARCHAR(255),
  class_id INTEGER,
  score FLOAT
);

CREATE TABLE classes (
  id INTEGER PRIMARY KEY AUTOINCREMENT, -- SQLite 
  -- id INT AUTO_INCREMENT PRIMARY KEY, -- MySQL 
  -- id SERIAL PRIMARY KEY,  -- PostgreSQL
  name VARCHAR(255)
);

INSERT INTO students (name, class_id, score) VALUES 
  ('Nguyễn Ngọc Tuấn', 1, 8.9),
  ('Phan Thanh Bình', 2, 9.5),
  ('Châu Thị Thủy', 1, 7.6),
  ('Ngô Nhật Minh', 2, 7.8),
  ('Nguyễn Quang Vinh', 1, 8.3);

INSERT INTO classes (id, name) VALUES 
  (1, '5A'),
  (2, '5B'),
  (3, '5C');

INNER JOIN

Câu lệnh INNER JOIN sẽ lấy nội dung có điều kiện đúng với cả bảng 1 và bảng 2. Câu lệnh JOIN thường đi cùng với từ khóa ON như sau:

SELECT ... FROM <bảng 1> INNER JOIN <bảng 1> ON <điều kiện giữa hai bảng>

Tiếp theo chúng ta sẽ lấy tên học sinh cùng với tên lớp:

1
2
3
SELECT students.name, students.score, classes.name AS class_name
  FROM students 
  INNER JOIN classes ON students.class_id = classes.id;

Kết quả sẽ là:

+------------------------+-------+------------+
| name                   | score | class_name |
+------------------------+-------+------------+
| Nguyễn Ngọc Tuấn       |   8.9 | 5A         |
| Phan Thanh Bình        |   9.5 | 5B         |
| Châu Thị Thủy          |   7.6 | 5A         |
| Ngô Nhật Minh          |   7.8 | 5B         |
| Nguyễn Quang Vinh      |   8.3 | 5A         |
+------------------------+-------+------------+

LEFT JOIN

Câu lệnh LEFT JOIN sẽ lấy tất cả các dữ liệu của bảng 1, trong trường hợp dữ liệu của bảng 2 không có đúng với điều kiện thì các field của bảng 2 lúc này sẽ lấy giá trị NULL.

Ví dụ sau chúng ta lấy hết nội dung trong bảng 1. Trong đó bảng 1 là bảng classes.

1
2
3
SELECT classes.name AS class_name, students.name, students.score
  FROM classes 
  LEFT JOIN students ON students.class_id = classes.id;

Kết quả sẽ là:

+------------+------------------------+-------+
| class_name | name                   | score |
+------------+------------------------+-------+
| 5A         | Nguyễn Quang Vinh      |   8.3 |
| 5A         | Châu Thị Thủy          |   7.6 |
| 5A         | Nguyễn Ngọc Tuấn       |   8.9 |
| 5B         | Ngô Nhật Minh          |   7.8 |
| 5B         | Phan Thanh Bình        |   9.5 |
| 5C         | NULL                   |  NULL |
+------------+------------------------+-------+

RIGHT JOIN

Tương tự với RIGHT JOIN thì nội dung sẽ lấy hết ở bảng 2. Trong trường hợp dữ liệu của bảng 1 không có đúng với điều kiện thì các field của bảng 1 lúc này sẽ lấy giá trị NULL.

Ví dụ sau chúng ta lấy hết nội dung trong bảng 2. Trong đó bảng 2 là bảng classes.

1
2
3
SELECT students.name, students.score, classes.name AS class_name
  FROM students 
  RIGHT JOIN classes ON students.class_id = classes.id;

Kết quả là:

+------------------------+-------+------------+
| name                   | score | class_name |
+------------------------+-------+------------+
| Nguyễn Quang Vinh      |   8.3 | 5A         |
| Châu Thị Thủy          |   7.6 | 5A         |
| Nguyễn Ngọc Tuấn       |   8.9 | 5A         |
| Ngô Nhật Minh          |   7.8 | 5B         |
| Phan Thanh Bình        |   9.5 | 5B         |
| NULL                   |  NULL | 5C         |
+------------------------+-------+------------+

Lưu ý là SQLite không hổ trợ RIGHT JOIN.

FULL OUTER JOIN

FULL OUTER JOIN là kết hợp giữa LEFT JOIN RIGHT JOIN. Nội dung sẽ lấy ở cả bảng 1 cùng với bảng 2, và sẽ điền các giá trị NULL vào các cột cần thiết.

Cả MySQLSQLite đều không hổ trợ FULL OUTER JOIN, chỉ có PostgreSQL là hổ trợ kiểu JOIN này.