多表关系

一对多(多对一)

多对多

创建中间表示例:

一对一
与多对一、一对多不同的就是,将外键设置为unique,常用于单表的拆分

概述

在进行多表查询时要删除笛卡尔积,需要使其条件为外键==主键
正常使用select * from emp, dept; 会导致出现以下情况,然后实际一个人仅对应一个部门

因此,需要让emp员工表中的外键dept_id等于dept部门表中的主键dept.id即可
使用select * from emp, dept ++where emp.dept_id= dept.id++; 这样就消除了无效的记录,即消除了笛卡尔积

分类

连接查询
内连接查询
查询交集部分,也就是图中绿色的共有部分

隐式内连接,即前面概述中采用的方法

显示内连接仅是写法不同,inner可省略

外连接查询
查询完整的表本身,包含交集部分

outer可以省略
左外连接


右外连接
其中还是左外连接用的多,因为对于左外连接,只要将顺序调换即可具体如下
自连接查询
一定要起别名

自己连接自己,可以是内查询也可以是外查询,以下图表为例

两个案例:


联合查询

就是将两个查询合起来,对于关键字all,有all就是直接合并两个结果,省略all就是合并后去重

注意,查询的字段以及列数必须一致,否则会报错

子查询(嵌套查询)

标量子查询

案例1:
要查询销售部的所有员工信息,需要先知道销售部门id,再根据id去查员工信息,步骤如下

其实直接能合成同一行,即采用子查询,如下图,同时因为括号中的内容只会返回一个信息(销售部门id),所以称为标量子查询

案例2,查询在方东白之后入职的员工信息:

列子查询

案例1,查询 销售部 和 市场部 的所有员工信息:

案例2,查询比 财务部 所有人工资都高的员工信息:

案例3,查询比 研发部 任意一人 工资高的员工信息,any也可以换成some,返回的列中只要有1个或多个满足条件就可以

行子查询

案例,查询与张无忌薪资与直属领导相同的员工信息(工资一样、领导一样)
常规方法,先通过下面一行查询出张无忌的薪资与领导id

再通过下面一行查询

换一种写法,要求与括号中的内容一一对应

转换成行子查询的方式,因为括号中的内容返回的就是salary与managerid的信息

表子查询

案例1,查询与鹿杖客、宋远桥的职位和薪资相同的员工信息
先查询鹿杖客、宋远桥的职位和薪资


但是由于这不是一个单行数据,不能和行子查询一样使用=,而是使用in,表示只要满足其中一行即可

、
案例2,查询入职日期是2006-01-01之后的员工信息及其部门信息
先查询该日期之后的员工信息

查询这部分员工对应的部门信息,
