联合查询
基本语法:
select 语句1
union [union 选项]
select 语句2……
union 选项(默认去重)
all:保留所有,不管重复
distinct:去重,默认的
意义:提高查询效率,减少带宽
分表:水平分表:10记录 两个表5+5
垂直分表:一对一 常用表;不常用表
子查询
一个select语句包含另一个select语句
按位置分类
from子查询
where子查询
exists子查询
按结果分类
标量子查询 :一行一列的结果
列子查询 :一列多行的结果(一排记录)
行子查询 :多列一行;多行多列
-- 查询年龄最大且身高最高
-- 行子查询(最佳)
select * from my_student where
-- (age,height)称为行元素(别忘加括号)
(age,height)=(select max(age),max(height) from my_student);
表子查询 :多行多列
-- 表子查询
select * from my_student group by c_id order by height desc;--不符合要求(每个班取第一个人在排序)
-- 插入学生
insert into my_student values(null,'bc20200006','小航','女',25,185,4);
-- 查找每个班身高最高的学生 数据源要加limit才能查到想要的数据
select * from(select * from my_student order by height desc limit 9999999) as student
group by c_id; -- 每个班选出第一个学生而已
列子查询(了解)
=any等价于in; -- 其中一个即可
any等价于some; -- 二者是一样的
=all为全部
视图(为了查询数据起来方便)
视图(view):是一种有结构,但是没结果的虚拟表(数据从基表中得来)
视图优点:对外提供友好型,不同的视图对应不同的数据
创建视图
基本语法:create view 视图名字 as select 语句;
创建单表视图:基表只有一个
创建多表视图:基表来源至少两个(注意id不能重复)
查看视图创建语句(结构,对基表没影响)
show tables [like] / desc 视图名 / show create table 视图名;
-- c查看视图创建语句
show create view my_v3\G
修改视图(本身不可以修改,视图来源(select语句)可以修改,可以定制)
alter view 视图名字 as 新的select语句;
删除视图
drop view 视图名字;
视图数据操作
新增数据
多表视图不能新增数据
可以向单表视图插入数据,但是视图中包含的字段必须有基表中所有不能为空、或没有默认值的字段
视图是可以向基表插入数据的
删除数据
多表视图不能删除数据
单表视图可以删除数据
更新数据
更新限制:with check option;
-- 视图:age字段限制更新
create view my_v4 as
select * from my_student where age>30 with check option;
-- 表示视图的数据来源都是年龄大于30的,是由where age>30决定的
-- with chhheck
-- option决定通过视力更新的时候,不能将已经得到的数据age>30的改成<30的
-- 将视图可以查到的数据改成年龄小于30
update my_v4 set age=29 where id=5;
-- 可以修改数据让视图可以查到:可以改,但是无效果
update my_v4 set age=32 where id=3;
视图算法
视图算法:系统对视图以及外部查询视图的select语句的一种解析方式
视图算法分三种
undefined:未定义(默认的)
temptable:临时表算法
merge:合并算法
算法指定:在创建视图的时候create algorithm=指定算法 view 视图名字 as select语句;
-- 获取所有班级中最高的一个学生
create view my_v5 as
select * from my_student order by height desc;
select * from my_v5 group by c_id;
-- merge:合并算法
select * from my_student group by c_id order by height desc;
-- 指定算法为临时表算法
create algorithm=temptable view my_v6 as
select * from my_student order by height desc;
select * from my_v6 group by c_id;
网友评论