目录
多表关系
分为一下几种关系:
- 一对多(多对一)
- 案例: 部门 与 员工的关系
- 实现: 在多的一方建立外键,指向一的一方的主键
- 多对多
- 案例: 学生 与 课程的关系
- 实现: 建立第三张中间表,中间表至少包含两个外键,分别关联两方主键
- 一对一
- 案例: 用户 与 用户详情的关系
- 实现: 在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的
多表查询
概念:从多张表中查询数据
语法:
使用逗号隔开多张表,会产生笛卡尔积
如:select * from emp , dept;
笛卡尔积: 笛卡尔乘积是指在数学中,两个集合A集合 和 B集合的所有组合情况。
(在多表查询中,需要消除无效的笛卡尔积)
解决办法:为筛选添加条件判断。
多表查询分类
连接查询
- 需要多张数据表的数据进行查询,则可通过连接运算符实现多个查询
内连接
查询的是两张表交集部分的数据
- 隐式内连接
select 字段列表 from 表1,表2 where 条件...;
- 显式内连接
select 字段列表 from 表1 [ inner ] join 表2 on 连接条件...;
外连接
- 左外连接
select 字段1,字段2,… from table_1 left [ outer ] join table_2 on 条件;
查询表1所有数据
- 右外连接
select 字段1,字段2,… from table_1 right [ outer ] join table_2 on 条件;
查询表2所有数据
自连接
自己连接自己,将一张表连接查询多次。
select 字段列表 from 表A 别名A join 表A 别名B on 条件 ... ;
注意事项: 在自连接查询中,必须要为表起别名,要不然我们不清楚所指定的条件、返回的字段,到底是哪一张表的字段。
不同的SQL join对比
join 对比:
操作符名称 | 描述 |
INNER JOIN ( JOIN ) | 如果表中有至少一个匹配,则返回行 |
LEFT JOIN | 不论右表是否有匹配,都会返回左表的所有行 |
RIGHT JOIN | 不论左表是否有匹配,都会返回右表的所有行 |
联合查询
使用union、union all关键字,就是把多次查询的结果合并起来,形成一个新的查询结果集
SELECT 字段列表 FROM 表A ...
union [ all ]
SELECT 字段列表 FROM 表B ....;
注意:
- 对于联合查询的多张表的列数必须保持一致,字段类型也需要保持一致。
- union all 会将全部的数据直接合并在一起,union 会对合并之后的数据去重。
子查询
SQL语句中嵌套SELECT,称为嵌套查询,又称子查询。
SELECT * FROM t1 WHERE column1 = ( SELECT column1 FROM t2 );
子查询外部的语句可以是INSERT / UPDATE / DELETE / SELECT 的任何一个。
分类:
根据子查询结果不同,分为:
- 标量子查询(子查询结果为单个值)
- 列子查询(子查询结果为一列)
- 行子查询(子查询结果为一行)
- 表子查询(子查询结果为多行多列)
根据子查询位置,分为:
- where之后
- from之后
- select之后