在连接时筛选

提升 PostgreSQL 查询性能

Amy McCarty

Instructor

连接回顾

 

连接(JOIN)

  • 使用至少一个公共字段关联表
SELECT * 
FROM TABLE_A AS A
INNER JOIN TABLE_B AS B 
  ON A.NAME = B.NAME

 

连接用于合并数据

  • 来自多张表
  • 内连接与外连接

连接用于筛选数据

  • 内连接
  • 带非连接条件的外连接
提升 PostgreSQL 查询性能

患者与就诊数据

就诊记录(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
提升 PostgreSQL 查询性能

用内连接进行筛选

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

Visits 表中的 999 patient_id 连接到 Patients 表中的 999,Visits 表中的 888 连接到 Patients 表中的 888。Patients 表中的 777 无连接。

提升 PostgreSQL 查询性能

用内连接进行筛选

SELECT *
FROM appointments a
INNER JOIN patients p
ON a.patient_id = p.patient_id
输出
visit_id reason patient_id name sex
01 checkup 999 Lotte Smith F
02 infection 888 Zhang Wei M
提升 PostgreSQL 查询性能

用外连接进行筛选

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

Patients 表筛选为男性,因此圈出患者 888 Zhang Wei M。这是唯一的男性记录,也是唯一能与 Visits 表中的 patient_id 连接的记录。

提升 PostgreSQL 查询性能

用外连接进行筛选

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
提升 PostgreSQL 查询性能

筛选陷阱

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

1) FROM Visits 表中的 999 patient_id 连接到 Patients 表中的 999,Visits 表中的 888 连接到 Patients 表中的 888。Patients 表中的 777 无连接。

 

 

 

 

2) WHERE 包含 888 Zhang Wei 的就诊与患者信息为一行,包含 999 Lotte Smith 的就诊与患者记录为第二行并被划去。

提升 PostgreSQL 查询性能

筛选陷阱

SELECT * 
FROM appointments a
LEFT 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
提升 PostgreSQL 查询性能

筛选陷阱

SELECT * 
FROM appointments a
LEFT 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
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
提升 PostgreSQL 查询性能

改进的筛选方法

 

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'
提升 PostgreSQL 查询性能

Ayo berlatih!

提升 PostgreSQL 查询性能

Preparing Video For Download...