python之SQL表连接
1. 前言
- 什么是连接?
需要查询两张表中的内容,比如通过外键约束的两张表。
2. 内连接
2.1 语法和实例
- 语法
假如表1通过外键与表2进行连接
--- 语法1 -- where后面可以为表1和表2的任何字段相关的运算符
select 表1.字段1, 表2.字段2 --- 查询内容
from 表1, 表2 ---- 查询的表名
where 运算符(表1.字段3, 表2.字段4) ---- 连接条件
--- 语法2 用于表之间存在外键约束的两章表
select 表1.字段1, 表2.字段2 --- 查询内容
from 表1 (inner) join 表2 ---- 查询的表名
on 表1.外键 = 表2.主键 ---- 连接条件,通过哪个外键连接
一定要搞清楚查询的数据来自哪几张表
3. 外连接
外连接分为左外连接,右外连接和全外连接。
3.1 左(外)连接
3.1.1 特点
两张表在连接过程中除返回连接条件的行数据外,还会返回左表中不满足条件的行。
3.1.2 语法
-- 方法1: 适用on
select 表1.字段1, 表2.字段2
from 表1 left (outer) join 表2
on 表1.字段3与表2.字段4的运算符
select 表1.字段1, 表2.字段2
from 表1 left (outer) join 表2
using (字段3) --- 字段3为连接字段且在表1和表2必须相同
上述将显示完表1中所有字段数据。
3.2 右(外)连接
3.2.1 特点
两张表在连接过程中除返回连接条件的行数据外,还会返回右表中不满足条件的行。
3.2.2 语法
-- 方法1: 适用on方法
select 表1.字段1, 表2.字段2
from 表1 right (outer) join 表2
on 表1.字段3与表2.字段4的运算符
-- 方法2: 适用using方法
select 表1.字段1, 表2.字段2
from 表1 right (outer) join 表2
using (字段3) --- 字段3为连接字段且在表1和表2必须相同
上述将显示完表2中所有字段数据。
3.3 全(外)连接
3.3.1 特点
两张表在连接过程中除返回连接条件的行数据外,还会返回两个表中不满足条件的行。
3.3.2 语法
方法1: 适用on
select 表1.字段1, 表2.字段2
from 表1 full (outer) join 表2
on 表1.字段3与表2.字段4的运算符
-- 方法2: 适用using方法
select 表1.字段1, 表2.字段2
from 表1 full (outer) join 表2
using (字段3) --- 字段3为连接字段且在表1和表2必须相同
上述将显示完表1和表2中所有字段数据 。
4. 子查询
4.1 前言
- 需要将查询出来的数据作为条件查询中
- 应用广泛,比如要求在某一个部门,查询工资比张三高的所有员工及相关信息;上述问题,需要查询两个数据,一个为张三的工资(子查询),另一个为所有员工及相关信息(主查询)。
step1: 查询张三的工资:select 工资 from 表 where 姓名 = ‘张三’
step2: 查询所有员工及相关信息: select * from 表
step3: 融合主副问题, 靠的是工资大于张三的工资
select * from 表 where 工资 > (select 工资 from 表 where 姓名 = ‘张三’)
4.2 语法特点即注意
4.2.1 语法
select 主查询的字段列表
from 表
where 连接主子问题的表达式 (select 子查询字段列表 from 表);
4.2.2 特点
- 上述SQL语句执行顺序:子查询 -> 主查询
- 主查询适用子查询的结果
- where后面接的是比较运算符,返回的是true或者false
4.3 子查询结果的维度
一定要注意子查询返回的格式,到底是几行几列的数据。若返回一行数据,则称为单行子查询;若返回多行数据,则称为多行子查询。不同维度的子查询结果对应了不同的连接主子问题的表达式。
4.3.1 单行子查询
返回一行记录,对单行子查询可使用单行记录的比较运算符:
<, >, =, >=, <=, !=
该例子比较简单。
4.3.2 多行子查询
- 返回多行记录,不能直接使用单行比较运算符,需要根据需要“取”多行数据中的“一行数据”做比较运算。“取”有如下关键字:
ALL : 和子查询返回的所有值进行比较,全部都满足才返回true
ANY/SOME: 和子查询返回的任意值进行比较,满足其中一个就可以
IN: 等于子查询多行数据中的任意一个 - 语法
--- ALL
select 主查询的字段列表
from 表
where 连接主子问题的表达式 ALL(select 子查询字段列表 from 表);
--- ANY
select 主查询的字段列表
from 表
where 连接主子问题的表达式 ANY(select 子查询字段列表 from 表);
--- SOME
select 主查询的字段列表
from 表
where 连接主子问题的表达式 SOME(select 子查询字段列表 from 表);
--- IN
select 主查询的字段列表
from 表
where 连接主子问题的表达式 IN(select 子查询字段列表 from 表);