Truy vấn con với semi join và anti join

Kết hợp dữ liệu trong SQL

Maham Faisal Khan

Senior Content Developer, DataCamp

Gọi các loại join

Sơ đồ INNER JOIN trên trường id

Sơ đồ hai bảng: left_table và right_table. Kết quả join của hai truy vấn hiển thị bên phải, chỉ trả về các bản ghi khớp theo cột id ở cả hai bảng.

Kết hợp dữ liệu trong SQL

Join cộng thêm trường

SELECT *
FROM left_table
INNER JOIN right_table
ON left_table.id = right_table.id;
Kết hợp dữ liệu trong SQL

Additive join

Sơ đồ giải thích additive join. Bên trái là hai bảng left_table và right_table. Bên phải là kết quả INNER JOIN theo cột id của hai bảng. Các trường khác tên được thêm giữ nguyên tên gốc. Vì trường date xuất hiện ở cả hai bảng nên được thêm hai lần.

Kết hợp dữ liệu trong SQL

Semi join

Một semi join chọn các bản ghi ở bảng thứ nhất khi điều kiện được thỏa ở bảng thứ hai.

Sơ đồ hai bảng, left_table và right_table, dùng để minh họa semi join. left_table có hai cột id và col1. right_table chỉ có cột col2.

Kết hợp dữ liệu trong SQL

Semi join

Sơ đồ hai bảng, left_table và right_table, dùng để minh họa semi join. col2 sẽ lọc col1. Các bản ghi trong left_table mà col1 không khớp với col2 đã bị làm mờ.

Kết hợp dữ liệu trong SQL

Semi join

Sơ đồ hai bảng, left_table và right_table. Kết quả semi join của hai bảng hiển thị bên phải. Chỉ các bản ghi trong left_table có col1 khớp với col2 được trả về, tương ứng id 2 và 3.

Kết hợp dữ liệu trong SQL

Bắt đầu semi join

SELECT country, continent, president
FROM presidents;
| country  | continent     | president               |
| -------- | ------------- | ----------------------- |
| Egypt    | Africa        | Abdel Fattah el-Sisi    |
| Portugal | Europe        | Marcelo Rebelo de Sousa | 
| USA      | North America | Joe Biden               |
| Uruguay  | South America | Luis Lacalle Pou        |
| Pakistan | Asia          | Asif Ali Zardari        |
| Chile    | South America | Gabriel Boric           |
| India    | Asia          | Droupadi Murmu          |
Kết hợp dữ liệu trong SQL

Xây dựng semi join

SELECT country
FROM states
WHERE indep_year < 1800;
|----------|
| country  |
|----------|
| Portugal |
| Spain    |
|----------|
Kết hợp dữ liệu trong SQL

Hoàn tất semi join (mở đầu về subquery)

SELECT president, country, continent
FROM presidents
WHERE country IN
    (SELECT country
     FROM states
     WHERE indep_year < 1800);
|-------------------------|-----------|-------------|
| president               | country   | continent   |
|-------------------------|-----------|-------------|
| Marcelo Rebelo de Sousa | Portugal  | Europe      |
|-------------------------|-----------|-------------|
Kết hợp dữ liệu trong SQL

Anti join

Sơ đồ hai bảng, left_table và right_table, dùng để minh họa anti join. col2 được dùng để lọc col1. Các bản ghi trong left_table mà col1 không khớp với col2 KHÔNG bị làm mờ.

Kết hợp dữ liệu trong SQL

Anti join

Sơ đồ hai bảng, left_table và right_table. Kết quả anti join của hai bảng hiển thị bên phải. Chỉ các bản ghi trong left_table mà col1 không khớp với col2 được trả về, tương ứng id 1 và 4.

Kết hợp dữ liệu trong SQL

Anti join với bảng presidents

SELECT country, president
FROM presidents
WHERE continent LIKE '%America' 
    AND country NOT IN
        (SELECT country
         FROM states
         WHERE indep_year < 1800);
| country  |  president       |
| -------- | ---------------- | 
| Uruguay  | Luis Lacalle Pou |
| Chile    | Gabriel Boric    |
Kết hợp dữ liệu trong SQL

Ayo berlatih!

Kết hợp dữ liệu trong SQL

Preparing Video For Download...