学习目标:了解实体之间的关联关系,掌握多表操作的方式和解决的需求问题
联合查询
连接查询
子查询
示例
不管是大型还是小型项目,一个数据库里都会有N张表,表之间也通过一对一、多对一或者多对多关系进行关联:如新闻管理系统
作者表:id、用户名、密码
新闻表:id、标题、内容、发布时间、作者id
显示新闻的时候是肯定需要显示作者姓名的
原始方式:查出新闻-->查出作者ID-->查出作者
步骤多
如果是批量显示新闻就更麻烦
多表操作:使用连接查询一条SQL搞定
小结
1、多表操作是实际开发时经常遇到的解决问题的方案
2、多表操作能够在数据库层就实现大量数据的组合或者筛选
一、联合查询
学习目标:了解联合查询的现实意义,掌握联合查询的实际运用
联合查询
联合查询排序
1、联合查询
目标:了解联合查询的语法,掌握联合查询的作用
概念
联合查询:union,是指将多个查询结果合并成一个结果显示
联合查询是针对查询结果的合并(多条select语句合并)
联合查询语法
select 查询【决定字段名字】
union 查询选项
select 查询
...
联合查询要求:联合查询是结果联合显示
多个联合查询的字段结果数量一致
联合查询的字段来源于第一个查询语句的字段
查询选项:与select选项类似
all:保留所有记录
distinct:保留去重记录(默认)
步骤
1、确定要进行多个表数据的联合操作
表结构一致
数据汇总
2、确定数据的要求:全部保留 or 去重
3、使用联合查询
示例
1、创建一个表与t_40,并插入数据
create table t_42 like t_40;
insert into t_42 values(null,'犬夜叉','男',200,'神妖1班'),
(null,'日暮戈薇','女',16,'现代1班'),
(null,'桔梗','女',88,'法师1班'),
(null,'弥勒','男',28,'法师2班'),
(null,'珊瑚','女',20,'法师2班'),
(null,'七宝','保密',5,'宠物1班'),
(null,'杀生丸','男',220,'神妖1班'),
(null,'铃','女',4,'现代1班'),
(null,'钢牙','男',68,'神妖1班'),
(null,'奈落','男',255,'神妖1班'),
(null,'神乐','女',15,'神妖2班');
t_42与t_40结构一样,可以理解为因为数据量大拆分到了两个表中
2、使用联合查询将两张表的数据拼接到一起显示
select * from t_40
union
select * from t_42;
3、联合查询选项默认是distinct
select * from t_40
union
select * from t_40;
select * from t_40
union all
select * from t_40;
4、联合查询不要求字段类型一致,只对数量要求一致,而且字段与第一条查询语句相关
select name from t_40
union all
select age from t_40;
注意:如果数据不能对应,那么查询没有意义
5、如果使用where对数据进行筛选,where针对的是select指令,而不是针对union结果
select * from t_40
union all
select * from t_42
where gender = '女';
where只针对第二条select有效
若要全部有效,需要select都使用where
小结
1、union是负责将多次查询的结果统一拼凑显示
记录数增加
字段数不变(第一条SQL指令决定)
2、union常用方式
因为数据量大分表存储,然后统一查看或者统计
根据不同维度对数据进行筛选,然后统一查看或者统计
3、union默认是去重的,想要保留全部查询结果,需要使用union all
2、联合查询排序
目标:了解联合查询排序的概念,掌握联合查询排序的方法
概念
联合查询排序:针对联合查询的结果进行排序
order by本身是对内存结果进行排序,union的优先级高于order by,所以order by默认是对union结果进行排序
如果想要对单独select的结果进行排序,需要两个步骤
将需要排序的select指令进行括号包裹(括号里使用order by)
order by必须配合limit才能生效(limit一个足够大的数值即可)
步骤
1、确定需要对联合查询进行排序
2、确定排序内容
针对union结果排序
针对union前的select结果进行排序
3、选择合适的排序方式
示例
1、将t_40和t_42表的结果使用年龄降序排序
select * from t_40
union all
select * from t_42
order by age desc; #针对的是整个union之后的结果
2、t_40表按年龄降序排序,t_42表按年龄升序排序
# 无效方式
(select * from t_40 order by age desc)
union
(select * from t_42 order by age);
# 正确方式
(select * from t_40 order by age desc limit 99999)
union
(select * from t_42 order by age desc limit 99999);
小结
1、联合排序需要区分排序的内容是select结果还是union结果
union结果:在最后使用排序即可
select结构:需要针对select使用排序
select必须使用括号包裹
select里的排序必须配合limit才会生效
二、连接查询
学习目标:理解连接查询的概念,掌握重点连接方式的使用,运用连接查询解决表关系的问题
交叉连接
内连接
外连接
左外连接
右外连接
自然连接
using关键字
概念
连接查询:join,将两张表依据某个条件进行数据拼接
join左右各一