一、函数分类
SQL中函数分为单行函数和分组函数,单行函数处理单行的数据返回一个结果,分组函数处理多行的数据返回一个结果,因此也将分组函数称为聚合函数或组函数,一般用分组函数做统计,因此又称为统计函数。函数在调用时可以嵌套。
二、单行函数
单行函数根据处理的数据类型又可细分为字符函数、数学函数、日期函数、流程控制函数、其他函数。
1、字符函数
①concat:字符连接函数
SELECT
CONCAT( '小明', '是', '笨蛋' );
②substr(或 substring):截取字符串,有多个重载函数
#从指定位置截取至字符串末尾,包含指定位置字符
SELECT
SUBSTR( '孙悟空喜欢白骨精', 6 );
#从指定位置截取指定长度的字符串,包含指定位置字符
SELECT
SUBSTRING( '孙悟空喜欢白骨精', 1, 3 );
③upper:将字符串中字符变为大写
④lower:将字符串中字符变为小写
⑤replace:替换
SELECT
REPLACE( str, from_str, to_str );
⑥length:获取符串的字节长度,注意是字节长度,遇到汉字时一个汉字可能占2个字节(GBK编码),也可能占3个字节(UTF8),取决于所用字符集
SELECT
LENGTH( '猪八戒背别人媳妇' );#24
#查询数据库客户端字符集
SHOW VARIABLES LIKE '%char%';#utf8
⑦trim:去除前后指定内容,默认去除前后空格,注意在去除指定内容时是从第一个字符和最后一个字符开始匹配的,匹配成功则去除,匹配不成功时后续将不再匹配,详见示例
SELECT
TRIM(' 猪八戒背别人 媳妇 ');#猪八戒背别人 媳妇
SELECT
TRIM( 'abc' FROM 'abcabcab小二黑不结婚aabcabc' );#ab小二黑不结婚a
SELECT
TRIM( 'abc' FROM 'abcabcab小二黑不结婚abcabca' );#ab小二黑不结婚abcabca
⑧lpad:在字符串不够指定长度时左填充指定字符,若字符串超出指定长度进行截取
SELECT
LPAD( 'hello', 10, '*' );#*****hello,填充后共10个字符
SELECT
LPAD( 'hello', 3, '*' );#hel,超出时从左边开始截取指定长度的字符
⑨rpad:在字符串不够指定长度时右填充指定字符,若字符串超出指定长度进行截取
SELECT
RPAD( 'hello', 10, '*' );#hello*****
SELECT
RPAD( 'hello', 3, '*' );#hel,超出时也是从左边开始截取指定长度的字符
⑩instr:获取子串第一次出现的索引位置,查询不到返回0
SELECT
INSTR( '王重阳是王阳明的哥哥', '王阳明' );#5
Tip
:SQL中的索引值从1开始而不是从0开始
2、数学函数
①round:四舍五入,有两个重载函数,用来指定保留几位小数
SELECT
ROUND( 8.86 );#9
SELECT
ROUND( 8.8632,2 );#8.86,保留2位小数
②ceil:向上取整,返回大于等于当前参数的最小整数
③floor:向下取整,返回小于等于当前参数的最大整数
④mod:取模(取余),mod(a,b)返回的结果为a-a/b*b
SELECT
MOD(-10,-3);#-1
⑤truncate:截断,也可以指定保留几位小数
SELECT TRUNCATE
( - 10.89755, 3 );
⑥rand:获取随机数,返回0-1之间的小数
SELECT RAND();#0.3918066522030222
3、日期函数
①now:返回当前日期和时间
②year、month、day、hour、minute、second:返回指定时间的年、月、日、时、分、秒
③curdate、curtime:返回当前日期(不含时间)、时间(不含日期)
④str_to_date:将字符串格式化为日期
⑤date_format:将日期转换成指定格式字符串
⑥datediff:返回两个日期相差的天数
⑦monthname:以英文名称返回月
日期格式化时特殊字符的功能:
4、流程控制函数
①IF函数:如果第一个参数的表达式结果为true,则返回第二个参数的值,否则返回第三个参数的值,类似于三目运算符
SELECT IF(10 > 5,'大','小');
SELECT last_name,commission_pct,IF(commission_pct IS NULL,'没奖金','有奖金') 备注
FROM employees;
②CASE表达式:分两种情况,一种是判断字段的值是否为哪些固定值,一种是判断字段或表达式是否在某些范围,区别在于在判断范围时CASE关键字后没有要判断的字段或表达式否则有要判断的常量或表达式
#case后有字段
SELECT salary 原始工资,department_id,
CASE department_id
WHEN 30 THEN salary*1.1
WHEN 40 THEN salary*1.2
WHEN 50 THEN salary*1.3
ELSE salary
END 绩效工资
FROM employees;
#case后没有字段或表达式,对字段值或表达式分范围
SELECT salary,
CASE
WHEN salary > 20000 THEN 'A'
WHEN salary > 15000 THEN 'B'
WHEN salary > 10000 THEN 'C'
ELSE 'D'
END 工资级别
FROM employees;
5、其他函数
SELECT VERSION();#查询数据库版本
SELECT DATABASE();#查询当前数据库名称
SELECT USER();#查询当前用户
SELECT PASSWORD( 'abc' );#返回该字符串的密码形式
SELECT MD5( "abc" );#返回该字符串的md5加密形式
二、分组函数
此处讲的是分组函数并非分组查询(分组查询需要使用group by子句),但分组函数可以用于分组查询。
SQL中为我们提供常用的分组函数有:sum(求和)、avg(求平均数)、max(求最大值)、min(求最小值)、count(统计个数)
SELECT SUM(salary),AVG(salary),MAX(salary),MIN(salary),COUNT(salary)
FROM employees;
Tip
:
1️⃣这些函数只会统计非null的值(即若统计的字段值为null值时该值不纳入统计范畴),因此在计算平均数、统计总数等时要格外注意
2️⃣只要是可比较大小的值都可以放在max和min函数中,比如日期、字符串等
3️⃣使用count()函数时,我们一般会使用count(*)或者count(常量)(如count(1)等)而不是使用count(字段),一是因为使用count(字段)会忽略值为null的行,二是从效率上来说count(*)也会更高
4️⃣这些统计函数都支持先去重再统计
SELECT SUM(DISTINCT salary) FROM employees;
SELECT COUNT(DISTINCT salary) FROM employees;#统计有多少种共计
5️⃣在单表查询中,和分组函数一同查询的字段必须同时是group by后的字段,否则没有意义