数据库 高阶语句2

子查询:内查询 嵌套查询

#select 嵌套 (嵌套) ,括号里面的查询语句会先于查询语句执行,然后再把子查询的结果作为条件返回给主查询条件进行过滤
语法
mysql> select * from info;
+----+--------+--------+--------------+-----+
| id | name   | score  | address      | sex |
+----+--------+--------+--------------+-----+
|  1 | 郭旗   | 100.00 | 北京西路     | 男  |
|  2 | 韩文   |  90.00 | 南京西路     | 男  |
|  3 | 王浩   |  60.00 | 东京西路     | 男  |
|  4 | 杨树   |  99.00 | 山东西路     | 女  |
|  5 | 姚美   |  98.00 | 山西西路     | 女  |
|  6 | 刘亚   |  10.00 | 四川西路     | 男  |
|  7 | 袁野   |  11.00 | 内蒙西路     | 女  |
|  8 | 刘文   | 100.00 | 河南西路     | 男  |
+----+--------+--------+--------------+-----+
#举例
select name,score from info where id in (select id from info where score > 80);
+--------+--------+
| name   | score  |
+--------+--------+
| 郭旗   | 100.00 |
| 韩文   |  90.00 |
| 杨树   |  99.00 |
| 姚美   |  98.00 |
| 刘文   | 100.00 |
+--------+--------+
select id,name,score from info where id in (select id from ys66);
#查询ys66的id列,将它ys66查询出来的id列传给info表之后在进行过滤,这两张表右相同的名字,查询成绩

select id,name,score from info where name in (select name from ys66)
#查询ys66的name列

select id,name,score from info where id not in (select id from info where score > 70);
#子查询里info表需要加上where语句大于70分取反,也就是小于70分显示出来。

insert into 

insert into test select * from info where id in (select id from info where sex='女');
#info表sex列=女,才会插入test表

例:插入一个数据,要求按地址,包含南京插入到test
insert into test select * from info where id in (select id from info where address like
'南京');
#这个地方不能直接等于南京,只能用like '南京' 如果用=结果会有偏差


update
update info set score=50 where id in (select id from ys66 where id = 2);
#更新info表 set指定 成绩=50 ,通过 id 子查询 ys66 表 的id列 2确定,

update info set score=100,where id not in (select id from ys66 where id > 1);
# 更新info表 score=100 , 只要id列不是大于1的列都更新

exists

关键字在子查询时,主要用于判断子查询的结果集是否为空,不为空返还true,为空则返回false

举例:根据info表,查询大于80分的同学,然后统计有多少个
select count(*) from info where exists (select id from info where score > 80);
#只要有一个条件满足,那么就会判断为真,将所有的数据都展示

select count(*) from info a where exists (select id from info where score > 80 and info.id=a.id);

视图view

#视图:mysql当中的视图view
#视图在mysql当中是一个虚拟表,基于查询结果得出的一个虚拟表
#在工作中,查询的表未必是真表,有可能是基于真表查询结果的一个虚拟表,它有个好处,可以简化复杂的查询语句,隐藏表的细节,提供安全的数据访问
#创建视图表可以使一张表的结果集,也可以是多个表的共同的查询的结果集

create view test2 as select * from info where score >= 80;
#创建虚拟表test2 数据从查询info表获得,但score必须大于等于80 才会被写入虚拟表test2

视图表和真表之间的区别
1.存储方式不一样,真表存储实际数据,真正写在磁盘当中,视图不存储任何数据,仅仅是一个查询结果集的虚拟表
2.真表可以增删改查,但是视图一般情况只能用于查,展示数据
3.占用空间,真表真实占用空间,视图是不占用数据库空间

举例
show full tables in ys66 where table_type like 'view';
#查询ys66库 哪些表的类型是 视图:虚拟表

drop view v_score;
#删除视图:虚拟表

#根据多个表来创建视图表(虚拟表)
#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 跟上info的id name score和test01的age别名,再定义info的别名a和test01的别名b,最后加上约束(info别名)a.name等于(test01别名)b.name 

你可能感兴趣的:(数据库)