单行函数与聚合函数
函数分类:
数字、字符串、日期和时间、流程控制、加密与解密、获取MySQL信息、聚合
单行与多行(复杂)函数
单行函数:
只对一行进行变换
每行返回一个结果
一、数值函数:
1、基本函数
ABS绝对值
SIGN返回符合
PI圆周率
CEIL 返回大于xx的最小整数
FLOOR 返回小于xx的最大整数
2.三角函数
Sin cos tan
进制转换
BIN十转二
HEX十转十六
OCT十转八
CONV(x,y,z)
y为原进制,z为目标进制
字符串函数
1、
ASCII() 只返回字符串中第一个字符的ASCII码值
CHAR_LENGTH()返回占用字节数
LENGTH长度与字符集有关。utf-8中,一个中文字符占用3字节
LPAD可以实现右对齐的效果
RPAD可以实现左对齐
INSERT见举例
SELECT
INSERT('HELLO',2,3,'bbbb')
FROM DUAL;
结果:HbbbbO
REPLACE见举例
SELECT
REPLACE('hello','llo','lll')
FROM DUAL;
TRIM去除首尾空格
举例:
SELECT
TRIM('L' FROM 'LAL')
FROM DUAL;
结果:A
LEFT举例:
SELECT
LEFT('Qum',2)
FROM DUAL;
结果:um
RIGHT同理
REPEAT(STR,X)
STR为需要重复的字符串,X为重复的字数
SPACE(n)返回n个空格
STRCMP(S1,S2)
SUBSTR(STR,X1,X2)从X1位置的字符开始取X个字符
LOCATE(STR,STR1)返回STR1在STR中所占的位置
ELT(X,s1,s2,s3)返回对应x位置的字符串。
FIELD(str,s1,s2,s3)返回对应字符串str在后续字符串中第一次出现的位置
FIND_IN_SET(str,str1)返回字符串str在后续字符串str1中的位置。
NULLIF(x,y)
x与y相等时返回NULL,否则返回x的值。
日期和时间函数:
(1)获取日期、时间
当前的年月日:CURDATE()、CURRENT_DATE()
当前时间:CURTIME
年月日加时间:NOW
UTC_DATE:英国日期
UTC_TIME:英国时间
(2)日期与时间戳的转换
UNIX_TIMESTAMP():以UNIX形式返回当前的时间戳
UNIX_TIMESTAMP(date):以UNIX形式返回指定日期的时间戳
FROM_UNIXTIME(timestamp):输入时间戳返回对应的日期
(3)月份、星期、星期数、天数等函数
YEAR(date) :返回对应年
MONTH(date):返回对应月
DAY(date):返回对应日
HOUR(time) MINUTE(time) SECOND(time)以此类推
MONTHNAME(date)返回某月的名字
DAYNAME(date)返回周几的名字
QUARTER(date)返回第几个季度
WEEK(date)返回这一年第几周
DAYOFYEAR(date)返回这一年第几天
对比(计算原则不同):
DAYOFWEEK(date)这一周第几天(周日是1,周一是2)
WEEKDAY(date)返回这一周第几天。但是周一为0,周二为1
日期的操作函数:
使用EXTRACT进行展示
SELECT EXTRACT(SECOND FROM NOW()),EXTRACT(DAY FROM NOW())
FROM DUAL;
时间与秒钟的转换
TIME_TO_SEC时间转换为秒钟
SEC_TO_TIME转换为小时分秒
SELECT TIME_TO_SEC(NOW())
FROM DUAL;
SELECT SEC_TO_TIME('1265347')
FROM DUAL;
计算日期与时间的函数
DATE_ADD(datetime,INTERVAL n type)
n为数字,可以为负数,type为类似YEAR、DAY之类的时间
SELECT DATE_ADD(NOW(),INTERVAL '1_1'YEAR_MONTH )
FORM DUAL;
最终在NOW()的结果至上加上1年一个月。但此时需要对数字部分作为字符串处理。
SUBTIME(time1,time2)返回time2-time1的差值
DATEDIFF(date1,date2)返回两个日期的差值。
FROM_DAYS(n)返回从0000-1-1起n天之后的信息
TO_DAYS(date)返回date到0000-1-1的天数
LAST_DAY(date)返回date所在月份的最后一天的日期
MAKEDATE(year,n)针对给定年份与所在年份中的天数返回一个日期
MAKETIME(hour,minute,second)将给定的小事、分钟与秒合成时间并返回
PERIOD_ADD(time,n) 返回time加上n之后的时间
日期与时间的格式化和解析
格式化:日期--->字符串
解析:字符串--->日期
SELECT DATE_FORMAT(CURDATE(),'%Y-%M-%D')
FROM DUAL;
SELECT STR_TO_DATE(2025-January-17th,'%Y-%m-%d')
FROM DUAL;
流程控制函数
IF(VALUE,VALUE1,VALUE2)
VALUE为真则返回VALUE1,否则,返回VALUE2
SELECT last_name,salary,IF(salary>=6000,'high','low') "details"
FROM employees;
IFNULL(VALUE1,VALUE2)
SELECT last_name,salary,commission_pct,IFNULL(commission_pct,0) "details"
FROM employees;
可视作IF省略第二项为真的情况。
CASE WHEN…THEN…WHEN…THEN…ELSE…END
类似于if-else的结构
CASE … WHEN … THEN … WHEN … THEN … END
类似于switch-case结构
加密与解密函数
加密:PASSWORD(str) MySQL8.0不推荐
MD5(str)不可逆
SHA(str)不可逆
ENCODE(加密)/DECODE(解密) 在MySQL8.0中不可用
MySQL信息函数
其他函数
FORMAT(value,n) n表示value值保留n位小数,n<=0时保留整数
INET_ATON(ipvalue)ip地址转换为数字
INET_NTOA(value)数字ip转换为点分隔的ip地址
BENCHMARK()测试表达式的执行效率
CONVERT()可以实现字符集的转换
聚合函数
聚合函数是对一组数据进行汇总的函数,输入的是一组数据的集合,输出的是单个值。
对多个数据进行操作,最终只得到一个数据。
一、常见的几个聚合函数:
- AVG( ):求平均值
- SUM( ):求总和
只适用于数值类型。自动过滤空值,以已有的数据进行计算。
- MAX( ):求最大值
- MIN( ):求最小值
适用于数字类型、字符串类型、日期时间类型的字段
以上四种函数均会过滤NULL空值
- COUNT( ):计算指定的字段在查询结果中查询的个数
如果填入字符串,因为字符串之间的计算没有意义,最终的结果为0.
可以写作COUNT(*) 、COUNT(1) 、 COUNT(具体字段)三种写法。.
COUNT(1)可以视作将表中的每一行数据看作‘1’,所以最后查询结果为表的行数。
因为查询不包含NULL值,所以 COUNT(具体字段)的写法不准确。
易得结论:AVG = SUM/COUNTX
另外补充:当使用MYISAM存储引擎,三种写法效率相同。如果使用InnoDB存储引擎,则COUNT(*)=COUNT(1)>COUNT(具体字段)。
二、GROUP BY
用于分组。
举例:
结论:SELECT中出现的非组函数的字段,必须声明在GROUP BY中。
反之,GROUP BY 不声明的字段可以不出现在SELECT中。
顺序:GROUP 声明在WHERE之后、ORDER BY 之间。
此时使用 WITH ROLLUP将所有分组视作新的一个分组进行AVG的计算,所以比单独凭借department_id分组多出一行。
WITH ROLLUP 与ORDER BY 不同时使用,否则报错。
但GROUP BY 与 ORDER BY 可以同时使用,没有影响。
三、HAVING的使用
HAVING的作用:过滤数据
前提:SQL中使用了GROUP BY,则可以使用HAVING写过滤条件。
补充:不使用GROUP BY也可以使用HAVING对聚合函数条件进行过滤。
例如:
该段代码可以成功执行。
如果过滤条件中出现了 聚合函数 ,则必须使用HAVING 替换WHERE,否则报错。
要求:HAVING应当写在GROUP BY之后。
额外要求:过滤条件中不存在聚合函数的时候,应当优先采用WHERE,因为WHERE的效率要高于HAVING。
举例:
对比:
四、SQL底层执行原理
1.SELECT 语句的完整结构
2、SQL99语法:
SELECT …(存在聚合函数)
FROM…
(LEFT/RIGHT) JOIN 表名 ON 多表的连接条件
WHERE 不包含聚合函数的过滤条件
GROUP BY …
HAVING 包含聚合函数的过滤条件
ORDER BY …(ASC/DESC)
LIMIT…
FROM… -> ON(进行过滤) -> (LEFT/RIGHT) JOIN -> WHERE ->GROUP BY ->HAVING ->SELECT ->DISTINCT ->ORDER BY ->LIMIT