本章目录
一.mysql高级语句分类
1.1 连接查询
简介:MySQL 的连接查询,通常都是将来自两个或多个表的行结合起来,基于这些表之间的共同字段,进行数据的拼接。
先在player数据库中,添加两张表,为a_player和b_player表,并给它们添加数据。
1.2 内连接
含义:MySQL 中的内连接就是两张或多张表中同时符合某种条件的数据记录的组合。通常在FROM 子句中使用关键字 INNER JOIN 来连接多张表,
并使用 ON 子句设置连接条件
如图所示:
语法格式:
SELECT column_name(s)FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name;
语句:select a_id,a_name,a_level from a_player inner join b_player on a_id=b_id;
注意一下:内连接是系统默认的表连接,所以在 FROM 子句后可以省略 INNER 关键字,只使用关键字 JOIN。同时有多个表时,也可以连续使用 INNER JOIN 来实现多表的内连接,不过为了更好的性能,建议最好不要超过三个表。
分析:上述操作是将 a_player 表的每一行与 b_player 表的每一行进行比较,以检查它们是否都满足条件。当满足条件时,INNER JOIN 将返回由 a_player 表和 b_player 表中的列组成的新行。如果没有匹配项,查询将返回一个空的结果集。INNER JOIN 结果集中的行必须出现在两个表 a_player 和 b_player 中,是这两个表的交叉部分,如果表中至少有一个匹配项,INNER JOIN 关键字将返回一行。如果没有匹配项,则不会有输出结果。
1.3 左连接
简介:左连接也可以被称为左外连接,在 FROM 子句中使用 LEFT JOIN 或者 LEFT OUTER JOIN 关键字来表示。左连接以左侧表为基础表,接收左表的所有行,
并用这些行与右侧参考表中的记录进行匹配,也就是说匹配左表中的所有行以及右表中符合条件的行。
如图所示:
语句: select * from a_player a left join b_player b on a.a_id=b.b_id;
从以上左连接查询结果可以看出,除了匹配的行,a_id 和 b_id 是 2 和 3 那两行,还包括了左表中有但右表中没有的行,
如果有表没有对应值,则使用 NULL 代替。也就是说在左连接查询中,使用 NULL 值表示右表中没有找到与左表中匹配的记录。
从原理图可以看出,左连接中左表的记录将会全部表示出来,而右表只会显示符合搜索 条件的记录,也就是图中交叉的部分。右表记录不足的地方均为 NULL。
1.4 右连接
简介:右连接也被称为右外连接,在 FROM 子句中使用 RIGHT JOIN 或者 RIGHT OUTER JOIN 关键字来表示。右连接跟左连接正好相反,它是以右表为基础表,用于接收右表中的所有行,并用这些记录与左表中的行进行匹配。也就是说匹配右表中的每一行及左表中符合条件的记录。
如图所示:
语句:select * from a_player a right join b_player b on a.a_id=b.b_id;
分析:在右连接的查询结果集中,除了符合匹配规则的行外,还包括右表中有但是左表中不匹 配的行,这些记录在左表中以 NULL 补足
二.数据库函数
简介:MySQL 数据库函数提供了能够实现各种功能的方法,使我们在查询记录时能够更高效的输出。MySQL 内建了很多函数,常用的包括数学函数、聚合函数、字符串函数和日期时间函数。
2.1 数学函数
常用的数学函数如下:
- abs(x) 返回 x 的绝对值
- rand() 返回 0 到 1 的随机数
- mod(x,y) 返回 x 除以 y 以后的余数
- power(x,y) 返回 x 的 y 次方
- round(x) 返回离 x 最近的整数
- round(x,y) 保留x 的y 位小数四舍五入后的值
- sqrt(x) 返回 x 的平方根
- truncate(x,y) 返回数字 x 截断为 y 位小数的值
- ceil(x) 返回大于或等于 x 的最小整数
- floor(x) 返回小于或等于 x 的最大整数
- greatest(x1,x2…) 返回集合中最大的值
- least(x1,x2…) 返回集合中最小的值
下面演示MySQL 数学函数的使用方法
语句示例:
select abs(-1), rand(), mod(5,3), power(2,3), round(1.89);
分析:通过上面的数学函数表,先算出(-1)的绝对值为1,rand表示为它的随机值可以为0,并且它是无限接近于1,但是不能为1,mod表示取余,算出值为2,round(1.89)四舍五入后变成2。
语句示例:
select round(1.8937,3), sqrt(4),truncate(1.235,2), ceil(5.2), floor(2.1);
分析:通过上面的数学函数表,round中y 表示小数四舍五入后的值,y等于3,也就是小数点向右移3位,四舍五入后就变成1.894,sqrt(4)中4的平方根就是2,truncate数字 x 截断为 y 位小数的值,y的值为2,表示小数点后二位有效数字,得到结果为1.23,ceil(5.2)取比5大的最小整数,也就是6,floor(2.1)表示小于或等于2的最大整数,因此最大的取值就是为2
语句示例:select greatest(4.33,2,1,6,5.5),least(1.89,3,6.1,2.1);
分析:通过上面的数学函数表,greatest取集合中最大值6,least取集合中的最小值为1.89。
2.2 聚合函数
简介:MySQL 数据库函数中专门有一组函数是特意为库内记录求和或者对表中的数据进行集中概括而设计的,这些函数被称作聚合函数
常用的聚合函数如下:
- avg() 返回指定列的平均值
- count() 返回指定列中非 NULL 值的个数
- min() 返回指定列的最小值
- max() 返回指定列的最大值
- sum(x) 返回指定列的所有值之和
语句示例:
select avg(level) as avg_level from player;
select count(level) as count_level from player;
select min(level) as min_level from player;
select max(level) as max_level from player;
select sum(level) as sum_level from player;
查询player表的所有信息
通过聚合函数的算法,得到以下的数值
2.3 字符串函数
常用的字符串函数如下:
- length(x) 返回字符串 x 的长度
- trim() 返回去除指定格式的值
- concat(x,y) 将提供的参数 x 和 y 拼接成一个字符串
- upper(x) 将字符串 x 的所有字母变成大写字母
- lower(x) 将字符串 x 的所有字母变成小写字母
- left(x,y) 返回字符串 x 的前 y 个字符
- right(x,y) 返回字符串 x 的后 y 个字符
- repeat(x,y) 将字符串 x 重复 y 次
- space(x) 返回 x 个空格
- replace(x,y,z) 将字符串 z 替代字符串 x 中的字符串 y
- strcmp(x,y) 比较 x 和 y,返回的值可以为-1,0,1
- substring(x,y,z) 获取从字符串 x 中的第 y 个位置开始长度为 z 的字符串
- reverse(x) 将字符串 x 反转
语句示例:select length(‘bdqn’), trim(’ yellow '), concat(‘bd’, ‘qn’), upper(‘abc’),
分析:length表示统计’bdqn’的字符串的长度,很显然长度为4,trim表示括号当中两个单引号被去除了,然后输出里面的值,得到结果为yellow,concat中把两个单引号括起来的bd和qn合并成一个字符串,输出结果为bdqn,upper把字母变成大写字母,所以结果为ABC。
语句示例:select lower(‘ABC’),left(‘world’,3),right(‘hello’, 3),repeat(‘kgc’, 2);
分析: lower把字母变成小写字母,结果为ABC,left向左移动3个字符, world就变成了wor,right向右移动3个字符,hello就变成了llo,repeat中把kgc的次数重复了2次,输出结果就为kgckgc。
语句示例:select length(concat(‘abc’,space(3),‘abc’));
分析,spache比较特殊,如果单打一个space(3),如图所示,看不到任何东西,通过上图的嵌套使用,得到的结果为9的空格。
语句示例:select replace(‘hello’, ‘ll’, ‘kgc’), strcmp(4, 5), substring(‘bjbdqn’, 4, 2), reverse(‘hello’);
分析:replace表示吧hello中的‘ll‘替换为‘kgc,得到结果为hekgco,’strcmp表示-1,0,1中的随机值,图中结果为-1,substring表示从括号的值当中第 4 个位置开始输出长度为 2 的字符串,结果就是为dq,reverse表示将字符串反转,hello就变成了olleh
2.4 时间日期函数
常用的日期时间函数
- curdate() 返回当前时间的年月日
- curtime() 返回当前时间的时分秒
- now() 返回当前时间的日期和时间
- month(x) 返回日期 x 中的月份值
- week(x) 返回日期 x 是年度第几个星期
- hour(x) 返回 x 中的小时值
- minute(x) 返回 x 中的分钟值
- second(x) 返回 x 中的秒钟值
- dayofweek(x) 返回 x 是星期几,1 星期日,2 星期一
- dayofmonth(x) 计算日期 x 是本月的第几天
- dayofyear(x) 计算日期 x 是本年的第几天
语句示例:select curdate(),curtime(),now(),month(‘2020-02-09’), week(‘2020-02-09’), hour(‘21:13:53’);
根据上面的日期时间函数,很容易就明白了。
语法示例:select minute(‘21:13:53’),second(‘21:13:53’), dayofweek(‘2020-02-09’), dayofmonth(‘2020-02-09’), dayofyear(‘2020-02-09’);
三.存储过程
简介:MySQL 数据库存储过程是一组为了完成特定功能的 SQL 语句的集合。存储过程这个功能是从 5.0 版本才开始支持的,它可以加快数据库的处理速度,
增强数据库在实际应用中的灵活性。存储过程在使用过程中是将常用或者复杂的工作预先使用 SQL 语句写好并用一个指定的名称存储起来,
这个过程经编译和优化后存储在数据库服务器中。当需要使用该存 储过程时,只需要调用它即可。操作数据库的传统 SQL 语句在执行时需要先编译,
然后再去执行,跟存储过程一对比,明显存储过程在执行上速度更快,效率更高。
3.1 存储过程的优点
- 存储过程执行一次后,生成的二进制代码就驻留在缓冲区,之后如果再次调用的话,将
直接调用二进制代码,使得存储过程的执行效率和性能得到大幅提升。 - 存储过程是 SQL 语句加上控制语句的集合,有很强的灵活性,可以完成复杂的运算。
- 存储过程存储在服务器端,客户端调用时,直接在服务器端执行,客户端只是传输的调 用语句,从而可以降低网络负载。
- 存储过程被创建后,可以多次重复调用,它将多条 SQL 封装到了一起,可随时针对 SQL 语句进行修改,不影响调用它的客户端。
- 存储过程可以完成所有的数据库操作,也可以通过编程的方式控制数据库的信息访问权限。
3.2 创建存储过程
语法格式:CREATE PROCEDURE <过程名> ( [过程参数[,…] ] ) <过程体>
[过程参数[,…] ] 格式
[ IN | OUT | INOUT ] <参数名><类型>
要创建存储过程,必须要具有 CREATE ROUTINE 权限。
使用 SHOW PROCEDURE STATUS 命令查看数据库中存在哪些存储过程。如果要查看某个存储过程的具体信息,则可以使用SHOW CREATE PROCEDURE <存储过程名称>。
例如,通过存储过程查询 player 表的三条数据,存储过程是不带参数的,具体操作如下所示。
- mysql> DELIMITER $$ #开始存储过程
- mysql> CREATE PROCEDURE PlayerRole() #定义存储过程的名称
- mysql> BEGIN #开启
- mysql>SELECT id,name,level from player limit 3; #显示player表中的前三行
- mysql> END $$ # 结束
- mysql> DELIMITER ; #结束存储过程
- mysql> call PlayerRole(); #调用
查看player表
通过存储过程查询 player 表中某一条记录,存储过程是带参数的,具体操作如下所示。
- mysql>DELIMITER $$
- mysql>CREATE PROCEDURE GetRole(IN inname VARCHAR(16))
- mysql>BEGIN
- mysql>SELECT id,name,level from player where name=inname;
- mysql> END $$
- mysql>DELIMITER ;
- mysql>call GetRole(‘shirley’);
3.3 修改存储过程
存储过程在创建之后,随着开发业务的不断推进,业务需求难免有所调整,相应的存储 过程也会发生变动,这个时候就需要修改存储过程。存储过程的修改分为特征的修改和业务 内容的修改。特征的修改可以使用 ALTER PROCEDURE 来实现。
语法结构:ALTER PROCEDURE <过程名> [ <特征> … ]
- 存储过程内容的修改方法是通过删除原有存储过程,之后再以相同的名称创建新的存储过程。
3.4 删除存储过程
存储过程创建之时是存储到 MySQL 数据库中的,当程序不在调用这个存储过程时,也就意味这个存储过程被废弃了,废弃的存储过程需要从数据库中将其删除。使用 DROP PROCEDURE 语句即可删除存储过程。
语法结构:DROP { PROCEDURE | FUNCTION } [ IF EXISTS ] <过程名>