Lọc khi JOIN

Cải thiện hiệu năng truy vấn trong PostgreSQL

Amy McCarty

Instructor

Ôn JOIN

 

JOIN

  • Liên kết bảng bằng ít nhất 1 trường chung
SELECT * 
FROM TABLE_A AS A
INNER JOIN TABLE_B AS B 
  ON A.NAME = B.NAME

 

JOIN để kết hợp dữ liệu

  • Từ nhiều bảng
  • Inner và outer

JOIN để lọc dữ liệu

  • Inner join
  • Outer join với điều kiện JOIN không liên kết
Cải thiện hiệu năng truy vấn trong PostgreSQL

Dữ liệu bệnh nhân và lịch hẹn

Appointments
visit_id reason patient_id
01 checkup 999
02 infection 888
Patients
patient_id name sex
999 Lotte Smith F
888 Zhang Wei M
777 Amelia Hernandez F
Cải thiện hiệu năng truy vấn trong PostgreSQL

Inner join để lọc

SELECT *
FROM appointments a
INNER JOIN patients p
ON a.patient_id = p.patient_id

patient_id 999 trong bảng Visits liên kết với patient_id 999 trong bảng Patients. patient_id 888 trong bảng Visits liên kết với patient_id 888 trong bảng Patients. patient_id 777 trong bảng Patients không có liên kết.

Cải thiện hiệu năng truy vấn trong PostgreSQL

Inner join để lọc

SELECT *
FROM appointments a
INNER JOIN patients p
ON a.patient_id = p.patient_id
Kết quả
visit_id reason patient_id name sex
01 checkup 999 Lotte Smith F
02 infection 888 Zhang Wei M
Cải thiện hiệu năng truy vấn trong PostgreSQL

Outer join để lọc

SELECT *
FROM appointments a
LEFT JOIN patients p
  ON a.patient_id = p.patient_id
  AND p.sex = 'M'

Bảng Patients được lọc còn Nam nên khoanh bệnh nhân 888 Zhang Wei M. Đây là bản ghi Nam duy nhất, nên là bản ghi duy nhất JOIN được với patient_id trong bảng Visits.

Cải thiện hiệu năng truy vấn trong PostgreSQL

Outer join để lọc

SELECT *
FROM appointments a
LEFT JOIN patients p
  ON a.patient_id = p.patient_id
  AND p.sex = 'M'
Kết quả
visit_id reason patient_id name sex
01 checkup 999
02 infection 888 Zhang Wei M
Cải thiện hiệu năng truy vấn trong PostgreSQL

Cạm bẫy khi lọc

SELECT * 
FROM appointments a
LEFT JOIN patients p 
  ON a.patient_id = p.patient_id
WHERE p.sex = 'M'

1) FROM patient_id 999 trong bảng Visits liên kết với patient_id 999 trong bảng Patients. patient_id 888 trong bảng Visits liên kết với patient_id 888 trong bảng Patients. patient_id 777 trong bảng Patients không có liên kết.

 

 

 

 

2) WHERE Bảng có dòng thăm khám 888 Zhang Wei với thông tin bệnh nhân, và dòng 999 Lotte Smith bị gạch bỏ.

Cải thiện hiệu năng truy vấn trong PostgreSQL

Cạm bẫy khi lọc

SELECT * 
FROM appointments a
LEFT JOIN patients p 
  ON a.patient_id = p.patient_id
WHERE p.sex = 'M'
Kết quả
visit_id reason patient_id name sex
02 infection 888 Zhang Wei M
Cải thiện hiệu năng truy vấn trong PostgreSQL

Cạm bẫy khi lọc

SELECT * 
FROM appointments a
LEFT JOIN patients p 
  ON a.patient_id = p.patient_id
WHERE p.sex = 'M'
Kết quả
visit_id reason patient_id name sex
02 infection 888 Zhang Wei M
SELECT *
FROM appointments a
LEFT JOIN patients p
  ON a.patient_id = p.patient_id
  AND p.sex = 'M'
visit_id reason patient_id name sex
01 checkup 999
02 infection 888 Zhang Wei M
Cải thiện hiệu năng truy vấn trong PostgreSQL

Khắc phục cạm bẫy khi lọc

 

SELECT *
FROM appointments a
INNER JOIN patients p
  ON a.patient_id = p.patient_id
WHERE p.sex = 'M'
visit_id reason patient_id name sex
02 infection 888 Zhang Wei M

 

SELECT *
FROM appointments a
INNER JOIN patients p
  ON a.patient_id = p.patient_id
  AND p.sex = 'M'
Cải thiện hiệu năng truy vấn trong PostgreSQL

Ayo berlatih!

Cải thiện hiệu năng truy vấn trong PostgreSQL

Preparing Video For Download...