select name ,score from info where id in (select id from info where score >80);
子查询返回的结果只能是1列
where条件in什么,子查询的列就是什么
create table ky32 (
id int(4)
);
多表联查,不要超过三张。
通过ky32表中的id,查询info表中id,name,score。
select id,name,score from info where id in (select id from ky32);
通过ky32表中的name,查询info表中id,name,score。
select id,name,score from info where name in (select name from ky32);
通过ky32表中的id但是分数要大于70,查询info表中id,name,score。
select id,name,score from info where id not in (select id from info where score >70);
要加where条件
通过ky32表中的id取反,查询info表中id,name,score。
select id,name,score from info where id not in (select id from ky32);
select * from test;
子查询语句还可以用在insert update delete
插入语句
插入数据,要求按性别,把info表女的插入到test表
insert into test select * from info where id in (select id from info where sex='女');
插入数据,要求按地址,包含南京插入到test
insert into test select * from info where id in (select id from info where address like 'nj%');
update语句
修改info表中等于ky32表中id=2
UPDATE info set score=50 where id in (select id from ky32 where id=2);
修改info表score=100 not in 子查询的条件id>1.
update info set score=100 where id not in (select id from test where id>1);
delete语句
删除表中分数大于80
delete from info where id in (select id where score >80);
exists:关键字在子查询是,主要用于子查询的结果是否为空,不为空,返回true。为空,false。
根据info表,查询出大于80分的同学,然后统计有多少个。
select count(*) from info a where exists(select id from info where score > 80 and info.id=a.id);
里外查询条件的结果要一致,要起别名。
查询出小于80分的同学,select count() from info a where exists(select id from info where score< 80 and info.id=a.id);
视图:mysql当中的视图 VIEW
视图在mysql当中是一个虚拟表。基于查询结果得出的一个虚拟表。
在工作当中,我们查询的表未必是真表。有可能就是基于真表查询结果的一个虚拟表
可以简化复杂的查询语句,隐藏表的细节。提供安全的数据访问。
创建视图可以是一张表的结果集,也可以是多个表共同查询的结果集
create view test2 as select * from info where score >=80;
select * from test2;
desc test2;
desc info;
视图表和真表之间的区别:
1,存储方式不一样,真表存储实际实际,真正写在磁盘当中的。视图不存储任何数据,仅仅是一个查询结果集的虚拟表
2,表可以增删改查,但是视图一般情况只能用于查,展示数据
3,占用空间,真表真实占用空间,视图不占用数据库空间。
在数据库中查询有哪些视图?
show full tables in kgc1 where table_type like 'view';
删除: drop view v_score;
根据多个表查询视图:
create table test01 (
id int,
name VARCHAR(15),
age int(3)
);
info 和 test01 根据info的id,name,score,加上test01的age.
create view v_info(id,name,score,age) as
select a.id,a.name,a.score,b.age from info a,test01 b
where a.name=b.name;
select * from v_info;
update info set score=90 where name='cc1';
源表的数据发生变化,视图表数据同步更新
update v_info set age=100 where name='cc3';
更新数据表源表是数据也会发生变化。一
情况下不对视图表进行改的操作。
真表占了80%,视图适用于安全性要求比较高的场景。对外访问,基本都是视图。
null和空值:
null:就是真空
空值 空气
select * from info where score is null;
select * from info where address is not null;
select count(address) from info;
null是不被统计的,空值可以被统计。
连接查询:(面试题)
内连接:
是把两张表或者多张表(三张),同时符合特定统计的数据记录的组合。
一个或者多个列的相同值才会有查询的结果。
on后面的条件做判断
select a.id,a.name from test01 a inner join info b on a.name=b.name;
左连接:
左外连接,在语句中:left join关键字来表示。在左连接中,左侧表示基础表,
接受左边所有行,然后和右表(参考表)记录进行匹配。
匹配左表当中所有行,以及右表中符合条件的行。
select * from test01 a left join info b on a.name=b.name;
右表当中没有匹配的以null来表示。
select a.name,a.id,b.name,b.id from test01 a left join info b on a.name=b.name;
右连接:
右外连接,right join 以右侧表为基础。接受右表的所有记录,匹配的记录,不匹配的记录null值
select * from test01 a right join info b on a.name=b.name;
select * from test01 a right join info b on a.id=b.id;