Mysql——常见函数

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后的字段,不然没有意义