关于连接(joins)

提升 PostgreSQL 查询性能

Amy McCarty

Instructor

课程概览

  • 查询结构:连接、子查询、临时表
  • 限制与聚合数据
  • 数据库存储特性与优化工具
  • 查询规划与执行
提升 PostgreSQL 查询性能

查询规划器(Query planner)

查询(Query)

  • SQL 指令

餐厅服务员

查询(执行)计划

  • 实际执行步骤

多位厨师围着一口大锅

提升 PostgreSQL 查询性能

查询规划器(Query planner)

服务员端菜

服务员端饮料

提升 PostgreSQL 查询性能

 

什么是连接?

  • 合并多张表
提升 PostgreSQL 查询性能

 

什么是连接?

  • 合并多张表

为何使用连接?

  • 查表(lookup)
  • 合并数据

如何连接?

  • 内连接与外连接

 

销售ID 下单日期 金额 客户号
01 2019-02-02 145.30 911

 

ID 姓名 成为客户日期
911 Jim Smith 2019-01-01

 

销售ID 下单日期 金额 姓名
01 2019-02-02 145.30 Jim Smith
提升 PostgreSQL 查询性能

内连接(Inner join)

一个运动员表,含四条运动员与国家记录。Jack - AUT。Aditya - IND。Mikhail - RUS。Javier - MEX。一个国家表,含四条国家、名称、人口(百万)记录。AUT - Austria - 9。IND - India - 1,339。RUS - Russia - 145。BRA - Brazil - 209

SELECT *
FROM athletes a
INNER JOIN countries c
ON a.country = c.country

 

 

 

运动员 国家 国家1 名称 人口(百万)
Jack AUT AUT Austria 9
Aditya IND IND India 1,339
Mikhail RUS RUS Russia 145
提升 PostgreSQL 查询性能

内连接(Inner join)

一个运动员表,含四条运动员与国家记录。Jack - AUT。Aditya - IND。Mikhail - RUS。Javier - MEX。最后一条加粗。一个国家表,含四条国家、名称、人口(百万)记录。AUT - Austria - 9。IND - India - 1,339。RUS - Russia - 145。BRA - Brazil - 209。最后一条加粗。

SELECT *
FROM athletes a
INNER JOIN countries c
ON a.country = c.country

 

 

 

运动员 国家 国家1 名称 人口(百万)
Jack AUT AUT Austria 9
Aditya IND IND India 1,339
Mikhail RUS RUS Russia 145
提升 PostgreSQL 查询性能

USING 语法的内连接

一个运动员表,含四条运动员与国家记录。Jack - AUT。Aditya - IND。Mikhail - RUS。Javier - MEX。一个国家表,含四条国家、名称、人口(百万)记录。AUT - Austria - 9。IND - India - 1,339。RUS - Russia - 145。BRA - Brazil - 209

SELECT *
FROM athletes
INNER JOIN countries
USING (country)

 

 

 

运动员 国家 名称 人口(百万)
Jack AUT Austria 9
Aditya IND India 1,339
Mikhail RUS Russia 145
提升 PostgreSQL 查询性能

USING 语法的内连接

一个运动员表,含四条运动员与国家记录。Jack - AUT。Aditya - IND。Mikhail - RUS。Javier - MEX。最后一条加粗。一个国家表,含四条国家、名称、人口(百万)记录。AUT - Austria - 9。IND - India - 1,339。RUS - Russia - 145。BRA - Brazil - 209。最后一条加粗。

SELECT *
FROM athletes
INNER JOIN countries
USING (country)

 

 

 

运动员 国家 名称 人口(百万)
Jack AUT Austria 9
Aditya IND India 1,339
Mikhail RUS Russia 145
提升 PostgreSQL 查询性能

左外连接(Left outer join)

一个运动员表,含四条运动员与国家记录。Jack - AUT。Aditya - IND。Mikhail - RUS。Javier - MEX。一个国家表,含四条国家、名称、人口(百万)记录。AUT - Austria - 9。IND - India - 1,339。RUS - Russia - 145。BRA - Brazil - 209

SELECT *
FROM athletes a
LEFT JOIN countries c
ON a.country = c.country

 

 

运动员 国家 国家1 名称 人口(百万)
Jack AUT AUT Austria 9
Aditya IND IND India 1,339
Mikhail RUS RUS Russia 145
Javier MEX
提升 PostgreSQL 查询性能

左外连接(Left outer join)

一个运动员表,含四条运动员与国家记录。Jack - AUT。Aditya - IND。Mikhail - RUS。Javier - MEX。 一个国家表,含四条国家、名称、人口(百万)记录。AUT - Austria - 9。IND - India - 1,339。RUS - Russia - 145。BRA - Brazil - 209。最后一条加粗。

SELECT *
FROM athletes a
LEFT JOIN countries c
ON a.country = c.country

 

 

运动员 国家 国家1 名称 人口(百万)
Jack AUT AUT Austria 9
Aditya IND IND India 1,339
Mikhail RUS RUS Russia 145
Javier MEX
提升 PostgreSQL 查询性能

右外连接(Right outer join)

一个运动员表,含四条运动员与国家记录。Jack - AUT。Aditya - IND。Mikhail - RUS。Javier - MEX。一个国家表,含四条国家、名称、人口(百万)记录。AUT - Austria - 9。IND - India - 1,339。RUS - Russia - 145。BRA - Brazil - 209

SELECT *
FROM athletes a
RIGHT JOIN countries c
ON a.country = c.country

 

 

运动员 国家 国家1 名称 人口(百万)
Jack AUT AUT Austria 9
Aditya IND IND India 1,339
Mikhail RUS RUS Russia 145
BRA Brazil 209
提升 PostgreSQL 查询性能

右外连接(Right outer join)

一个运动员表,含四条运动员与国家记录。Jack - AUT。Aditya - IND。Mikhail - RUS。Javier - MEX。 最后一条加粗。一个国家表,含四条国家、名称、人口(百万)记录。AUT - Austria - 9。IND - India - 1,339。RUS - Russia - 145。BRA - Brazil - 209。

SELECT *
FROM athletes a
RIGHT JOIN countries c
ON a.country = c.country

 

 

运动员 国家 国家1 名称 人口(百万)
Jack AUT AUT Austria 9
Aditya IND IND India 1,339
Mikhail RUS RUS Russia 145
BRA Brazil 209
提升 PostgreSQL 查询性能

全外连接(Full outer join)

SELECT *
FROM athletes a
FULL OUTER JOIN countries c
ON a.country = c.country
  • 查询(执行)计划

多位厨师围着一口大锅

  • 约束查询规划器
运动员名 国家 国家1 名称 人口(百万)
Jack AUT AUT Austria 9
Aditya IND IND India 1,339
Mikhail RUS RUS Russia 145
Javier MEX
BRA Brazil 209
提升 PostgreSQL 查询性能

Passons à la pratique !

提升 PostgreSQL 查询性能

Preparing Video For Download...