MySQL子查询

子查询:内查询、嵌套查询

select 。。。。。。(select)

括号里面的查询语句会先于主查询语句执行,然后再把子查询的结果作为条件返回给主查询条件进行过滤

报错:子查询返回的结果只能是一列,多列就报错

MySQL子查询_第1张图片

where条件in什么,子查询的列就是什么,两者之间应该一一对应,否则识别不到

MySQL子查询_第2张图片

这两张表有相同的名字,查询成绩

MySQL子查询_第3张图片

MySQL子查询_第4张图片

取反。这个表中大于76分的都不要,只保留低于76分的

MySQL子查询_第5张图片

子查询语句还可以用在insert、update、delete

insert into student select * from info where id in (select id from info where sex='女');

insert into test1 select * from info where id in (select id from info where address like '%四川%');

update info set score=50 where id in (select id from student where id = 2);

update info set score=100 where id not in (select id from test1 where id > 1);

delete from info where id in (select id where score > 75);

exists:关键字子查询。主要用于判断子查询的结果是否为空。不为空,返回true。为空则为false

MySQL子查询_第6张图片

视图:MySQL中的视图view

视图在MySQL中是一个虚拟的表。基于查询结果得出的一个虚拟表。

在工作中,我们查询的表未必是真表。有可能是基于真表查询结果的一个虚拟表

可以简化负载的查询语句,隐藏表的细节,提供安全的数据访问

创建视图表可以是一张表的结果集,也可以是多个表共同的查询的结果集

create view test2 as select * from info where score >= 80;

select * from test2;

desc test2;

desc info;

MySQL子查询_第7张图片

视图表和真表之间的区别:

1、存储方式不一样。

真表存储实际数据,真正写在磁盘当中的

视图表不存储任何数据,仅仅是一个查询结果集的虚拟表

2、数据更新不一样

真表可以增删改查

视图表一般只能用于查,展示数据

3、占用空间不一样

真表真实占用空间

视图表不占用数据库空间的

查看当前库有哪些视图表,并删除

MySQL子查询_第8张图片

create table tset01 (

id int,

name varchar(15),

age int(3)

);

根据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.tset01 b where a.name=b.name;

select * from v_info;

update info set score=90 where name='胡晋';

select * from v_info;

源表的数据发生变化,视图表的数据同步更新

update v_info set age=9000 where name='王宇航';

修改了视图表,源表的数据也会发生变化。一般情况我们是不对视图进行改的操作

真表占了80%,视图适用于安全性要求比较高的场景。对外访问基本都是视图

null值和空值

null值就是社么都没有,类似于真空

空值可以理解为空气

如何鉴别

select * from info where score is null;

select * from info where score is not null;

select * from info where address is not null;

为空,不是null值

MySQL子查询_第9张图片

null值不被统计,但是空值可以被统计

MySQL子查询_第10张图片

MySQL子查询_第11张图片

连接查询

1、内连接

把两张表或者多张表(不超过三张)之间同时符合特定条件的数据记录的组合。多个表之间有一个或者多个列的相同值才会有查询结果。

select a.id,a.name from tset01 a inner join info b on a.name=b.name;

MySQL子查询_第12张图片

select a.id,a.name from tset01 a inner join info b on a.id=b.id;

MySQL子查询_第13张图片

select a.id,a.name from tset01 a inner join info b on a.name=b.name and a.id=b.id;

MySQL子查询_第14张图片

2、左连接

又叫左外连接,在语句中用left join关键字来表示。在左连接中,左侧表是基础表,接收左边的所有行,然后和右表(参考表)记录进行匹配。匹配左表中的所有行以及右表中符合条件的行

select * from tset01 a left join info b on a.name=b.name;

MySQL子查询_第15张图片

select a.id,a.name,b.score,b.name from tset01 a left join info b on a.name=b.name;

MySQL子查询_第16张图片

3、右连接

又叫右外连接,right join关键字连接。以右侧表为基础,接收右侧表的所有记录,匹配的记录,不匹配的记录null值

select a.id,a.name,b.score,b.name from tset01 a right join info b on a.name=b.name;

MySQL子查询_第17张图片

select * from tset01 a right join info b on a.name=b.name;

MySQL子查询_第18张图片

select * from tset01 a right join info b on a.id=b.id;

MySQL子查询_第19张图片

select * from tset01 a right join info b on a.id=b.id and a.name=b.name;

MySQL子查询_第20张图片

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