MySQL高级SQL语句(终章)

目录

一:通配符

1.1查询名字是有开头的记录

1.2查询名字里是贝和摩中间有一个字符的记录

1.3查看贝后面3个字符的名字记录

1.4通配符%和_结合使用

二:子查询

2.1相同表查询

2.2不同表/多表查询

2.3子查询的多层嵌套

2.3.1语法格式

2.3.2查询分数大于80的记录

2.3.3insert语句使用子查询

2.3.4update语句使用子查询

2.3.5delete语句使用子查询

2.4exists判断子查询是否为空

2.4.1查询如果存在分数等于100的记录则计算class的字段数 

2.4.2查询如果存在分数等于50的记录则计算class的字段数  

2.4.3将结果集作为一张表进行查询

三:MySQL视图

3.1视图的概念

3.2作用场景

3.3作用范围

3.4视图功能

3.5视图和表的区别和联系

3.5.1区别

3.5.2联系

3.6视图的案例

3.6.1满足80分的学生展示在视图中

3.6.2修改原表数据

3.6.3通过视图修改原表

四:NULL值

4.1null值与空值的区别

4.2统计数量,检测null是否会加入统计中

4.3将class表中其中一条数据修改为空值' '

4.4统计数量,检测空值是否被添加到统计中

4.5查询null的值

4.6查询不为null的值 

五:连接查询

5.1内连接

5.1.1语法格式

5.1.2案例

5.2左连接

5.3右连接

六:总结


前言:本章是MySQL高级SQL语句(开端)的续篇,我们接着来学习在工作中需要用到的语句

本篇内容所运用的示例表沿用MySQL高级SQL语句(开端)中的表

一:通配符

通配符主要用于替换字符串中的部分字符,通过部分字符的匹配将相关结果查询出来

通常通配符都是跟LIKE 一起使用的,并协同WHERE子句共同来完成查询任务。常用的通配符有俩个,分别为:

%:百分号表示零个、一个或多个字符
_:下划线表示单个字符
like:模糊查询

1.1查询名字是有开头的记录

select id,name from class where name like '有%';

1.2查询名字里是贝和摩中间有一个字符的记录

select id,name from class where name like '贝_摩_';

1.3查看贝后面3个字符的名字记录

select id,name from class where name like '贝___';

1.4通配符%和_结合使用

select id,name from class where name like '贝%_'

二:子查询

子查询也被称作内查询或者嵌套查询,是指在一个查询语句里面还嵌套着另一个查询语句。子查询语句是先于主查询语句被执行的,其结果作为外层的条件返回给主查询进行下一步的查询过滤

ps:子语句可以与主语句所查询的表相同,也可以是不同表

2.1相同表查询

select name,score from class where id in (select id from class where score >80);
 
主语句:select name,score from class where id
子语句(集合):select id from class where score >80
 
in:将主表和子表关联/连接的语法
ps:子语句中的sql语句是为了,最后过滤出一个结果集,用于主语句的判断条件

2.2不同表/多表查询

在创建一个class1表

create table class1 (id int);
insert into class1 values(1),(2),(3);

select id,name,score from class where id in (select * from class1);

2.3子查询的多层嵌套

子查询不仅可以在 SELECT 语句中使用,在 INERT、UPDATE、DELETE 中也同样适用。在嵌套的时候,子查询内部还可以再次嵌套新的子查询,也就是说可以多层嵌套

2.3.1语法格式

<表达式> [NOT] IN <子查询>
IN 用来判断某个值是否在给定的结果集中,通常结合子查询来使用

当表达式与子查询返回的结果集中的某个值相等时,返回 TRUE,否则返回 FALSE。 若启用了 NOT 关键字,则返回值相反。需要注意的是,子查询只能返回一列数据,如果需 求比较复杂,一列解决不了问题,可以使用多层嵌套的方式来应对。 多数情况下,子查询都是与 SELECT 语句一起使用的

2.3.2查询分数大于80的记录

select name,score from class where id in (select id from class where score >80);

2.3.3insert语句使用子查询

子查询还可以用在 INSERT 语句中。子查询的结果集可以通过 INSERT 语句插入到其他的表中

将class2里的记录全部删除,重新插入class表的记录

create table class2 like class;
insert into class2 select * from class where id in (select id from class);

2.3.4update语句使用子查询

update语句也可以使用子查询,update内的子查询,在set更新内容时,可以是单独的一列,也可以是多列

将id=2小兰的分数改为70

update class2 set score=70 where id in (select * from class1 where id=2);

update class2 set score=100 where id not in (select * from class1 where id>1);
在 IN 前面还可以添加 NOT,其作用与 IN 相反,表示否定(即不在子查询的结果集里面)

2.3.5delete语句使用子查询

删除分数大于80的记录

delete from class2 where id in (select id where score >80);

删除分数不是大于等于80的记录

delete from class2 where id not in (select id where score >=80);
在 IN 前面还可以添加 NOT,其作用与 IN 相反,表示否定(即不在子查询的结果集里面)

2.4exists判断子查询是否为空

EXISTS 这个关键字在子查询时,主要用于判断子查询的结果集是否为空。如果不为空, 则返回 TRUE;反之,则返回 FALSE

2.4.1查询如果存在分数等于100的记录则计算class的字段数 

select count(*) from class where exists(select id from class where score=100);

2.4.2查询如果存在分数等于50的记录则计算class的字段数  

select count(*) from class where exists(select id from class where score=50);

2.4.3将结果集作为一张表进行查询

将结果集做为一张表进行查询的时候,我们也需要用到别名

从class表中的id和name字段的内容做为"内容" 输出id的部分 

select * from 表名 此为标准格式,而以上的查询语句,"表名"的位置其实是一个结果集,mysql并不能直接识别,而此时给与结果集设置一个别名,以”select a.id from a“的方式查询将此结果集是为一张"表",就可以正常查询数据了,如下:

select id from (select id,name from class) as a;

三:MySQL视图

3.1视图的概念

数据库中的虚拟表,这张虚拟表中不包含真实数据,只是做了真实数据的映射

视图可以理解为镜花水月/倒影,动态保存结果集(数据) 

基础表class(8行记录)-----》映射(投影)-----》视图 

3.2作用场景

针对不同的人(权限身份),提供不同结果集的“表”(以表格的形式展示)

3.3作用范围

select * from info;			#展示的部分是info表
select * from view_name;	#展示的一张或多张表

3.4视图功能

简化查询结果集、灵活查询、可以针对不同用户呈现不同结果集、相对有更高的安全性
本质而言视图是一种select(结果集的呈现)
查询方便:视图不保存真实数据,视图本质类似select,同时可以多表查询更为迅速
安全性:视图无法显示完整的约束

ps:视图适合于多表连接浏览时使用!不适合增、删、改
而存储过程适合于使用较频繁的SQL语句,这样可以提高执行效率

3.5视图和表的区别和联系

3.5.1区别

(1)视图是已经编译好的sql语句。而表不是

(2)视图没有实际的物理记录。而表有

show table status\G

(3)表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时对它进行修改,但视图只能有创建的语句来修改

(4)视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构

(5)表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表

(6)视图的建立和删除只影响视图本身,不影响对应的基本表。(但是更新视图数据,是会影响到基本表的)

3.5.2联系

视图(view)是在基本表之上建立的表,它的结构(即所定义的列)和内容(即所有数据行)都来自基本表,它依据基本表存在而存在。一个视图可以对应一个基本表,也可以对应多个基本表。视图是基本表的抽象和在逻辑意义上建立的新关系

3.6视图的案例

3.6.1满足80分的学生展示在视图中

这个结果会动态变化,同时可以给不同的人群(例如权限范围)展示不同的视图

创建视图(单表)

create view v_score as select * from class where score >=80;

查看表状态

show table status\G

查看视图

select * from v_score;

查看视图与源表结构

desc v_score;
desc class;

3.6.2修改原表数据

update class set score='60' where name='小兰';

3.6.3通过视图修改原表

update v_score set score='120' where name='柯南';

修改表不能修改以函数、复合函数方式计算出来的字段

查询方便、安全性

查询方便:索引速度快、同时可以多表查询更为迅速(视图不保存真实数据,视图本质类似select)

安全性:我们实现登录的账号是root(所拥有权限),视图无法显示完整的约束四:NULL值

四:NULL值

在 SQL 语句使用过程中,经常会碰到 NULL 这几个字符。通常使用 NULL 来表示缺失 的值,也就是在表中该字段是没有值的。如果在创建表时,限制某些字段不为空,则可以使用 NOT NULL 关键字,不使用则默认可以为空。在向表内插入记录或者更新记录时,如果该字段没有 NOT NULL 并且没有值,这时候新记录的该字段将被保存为 NULL。需要注意 的是,NULL 值与数字 0 或者空白(spaces)的字段是不同的,值为 NULL 的字段是没有 值的。在 SQL 语句中,使用 IS NULL 可以判断表内的某个字段是不是 NULL 值,相反的用 IS NOT NULL 可以判断不是NULL值

4.1null值与空值的区别

空值长度为0,不占空间,NULL值的长度为null,占用空间
is null无法判断空值
空值使用"=“或者”<>"来处理(!=)
count()计算时,NULL会忽略,空值会加入计算
desc class;

插入一条记录,分数字段输入null,显示出来就是null

alter table  class add column addr varchar(50);
update class set addr='al' where score >=70;

4.2统计数量,检测null是否会加入统计中

select count(addr) from class;

4.3将class表中其中一条数据修改为空值' '

update class set addr=' ' where name='元太';

4.4统计数量,检测空值是否被添加到统计中

select count(addr) from class;

4.5查询null的值

select * from class where addr is null;

4.6查询不为null的值 

select * from class where addr is not null;

五:连接查询

MySQL 的连接查询,通常都是将来自两个或多个表的记录行结合起来,基于这些表之间的 共同字段,进行数据的拼接。首先,要确定一个主表作为结果集,然后将其他表的行有选择 性的连接到选定的主表结果集上。使用较多的连接查询包括:内连接、左连接和右连接

5.1内连接

MySQL 中的内连接就是两张或多张表中同时符合某种条件的数据记录的组合。通常在 FROM 子句中使用关键字 INNER JOIN 来连接多张表,并使用 ON 子句设置连接条件,内连接是系统默认的表连接,所以在 FROM 子句后可以省略 INNER 关键字,只使用 关键字 JOIN。同时有多个表时,也可以连续使用 INNER JOIN 来实现多表的内连接,不过为了更好的性能,建议最好不要超过三个表

5.1.1语法格式

select column_name(s) from table1 inner join table2 on table1.column_name = table2.column_name; 

5.1.2案例

创建一个class2表用作和class表连接

create table class2(name varchar(40),score decimal(5,2),address varchar(40));
insert into class2 values('蝴蝶忍',23,'花街'),('炭治郎',21,'水门'),('鸣人',26,'木叶村');
insert into class2 values('柯南',120,'东京'),('有希子',60,'京都'),('步美',45,'宇都宫'),('平次',60,'大阪');
select * from class2;

select class.id,class.name from class inner join class2 on class.name=class2.name;

内连查询:通过inner join的方式将俩张表指定的相同字段的记录行输出出来

5.2左连接

左连接也可以被称为左外连接,在 FROM 子句中使用 LEFT JOIN 或者 LEFT OUTER JOIN 关键字来表示。左连接以左侧表为基础表,接收左表的所有行,并用这些行与右侧参考表中的记录进行匹配,也就是说匹配左表中的所有行以及右表中符合条件的行 

5.3右连接

右连接也被称为右外连接,在 FROM 子句中使用 RIGHT JOIN 或者 RIGHT OUTER JOIN 关键字来表示。右连接跟左连接正好相反,它是以右表为基础表,用于接收右表中的所有行,并用这些记录与左表中的行进行匹配

select * from class right join class2 on class.name=class2.name;

六:总结

本篇主要讲述了MySQL高级SQL语句中通配符、子查询(可结合insert语句、update语句、delete语句)、视图、null值、连接查询的用法,结合开端篇的order by、and/or、distinct、group by、limit、alias,我们都必须要熟练掌握,在工作中我们会经常使用到。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值