这是我参与更文挑战的第14天,活动详情查看: 更文挑战
多表查询
笛卡尔积与union
- 合并结果集(行合并)
-
什么是合并结果集
合并结果集就是将两个select语句查询结果合并在一起
-
合并结果集的两种方式
UNION:合并时去除重复记录
UNION ALL:合并时不去除重复记录
select * from table1 union select * from table2;
-
注意事项
被合并的结果:列的数量及类型必须完全一样
应用场景:消息和历史消息
连接查询(列合并)
-
连接查询也叫跨表查询,将多个表关联获取结果集,将多个列合并在一起
-
同时查询两张表,默认出现的就是笛卡尔积结果,[交叉连接]
select * from table1,table2;
-
上述结果基本不可用,优化
查询时保持主键与外键一致
主表的主键和从表的外键保持相等(引用完整性)
-
根据连接方式得到取出满足业务的最佳效果
连接方式:内连接,外连接,交叉连接
-
连接查询不需要建立外键,外键只是用来包装引用完整性的手段
内连接(inner join on ,inner可省略不写)
使用比较运算符(=,>,<,<>,>=,<=,!>,!<)进行表间比较操作,查询与连接条件相匹配的数据,内连接只返回满足连接条件的数据行
根据所使用的比较方式不同,内连接分为等值连接(使用=连接)、非等值连接和自连接(一个连接查询中涉及的两个表都是同一张表)三种
自连接:select a1.name,a2.mobile from a as a1 inner join a as a2 on a1.id = a2.pid
内连接和笛卡尔积优化的等效(下面两sql是等效的): select a1.name,a2.title from a1 join a2 on a1.id = a2.pid where 1=1;
select a1.name,a2.title from a1 , a2 where a1.id = a2.pid where 1=1;
外连接(left,right,FULL [outer] JOIN)
自然连接(natural join)
连接是在两张表转给你寻找那些数据类型和列名都相同的字段,然后自动地将他们连接起来,并返回所有符合条件的结果。自然连接不包含重复的属性。
select * from table1 natural join table2;
子查询
-
一个select语句中包含至少一个完整的select
-
出现位置 select中:把子查询的结果当做列显示
from后面:把查询结果当做一个新表
where后面:把子查询结果当做另一个select中的条件
-
EXISTS用于检查子查询是否至少返回一行数据,该子查询实际上并不返回任何数据,而是返回true或false
https://blog.csdn.net/mhd2312/article/details/81037755
视图
-
什么是视图
视图是一个虚拟表,其内容由查询产生
与真实的表一样,包含行和列
行和列数据来自于定义视图的查询所引用的表,并且在引用视图时动态生成
简单说,视图是由select 结果组成的表
-
视图特性
不存储具体数据
可以跟基本表一样,进行增删改查操作(增删改有条件限制)
视图一般用作查询
-
视图作用
安全性:创建一个视图,定义好该视图所操作的数据,使用到了授权特性
查询性能提高
提高数据独立性
create view emp_view as select * from emp
select * from emp_view
创建视图参数
ALGORITHM
MERGE:处理方式为替换式,可以进行更新真实表中的数据 TEMPTABLE:具化式,由于数据保存在临时表中,所以不可进行更新操作 UNDEFINED: 未定义参数,mysql倾向选择替换方式。视图机制:
替换式:操作视图时,视图名直接被视图定义给替换掉 具化式:mysql先得到视图执行结果,该结果形成一个中间结果攒存在内存中,先处理视图结果,后处理外面的查询需求。create ALGORITHM = merge view emp_view as select * from emp
-
WITH CHECK OPTION create view emp_view as select * from emp where sal < 5000 WITH CHECK OPTION
视图不可更新部分
- 聚合函数
- DISTINCT关键字
- GROUP BY子句
- HAVING子句
- UNION运算符
- FROM子句中包含多个表
- SELECT语句中引用了不可更新视图
- 只要视图当中对数据不是来自于基表,就不能直接修改