MySQL高级

在JavaWeb阶段,我们初步认识了MySQL数据库,包括一些基本操作,比如创建数据库、表、触发器,以及最基本的增删改查、事务等操作。而在此阶段,我们将继续深入学习MySQL,了解它的更多高级玩法,也相当于进行复习。

函数

其实函数我们在之前已经接触到一部分了,在JavaWeb阶段,我们了解了聚集函数,聚集函数一般用作统计,包括:

  • count([distinct]*)    统计所有的行数(distinct表示去重再统计,下同)
  • count([distinct]列名)    统计某列的值总和
  • sum([distinct]列名)    求一列的和(注意必须是数字类型的)
  • avg([distinct]列名)    求一列的平均值(注意必须是数字类型)
  • max([distinct]列名)    求一列的最大值
  • min([distinct]列名)    求一列的最小值

比如我们需要计算某个表一共有多少行:

SELECT COUNT(*) FROM student

通过使用COUNT聚集函数,就可以快速统计并得到结果,比如我们想计算某一列上所有数字的和:

SELECT SUM(sid) FROM student

通过SUM聚集函数,就可以快速计算每一列的和,实际上这些函数都是由系统提供的函数,我们可以直接使用。

本版块我们会详细介绍各类系统函数以及如何编写自定义函数。

系统函数

系统为我们提供的函数也是非常实用的,我们将会分为几个类型进行讲解。

字符串函数

处理字符串是一个比较重要的内容,我们可以使用字符串函数来帮助我们快速处理字符串,其中常用比如用于字符串分割的函数有:

  • substring(字符串, 起始位置, 结束位置)     同Java中String类的substring一致,但是注意下标是从1开始,下同
  • left(字符串, 长度)     从最左边向右截取字符串
  • right(字符串, 长度)     从最右边向左截取字符串

比如我们只想获取所有学生姓名的第二个字,那么可以像这样写:

SELECT SUBSTRING(name, 2, 2) FROM student

比如我们想获取所有学生姓名的第一个字,可以像这样写:

SELECT LEFT(name, 1) FROM student

我们还可以利用字符串函数来快速将所有的字母转换为大写字母或是快速转换为小写字母:

●upper(字符串)     字符串中的所有字母转换为大写字母
●lower(字符串)     字符串中的所有字母转换为小写字母

比如我们希望将一个字符串所有字符专为大写:

 

SELECT UPPER('abcdefg')

我们也可以像Java中那样直接对字符串中的内容进行替换:

●replace(字符串, 原文, 替换文)      同Java中String的replace效果

比如现在我们希望将查询到的所有同学的名称中的小全部替换大:

 

SELECT REPLACE(`name`, '小', '大') FROM student

字符串也支持进行拼接,系统提供了字符串的拼接函数:

  • concat(字符串1, 字符串2)   连接两个字符串

比如我们希望将查询到的所有同学的名称最后都添加一个字:

SELECT concat(name, '子') FROM student

最后就是计算字符串的长度:

●length(字符串)    获取字符串长度(注意如果使用的是UTF-8编码格式,那么一个汉字占3字节,数字和字母占一个字节)

比如我们要获取所有人名字的长度:

 

SELECT LENGTH(`name`) FROM student

日期函数

MySQL提供的日期函数也非常实用,我们可以快速对日期进行操作,比如我们想要快速将日期添加N天,就可以使用:

  • date_add(日期, interval 增量 单位)

比如我们希望让2022-1-1向后5天:

SELECT DATE_ADD('2022-1-1',INTERVAL 5 day)

同理,向前1年:

SELECT DATE_ADD('2022-1-1',INTERVAL -1 year)

单位有:year(年)、month(月)、day(日)、hour(小时)、minute(分钟)、second(秒)

我们还可以快速计算日期的间隔天数:

●datediff(日期1, 日期2)

比如我们想计算2022年的2月有多少天:

 

SELECT DATEDIFF('2022-3-1','2022-2-1')

如果我们想快速获取当前时间的话,可以使用这些:

  • curdate()     当前的日期
  • curtime()     当前的时间
  • now()    当前的日期+时间

此函数之前我们在编写实战项目的时候已经使用过了,这里就不演示了。我们也可以单独获取时间中的某个值:

  • day(日期)    获取日期是几号
  • month(日期)   获取日期是几月
  • year(日期)      获取日期是哪一年

比如我们想获取今天是几号:

SELECT DAY(NOW())

数学函数

数学函数比较常规,基本与Java的Math工具类一致,这里列出即可,各位可以自行尝试:

●abs(x)   求x的绝对值
●ceiling(x)   x向上取整
●floor(x)  x向下取整
●round(x, 精度)  x取四舍五入,遵循小数点精度
●exp(x)   e的x次方
●rand()   0-1之间的随机数
●log(x)    x的对数
●pi()     π
●power(x, n)    x的n次方
●sqrt(x)     x的平方根
●sin(x)  cos(x)   tan(x)     三角函数(貌似没有arctan这类反函数?)

类型转换函数

MySQL的类型转换也分为隐式类型转换和显示类型转换,首先我们来看看隐式类型转换:

 

SELECT 1+'2'

虽然这句中既包含了数字和字符,但是字符串会被进行隐式转换(注意这里并不是按照字符的ASCII码转换,而是写的多少表示多少)所以最后得到的就是1+2的结果为3

 

SELECT CONCAT(1, '2')

这里因为需要传入字符串类型的数据,但是我们给的是1这个数字,因此这里也会发生隐式类型转换,1会被直接转换为字符串的'1',所以这里得到的结果是'12'

在某些情况下,我们可能需要使用强制类型转换来将得到的数据转换成我们需要的数据类型,这时就需要用到类型转换函数了,MySQL提供了:

  • cast(数据   as 数据类型)

数据类型有以下几种:

  • BINARY[(N)] :二进制字符串,转换后长度小于N个字节
  • CHAR[(N)] :字符串,转换后长度小于N个字符
  • DATE :日期
  • DATETIME :日期时间
  • DECIMAL[(M[,N])] :浮点数,M为数字总位数(包括整数部分和小数部分),N为小数点后的位数
  • SIGNED [INTEGER] :有符号整数
  • TIME :时间
  • UNSIGNED [INTEGER] :无符号整数

比如我们现在需要将一个浮点数转换为一个整数:

SELECT CAST(pi() AS SIGNED)

我们还可以将字符串转换为数字,会自动进行扫描,值得注意的是一旦遇到非数字的字符,会停止扫描:

SELECT CAST('123abc456' as SIGNED)

除了cast以外还有convert函数,功能比较相似,这里就不做讲解了。

流程控制函数

MySQL还为我们提供了很多的逻辑判断函数,比如:

  • if(条件表达式, 结果1, 结果2)    与Java中的三目运算符一致 a > b ? "AAA" : "BBB"
  • ifnull(值1, 值2)     如果值1为NULL则返回值2,否则返回值1
  • nullif(值1, 值2)     如果值1与值2相等,那么返回NULL
  • isnull(值)      判断值是否为NULL

比如现在我们想判断:

SELECT IF(1 < 0,'lbwnb','yyds')

通过判断函数,我们就可以很方便地进行一些条件判断操作。

除了IF条件判断,我们还可以使用类似Switch一样的语句完成多分支结构:

 

SELECT 
CASE 2
	WHEN 1 THEN
		10
	ELSE
		5
END;

我们也可以将自定义的判断条件放入When之后,它类似于else-if:

 

SELECT 
CASE
	WHEN 3>5 THEN
		10
	WHEN 0<1 THEN
		11
	ELSE
		5
END;

还有一个类似于Java中的Thread.sleep的函数,以秒为单位:

SELECT sleep(10);

有关MySQL8.0新增的窗口函数这里暂时不做介绍。