一个查询语句中还有一个查询语句
Select,,,(select)
括号里的查询语句优先于查询语句执行,然后再把子查询的结果作为条件返回给主查询条件进行过滤
格式:
#In
Select 列名from 表名 where列名A In (select 列名A from 表名)
##Not In (取反)使用not in 子查询需要跟上where语句 否则都没
Select 列名from 表名 where列名A not in (select 列名A from 表名 where 列名)
##子查询的语句返回的结果只能是一列 where 列名和子查询列名一致
select name,score from info where id in (select id from info where score > 80);
select id from info where id not in (select id from ky32 where score > 70);
插入数据 要求按照地址,包含南京插入到test
Insert into test select * from info where id in (select id from info where address like ‘%南京%’ )
修改Info表score=100,not in 子查询的条件是id >1
Update info set score=100 where id not in (select id from ky32 where id > 1);
删除分数大于80的记录
Delete from info where id in (select id where score>80 )
关键字在子查询时,主要用于判断子查询的结果是否为空,不为空,返回为ture,反之,则返回 FALSE
#输入子查询语句前
select count(*) from info where exists(select id from info where score>80);
#将结果集做为一张表进行查询的时候,我们也需要用到别名
使用表别名来区分外部查询和子查询中的表。info 表被表示为别名 a,并且这个别名被用于引用外部查询中的列
SELECT * FROM info a WHERE EXISTS (SELECT id FROM info WHERE score > 80 AND info.id = a.id);
视图在MySQL当中是一个虚拟表,基于查询结果得出的一个表
在工作中查询的表未必是真表,有可能是基于查询结果的一个虚拟表
可以简化复杂的查询语句,还能隐藏表的细节,提供安全的数据访问,
创建视图表,可以是一张表的结果集,也可以是多个表的结果集,
源表的数据发生变化,视图表的数据会同步更新
视图适用于安全性要求比较高的场景
Update info set score=90 where name = ‘胡晋’;
create view test2 as select * from info where score >= 80;
视图表和真表的区别:
1存储方式不一样,真实的表是存储实际数据写在磁盘中的,视图不存储任何数据的,是个结果集
2表可以增删改查,视图表一般只能用于查展示数据
3 真实表真实占用空间,视图表不占用空间
#查看表状态
show table status;
#查看视图
mysql> select * from test2
#查看视图与源表结构
mysql> desc test2;
#修改原表数据,视图同步生效
mysql> update info set score='60' where name='liuyi';
#查看视图
mysql> select * from v_info;
null就是真空
空值也是值,可以被统计的
select * from info where score is null;
On 跟匹配条件
内连接:是把两张表或者多张表,同时符合特定条件的数据记录组合。一个或者多个列相同值才会有查询结果。
内连接语句
select a.id,a.name from test10 a inner join info b on a.id=b.id;
左外连接,在left Join 关键字来表示,在左连接当中,左侧表示基础表,
接收左边的所有行,然后和右表(参考表)记录进行匹配,匹配坐标中的所有行,以及右表中符合条件的行
##左连接语句
Select * from test10 a left join info b on a.nmae=b.name;
右连接也被称为右外连接,在 FROM 子句中使用 RIGHT JOIN 或者 RIGHT OUTER JOIN 关键字来表示。
右连接跟左连接正好相反,它是以右表为基础表,用于接收右表中的所有行,并用这些记录与左表中的行进行匹配
##右连接语句
mysql> select * from test1 a right join test2 b on a.a_name=b.b_name;
Select * from test10 a right join info b on a.id=b.id