1、函数分类
SQL中函数分为单行函数和分组函数,单行函数处理单行的数据返回一个结果,分组函数处理多行的数据返回一个结果,所以也将分组函数称为聚合函数或组函数,通常用分组函数作统计,所以又称为统计函数。函数在调用时能够嵌套。web
2、单行函数
单行函数根据处理的数据类型又可细分为字符函数、数学函数、日期函数、流程控制函数、其余函数。
一、字符函数
①concat:字符链接函数sql
SELECT CONCAT( '小明', '是', '笨蛋' );
②substr(或 substring):截取字符串,有多个重载函数数据库
#从指定位置截取至字符串末尾,包含指定位置字符 SELECT SUBSTR( '孙悟空喜欢白骨精', 6 ); #从指定位置截取指定长度的字符串,包含指定位置字符 SELECT SUBSTRING( '孙悟空喜欢白骨精', 1, 3 );
③upper:将字符串中字符变为大写
④lower:将字符串中字符变为小写
⑤replace:替换svg
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:在字符串不够指定长度时右填充指定字符,若字符串超出指定长度进行截取spa
SELECT RPAD( 'hello', 10, '*' );#hello***** SELECT RPAD( 'hello', 3, '*' );#hel,超出时也是从左边开始截取指定长度的字符
⑩instr:获取子串第一次出现的索引位置,查询不到返回0code
SELECT INSTR( '王重阳是王阳明的哥哥', '王阳明' );#5
Tip
:SQL中的索引值从1开始而不是从0开始orm
二、数学函数
①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
三、日期函数
①now:返回当前日期和时间
②year、month、day、hour、minute、second:返回指定时间的年、月、日、时、分、秒
③curdate、curtime:返回当前日期(不含时间)、时间(不含日期)
④str_to_date:将字符串格式化为日期
⑤date_format:将日期转换成指定格式字符串
⑥datediff:返回两个日期相差的天数
⑦monthname:以英文名称返回月
日期格式化时特殊字符的功能:
四、流程控制函数
①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;
五、其余函数
SELECT VERSION();#查询数据库版本 SELECT DATABASE();#查询当前数据库名称 SELECT USER();#查询当前用户 SELECT PASSWORD( 'abc' );#返回该字符串的密码形式 SELECT MD5( "abc" );#返回该字符串的md5加密形式
2、分组函数
此处讲的是分组函数并不是分组查询(分组查询须要使用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后的字段,不然没有意义