飞道的博客

MySQL高阶语句----(二)

460人阅读  评论(0)

目录

一、通配符

准备一张info表

查询名字是 c 开头的记录

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

查询名字中间有 g 的记录

查询 hanmei 后面 3 个字符的名字记录

二、子查询

相同表示例

多表查询

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

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

DELETE 也适用于子查询

在 IN 前面还可以添加 NOT,其作用与 IN 相反,表示否定(即不在子查询的结果集里面) 删除分数不是大于等于80的记录

子查询 - exists

子查询,别名 as

三、视图

作用

四、NULL值

null 值与空值的区别

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

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

统计数量,检测空值是不会被添加到统计中

查询 null 值

查询不为空的值

五、运算符

算术运算符

比较运算符

六、连接查询

1、内连接

2、 左连接

3、右连接

七、存储过程

1、概述

2、优点

3、语法

3.1 参数分类 

3.2 带参数的存储过程

3.3修改存储过程

3.4删除存储过程


链接前文:MySQL数据库高阶语句MySQL数据库高阶语句_茉璃珞的博客-CSDN博客对 MySQL 数据库的查询,除了基本的查询外,有时候需要对查询的结果集进行处理。 例如只取 10 条数据、对查询结果进行排序或分组等等https://blog.csdn.net/weixin_51099370/article/details/125432746?spm=1001.2014.3001.5502

一、通配符

通配符主要用于替换字符串中的部分字符,通过部分字符的匹配将相关结果查询出来。通常通配符都是跟 LIKE(模糊查询)一起使用的,并协同 WHERE 子句共同来完成查询任务。常用的通配符有两个,分别是:

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

准备一张info表

查询名字是 c 开头的记录

select id,name from info where name like 'c%';

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

select id,name from info where name like 'c_en_iu';

查询名字中间有 g 的记录

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

查询 hanmei 后面 3 个字符的名字记录

select id,name from info where name like '___lei';

通配符“%”和“_”不仅可以单独使用,也可以组合使用 ,查询名字以s开头的记录

select id,name from info where name like '%_ei';

说明:其中"%"和"_"都是代替字符的(但是使用“_”的时候注意不要超出定义的字符长度)

二、子查询

子查询也被称作内查询或者嵌套查询,是指在一个查询语句里面还嵌套着另一个查询语句。子查询语句是咸鱼主查询语句被执行的,其结果作为外层的条件返回给主查询进行下一步的查询过滤。自语句可以与逐语句所查询的表相同(也可以是不同的表)

相同表示例


  
  1. select name,score from info where id in ( select id from info where score >= 80);
  2. #其中主语句: select name,score from info where id
  3. 子语句(集合): select id from info where score >= 80

  

自语句中的sql语句是为了最后过滤出一个结果集合,用于逐语句的条件判断 

in:是将主表和字表关联起来的语法

多表查询

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

子查询不仅可以在 SELECT 语句中使用,在 INERT、UPDATE、DELETE 中也同样适用。在嵌套的时候,子查询内部还可以再次嵌套新的子查询,也就是说可以多层嵌套。子查询的结果集可以通过 INSERT 语句插入到其他的表中

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


  
  1. select * from t1; #删除数据之前一定记得要先查询(避免出现错删、误删的状况)
  2. mysql> delete from t1;
  3. mysql> select * from t1;
  4. mysql> insert into t1 select * from info where id in (select id from info);

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

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

 

 

DELETE 也适用于子查询

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

 

 

在 IN 前面还可以添加 NOT,其作用与 IN 相反,表示否定(即不在子查询的结果集里面) 删除分数不是大于等于80的记录


  
  1. select id,name,score from t1;
  2. delete from t1 where id not in (select id where score>=80);

 

 

子查询 - exists

 EXISTS 这个关键字在子查询时,主要用于判断 exists 之后的条件是否成立,如果成立,则正常执行主语句的匹配,如不成立,则不会执行主语句查询,如子查询结果集不成立的话,输出为 null。
:count 为计数,sum 为求和,使用 sum 求和结合 exists,如子查询结果集不成立的话,输出为 null

查询如果存在分数等于 80 的记录则计算 info 的字段数

select count(*) from info where exists(select id from info where score=80);

 

子查询,别名 as

查询 info 表 id,name 字段

select id,name from info;

 

 

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

需求:从 info 表中的 id 和 name 字段的内容做为 "内容" 输出 id 的部分


  
  1. mysql> select id from (select id,name from info);
  2. ERROR 1248 ( 42000): Every derived table must have its own alias
  3. ##报错原因
  4. select * from 表名 此为标准格式,而以上的查询语句, "表名" 的位置其实是一个结果集,
  5. mysql 并不能直接识别,而此时给与结果集设置一个别名,以 "select a.id from a" 的方式查询将此结果集是为一张 "表",就可以正常查询数据了,如下:
  6. select a. id from (select id,name from info) a;
  7. 相当于
  8. select info.id,name from info;
  9. select 表.字段,字段 from 表;

 

 

三、视图

视图是从一个或多个表中导出来的表,是一种虚拟存在的表。视图就像一个窗口,通过这个窗口可以看到系统专门提供的数据。这样,用户可以不用看到整个数据库中的数据,而只关心对自己有用的数据。
数据库中只存放了视图的定义,而没有存放视图中的数据,这些数据存放在原来的表中。使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。视图中的数据依赖于原来表中的数据,一旦表中数据发生改变,显示在视图中的数据也会发生改变。
数据库中的虚拟表不包含真实数据,只是做了映射。镜花水月/倒影,动态保存结果集。

作用

  • 使操作简单化,可以对经常使用的查询定义一个视图,使用户不必为同样的查询操作指定条件

  • 增加数据的安全性,通过视图,用户只能查询和修改指定的数据

  • 提高表的逻辑独立性,视图可以屏蔽原有表结构变化带来的影响

总结:使用视图的大部分情况是为了保障数据安全性,提高查询效率

通过视图定义展示的条件
需求:满足 80 分的学生展示在视图中(这个结果会动态变化,同时可以给不同的人群(例如权限范围)展示不同的视图)


  
  1. create view v_score as select * from info where score >= 80;
  2. #创建名为 v_score 的视图
  3. show table status\G
  4. ##查看视图
  5. select * from v_score;

 

 

修改原表数据并查看视图的变化情况


  
  1. update info set score= '60' where name= 'wangwu';
  2. ##查看视图
  3. select * from v_score;

 

 

总结:从两次视图表的查询结果可以看到,随着原表数据的变化,视图的数据也在实时变化。需要注意的是,不仅改原表视图会变,改视图原表也会变。

四、NULL值

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

null 值与空值的区别

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

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


  
  1. alter table info add column addr varchar( 50);
  2. update info set addr = 'nanjing' where score >= 70;

 

 

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

select count(addr) from info;

 

 

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

update info set address='' where name='wangwu';

 

 

统计数量,检测空值是不会被添加到统计中

select count(address) from info;

 

 

查询 null 值


  
  1. select * from info where address is null;
  2. 空值数据: select count(*) from YourTable where Your Column Name is null;

 

 

查询不为空的值

select * from info where address is not null;

 

五、运算符

MySQL 的运算符用于对记录中的字段值进行运算。MySQL 的运算符共有四种,分别是:算术运算符、比较运算符、逻辑运算符和位运算符。

算术运算符

运算符 描述
+ 加法
- 减法
* 乘法
/ 除法
% 取余

在除法运算和求余数运算中,除数不能为 0,若除数是 0,返回的结果则为 NULL。需要注意的是,如果有多个运算符,按照先乘除后加减的优先级进行运算,相同优先级的运算符没有先后顺序。

比较运算符

运算符 描述
= 等于
> 大于
< 小于
>= 大于等于
<= 小于等于
!=或<> 不等于
IS NULL 判断是否为NULL空值
IS NOT NULL 判断是否不为NULL空值
BETWEEN AND 两者之间
IN 在集合中
LIKE 通配符匹配
GREATEST 两个或多个参数时返回最大值
LEAST 两个或多个参数时返回最小值
REGEXP 正则表达式
  • > 等号(=)是用来判断数字、字符串和表达式是否相等的,如果相等则返回 1(true),如果不相等则返回 0(flase)。如果比较的两者有一个值是 NULL,则比较的结果就是 NULL。其中字符的比较是根据 ASCII 码来判断的,如果 ASCII 码相等,则表示两个字符相同;如果 ASCII 码不相等,则表示两个字符不相同;
  • > 字符串(字母)比较:('a'>'b')其实比较的就是底层的 ASCII 码;
  • > 需要关注的是 ASCII 码有:a、A、0(97、65、48);
  • > 与 linux 返回值表达相反,linux 中运行正常返回值是 0,运行异常返回值是非 0。
     

六、连接查询

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

1、内连接

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

select 表名1.字段1,表名1.字段2 from 表名1 inner join 表名2 on 表名1.字段 = 表名2.字段;

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

2、 左连接

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

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

3、右连接

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

七、存储过程

1、概述

MysQL数据库存储过程是一组为了完成特定功能的SQL语句的集合。存储过程这个功能是从5.0版本才开始支持的,它可以加快数据库的处理速度,增强数据库在实际应用中的灵活性。

存储过程在使用过程中是将常用或者复杂的工作预先使用SQL语句写好并用一个指定的名称存储起来,这个过程经编译和优化后存储在数据库服务器中。当需要使用该存储过程时,只需要调用它即可。操作数据库的传统SQL语句在执行时需要先编译,然后再去执行,跟存储过程一对比,明显存储过程在执行上速度更快,效率更高。存储过程在数据库中创建并保存,它不仅仅是SQL语句的集合,还可以加入一些特殊的控制结构,也可以控制数据的访问方式。
 

2、优点

  • 执行一次后,会将生成的二进制代码驻留缓冲区,提高执行效率
  • SQL语句加上控制语句的集合,灵活性高
  • 在服务器端存储,客户端调用时,降低网络负载
  • 可多次重复被调用,可随时修改,不影响客户端调用
  • 可完成所有的数据库操作,也可控制数据库的信息访问权限

3、语法


  
  1. create procedure <过程名 > ([过程参数……]) <过程体 >
  2. [过程参数……] 格式
  3. <过程名 >:尽量避免与内置的函数或字段重名
  4. <过程体 >:语句
  5. [ in | out | inout] <参数名 > <类型 >

3.1 参数分类 

  • 存储过程的主体部分,即过程体
  • 以 begin 开始,end 结束,若只有一条SQL语句,可省略 begin 和 end
  • 以 delimiter 开始和结束

3.2 带参数的存储过程

  • 输入参数:in 表示调用者向过程传入值(传入值可以是字面量或变量)
  • 输出参数:out 表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
  • 输入/输出参数:inout ,即表示调用者向过程传入值,又表示过程向调用者传入值(只能是变量)
     

3.3修改存储过程


  
  1. alter procedure <过程名 > [ <特征 >……]​
  2. alter procedure ff modifies sql data sql security invoker;
  3. modifies sql data:表名子程序包含写程序的语句
  4. security:安全等级
  5. invoker:当定义为 invoker 时,只要执行者有执行权,就可以成功执行

3.4删除存储过程

drop procedure if exists 存储;


转载:https://blog.csdn.net/weixin_51099370/article/details/125453982
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场