MySQL高级SQL语句(下)

发布时间:2023-02-12 10:30

文章目录

  • 一、通配符
    • 1.1、查询名字是z开头的记录
    • 1.2、查询名字里是l和i中间有一个字符的记录
    • 1.3、查询名字中间有g的记录
    • 1.4、查询tang后面3个字符的名字记录
    • 1.5、查询名字以z开头的记录
  • 二、子查询
    • 2.1、不同表/多表示例
    • 2.2、多表查询
    • 2.3、查询分数大于80的记录
    • 2.4、将t1里的记录全部删除,重新插入zzww表的记录
    • 2.5、DELETE也适用于子查询
    • 2.6、子查询exists
    • 2.7、子查询 别名as
  • 三、试图
    • 3.1、试图和表的区别和联系
    • 3.2、创建视图
    • 3.3、查看表状态
    • 3.4、查看视图
    • 3.5、查看视图和表结构
    • 3.6、多表创建视图
    • 3.7、同时可以通过修改视图修改原表
  • 四、NULL值
    • 4.1、统计数量:检测null是否会加入统计中
    • 4.2、查询null值
    • 4.3、查询不为空的值
  • 五、连接查询
    • 5.1、内连接
      • (1)语法
    • 5.2、左连接
    • 5.3、右连接

一、通配符

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

通配符都是跟like(模糊查询)一起使用,并协同where自居共同来完成查询任务

常用的通配符有两个:

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

1.1、查询名字是z开头的记录

select id,name from zzww where name like 'z%';

MySQL高级SQL语句(下)_第1张图片

1.2、查询名字里是l和i中间有一个字符的记录

select id,name from zzww where name like 'l_il_i';

MySQL高级SQL语句(下)_第2张图片

1.3、查询名字中间有g的记录

select id,name from zzww where name like '%g%';

MySQL高级SQL语句(下)_第3张图片

1.4、查询tang后面3个字符的名字记录

 select id,name from zzww where name like 'lei___';

MySQL高级SQL语句(下)_第4张图片

1.5、查询名字以z开头的记录

通配符“%”和“”不仅可以单独使用,也可以组合使用

select id,name from zzww where name like 'z%_';

MySQL高级SQL语句(下)_第5张图片

二、子查询

子查询也被称作内查询或嵌套查询,是指一个查询语句里面嵌套着另一个查询语句。
子查询语句是先于主查询语句被执行的,其结果作为外层的条件返回给主查询进行下一步的查询过滤
PS: 子语句可以与主语句所查询的表相同,也可以是不同表

MySQL高级SQL语句(下)_第6张图片
子语句中的sql语句是为了最后过滤出一个结果集,用于主语句的判断条件
** in:讲主表和子表关联/连接的语句

2.1、不同表/多表示例

create table xxoo(id int);
insert into xxoo values(1),(2),(3);
select * from xxoo;

MySQL高级SQL语句(下)_第7张图片

2.2、多表查询

select id,name,score from zzww where id in (select * from xxoo);

MySQL高级SQL语句(下)_第8张图片
子查询不仅可以在 SELECT 语句中使用,在 INERT、UPDATE、DELETE 中也同样适用。在嵌套的时候,子查询内部还可以再次嵌套新的子查询,也就是说可以多层嵌套。

(1)语法:

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

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

2.3、查询分数大于80的记录

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

MySQL高级SQL语句(下)_第9张图片
子查询还可以用在 INSERT语句中。子查询的结果集可以通过INSERT 语句插入到共其他的表中

2.4、将t1里的记录全部删除,重新插入zzww表的记录

insert into t1 select * from zzww where id in (select id from zzww);

MySQL高级SQL语句(下)_第10张图片
UPDATE语句也可以使用子查询。UPDATE内的子查询,在 set更新内容时,可以是单独的一列,也可以是多列。

2.5、DELETE也适用于子查询

删除分数大于80的记录

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

MySQL高级SQL语句(下)_第11张图片

2.6、子查询exists

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

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

MySQL高级SQL语句(下)_第12张图片
MySQL高级SQL语句(下)_第13张图片
查询如果分数有等于100的记录则计算zzww1的字段数,如果没有,则返回0

2.7、子查询 别名as

select a.id,a.name from (select id,name from zzww1) a;

MySQL高级SQL语句(下)_第14张图片

三、试图

视图:优化操作+安全方案
数据库中的虚拟表,这张虚拟表中不包含真实数据,只是做了真实数据的映射视图可以理解为镜花水月/倒影,动态保存结果集(数据)
基础表zzww(7行记录) —> 映射(投影)----试图

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

功能:
简化查询结果集、灵活查询、可以针对不同用户呈现不同结果集、相对有更高的安全性本质而言视图是一种select(结果集的呈现)
PS:视图适合于多表连接浏览时使用!不适舍增、删、改
而存储过程适合于使用较频繁的sQL语句,这样可以提高执行效率!

3.1、试图和表的区别和联系

区别

视图是已经编译好的sql语句。而表不是
视图没有实际的物理记录。而表有。show table status\G
表只用物理空间而视图不占用物理空间,视图只是逻辑概念的存在,表可以及时对它进行修改,但视图只能有创建的语句来修改
视图是查看数据表的一种方法,可以查询数据表中某些字段构成的数据,只是一些SQL语句的集合。从安全的角度说,视图可以不给用户接触数据表,从而不知道表结构。
表属于全局模式中的表,是实表;视图属于局部模式的表,是虚表。
视图的建立和删除只影响视图本身,不影响对应的基本表。(但是更新视图数据,是会影响到基本表的)

联系

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

3.2、创建视图

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

在这里插入图片描述

3.3、查看表状态

show table status\G

MySQL高级SQL语句(下)_第15张图片

3.4、查看视图

select * from v_score;

MySQL高级SQL语句(下)_第16张图片

3.5、查看视图和表结构

desc v_score;

MySQL高级SQL语句(下)_第17张图片

3.6、多表创建视图

MySQL高级SQL语句(下)_第18张图片
创建一个视图,需要输出id、学生姓名、分数以及年龄

create view v_zzww(id,name,score,age) as select zzww1.id,zzww1.name,zzww1.score,test01.age from zzww1,test01 where zzww1.name=test01.name;
select * from v_zzww;

MySQL高级SQL语句(下)_第19张图片

3.7、同时可以通过修改视图修改原表

update v_score set score='120'where name='zhusang';
select * from v_score;

MySQL高级SQL语句(下)_第20张图片
MySQL高级SQL语句(下)_第21张图片
修改表不能修改以函数、复合函数方式计算出来的字段查询方便、安全性
查询方便:索引速度快、同时可以多表查询更为迅速(视图不保存真实数据,视图本质类似select)安全性:我们实现登陆的账户是root—》所拥有权限﹐视图无法显示完整的约束

四、NULL值

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

查询zzww表结构,name字段不允许空值

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

desc zzww;

MySQL高级SQL语句(下)_第22张图片
插入一条记录,分数字段输入null,显示出来就是null
验证

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

4.1、统计数量:检测null是否会加入统计中

MySQL高级SQL语句(下)_第23张图片
将zzww表中其中一条数据修改为空值,并统计数量,检测空值是不会被添加到统计中
MySQL高级SQL语句(下)_第24张图片

4.2、查询null值

select * from zzww where addr is NULL;

MySQL高级SQL语句(下)_第25张图片

4.3、查询不为空的值

select * from zzww where addr is not NULL;

MySQL高级SQL语句(下)_第26张图片

五、连接查询

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

5.1、内连接

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

(1)语法

SELECT column_name(s)FROM table1 INNER JOIN table2 ON table1.column_name =tasle2.column name;

MySQL高级SQL语句(下)_第27张图片
内连查询:通过inner join的方式将两张表指定的相同字段的记录行输出出来
内连查询: 面试,直接了当的说用inner join就可以

5.2、左连接

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

MySQL高级SQL语句(下)_第28张图片
左连接
将两张表的内容进行匹配,按照sql查询的顺序(左—》右)输出左表的全部内容和右边的共同的数据内容

左连接中左表的记录将会全部表示出来,而右表只会显示符合搜索条件的记录,右表记录不足的地方均为NULL。

5.3、右连接

右连接也被称为右外连接,在FROM子句中使用RIGHTJoIN或者RIGHT OUTER JOIN关键字来表示。右连接跟左连接正好相反,它是以右表为基础表,用于接收右表中的所有行,并用这些记录与左表中的行进行匹配
MySQL高级SQL语句(下)_第29张图片
在右连接的查询结果集中,除了符合匹配规则的行外,还包括右表中有但是左表中不匹配的行,这些记录在左表中以NULL补足

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号