DQL -- 一些常见的函数
本站字数:108k 本文字数:1.8k 预计阅读时长:7min 访问次数:次常见函数
概述
函数类似于Java中的方法,将实现某种功能的一组逻辑语句封装在方法体中,对外暴露方法名
- 优点 - 隐藏了实现细节
- 提高代码的重用性
 
- 通用 - 1 - SELECT 函数名() [FROM 表]; 
- 特点 - 函数名
- 函数功能
 
- 分类 - 单行函数 - 如:concat, length, ifnull等等 
- 分组函数[统计函数,聚合函数,组函数] - 功能:做统计使用 
 
单行函数
一、字符函数
- length():获取参数值的字节数 - 1 
 2
 3
 4
 5
 6- SELECT LENGTH('john'); 
 ## 这里使用的字符集是utf8mb4,一个中文字符占3个字节
 ## 如果是GBK字符集,那个一个中文字符占2个字节
 SELECT LENGTH('张三丰hahaha');
 #### 查看各种字符集
 show variables like '%char%';
- concat():拼接字符串 - 1 
 2
 3
 4- SELECT 
 CONCAT(last_name, '_', first_name) 姓名
 FROM
 employees;
- upper(), lower() - 1 
 2- SELECT UPPER('Jhon'); 
 SELECT LOWER('Jhon');- 案例:将姓变大写,名变小写 - 1 
 2
 3
 4- SELECT 
 UPPER(last_name), LOWER(first_name)
 FROM
 employees;
 
- substr(), substring() - 1 
 2
 3
 4
 5- ## Note: SQL中索引都是从1开始 
 ## 指定索引往后到结束的子串
 SELECT SUBSTR('KlenKiven', 5);
 ## 指定索引往后n个字符的字串
 SELECT SUBSTR('KlenKiven', 1, 4);- 案例:姓名首字母大写,其他字母小写用下划线拼接,显示出来 - 1 
 2
 3
 4
 5
 6- SELECT 
 CONCAT(UPPER(SUBSTR(last_name, 1, 1)),
 '_',
 LOWER(SUBSTR(last_name, 2))) out_put
 FROM
 employees;
 
- instr():返回字串第一次在字符串中的索引位置,如果找不到返回0 - 1 - SELECT INSTR('Abc', 'bc'); 
- trim():去掉前后的空格 - 1 
 2
 3- SELECT TRIM(' ABC '); 
 SELECT TRIM('a' FROM 'aaaaaaaaaaaaaaaaaKlenaaaaaaaaaaa');
 SELECT TRIM('ab' FROM 'ababababababababababKlenababababab');
- lpad():指定字符左填充指定长度(像是那个格式化输出那个) - 1 - SELECT LPAD('ABC', 10, '*'); 
- rpad():指定字符右填充指定长度(像是那个格式化输出那个) - 1 - SELECT RPAD('ABC', 10, '*'); 
- replace():替换 - 1 - SELECT REPLACE('ABCDEFBCDGH', 'BCD', 'XYZ'); 
二、数学函数
- round():四舍五入 - 1 
 2- SELECT ROUND(1.65); 
 SELECT ROUND(1.45);
- ceil():向上取整 - 1 
 2- SELECT CEIL(1.52); 
 SELECT CEIL(-1.02);
- floor():向下取整 - 1 
 2- SELECT FLOOR(1.99); 
 SELECT FLOOR(-1.99);
- truncate():截断 - 1 - SELECT TRUNCATE(1.6999, 1); 
- mod():取余 - 1 
 2
 3- SELECT MOD(10, 3); 
 SELECT MOD(- 10, - 3);
 SELECT 10 % 3;
三、日期函数
- now():返回当前系统日期时间 
- curdate():返回当前的日期不包含时间 
- curtime():返回当前的时间不包含日期 
- year(), month(), day(), hour(), minute(), second():返回特定的值 
- str_to_date():将日期格式的字符串转换成指定格式的日期 - 1 - SELECT STR_TO_DATE('9-3-1999', '%m-%d-%Y'); - 查询入职日期为1992-4-3的员工信息 - 1 
 2
 3
 4
 5
 6- SELECT 
 *
 FROM
 employees
 WHERE
 hiredate = '1992-4-3';- 使用str_to_date()版本
 - 1 
 2
 3
 4
 5
 6- SELECT 
 *
 FROM
 employees
 WHERE
 hiredate = STR_TO_DATE('1992-4-3', '%Y-%m-%d');
 
- date_format():将日期转换成字符 - 1 - SELECT DATE_FORMAT('2018/6/6', '%Y年%m月%d日'); - 查询有奖金的员工名和入职时间(XX月/XX日 XX年) - 1 
 2
 3
 4
 5- SELECT 
 last_name,
 DATE_FORMAT(hiredate, '%m月/%d日 %Y年') 入职日期
 FROM
 employees;
 
四、其他函数
- version():MySQL的版本
- databases():数据库
- user():用户
五、流程控制函数
- if():实现if-else的效果 - 1 
 2
 3
 4
 5
 6
 7
 8- SELECT IF(10 > 5, '大', '小'); 
 SELECT
 last_name,
 IF(commission_pct IS NOT NULL,
 '有奖',
 '没有奖') 有无
 FROM employees;
- case-when:switch-case使用效果 - case 要判断的字段或者表达式 
 when 常量1 then 要显示的值1或语句1;
 when 常量2 then 要显示的值2或语句2;
 else 要显示的值或语句;
 end- 案例:查询员工的工资,要求 - 如果部门号=30,显示的工资为1.1倍 
 如果部门号=40,显示的工资为1.2倍
 如果部门号=50,显示的工资为1.3倍
 其他部门,显示的工资为保底工资- 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11- 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:多重if - case 
 when 判断条件1 then 要显示的值1或语句1;
 when 判断条件2 then 要显示的值2或语句2;
 when 判断条件3 then 要显示的值3或语句3;
 else 要显示的值或语句;
 end- 案例:查询员工的新工资,要求 - 如果工资>20000,显示A级别 
 如果工资>15000,显示B级别
 如果工资>10000,显示C级别
 否则,显示D级别- 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10- SELECT 
 salary,
 CASE
 WHEN salary > 20000 THEN 'A级别'
 WHEN salary > 15000 THEN 'B级别'
 WHEN salary > 10000 THEN 'C级别'
 ELSE 'D级别'
 END 级别
 FROM
 employees;
 
多行函数
概述
- 功能 - 用作统计使用,又称为聚合函数或统计函数或组函数 
- 分类 - 数值计算:sum 求和、avg 平均值
- 数据分析:max 最大值 、min 最小值 、count 计算个数
 
- 特点 - sum、avg一般用于处理数值型 
- max、min、count可以处理任何类型 
- 以上分组函数都忽略null值 
- 可以和distinct搭配实现去重的运算 
- count函数: - 一般使用 - count(*)统计行数
- 和分组函数一同查询的字段要求是, - GROUP BY后的字段
 
1. 简单使用
| 1 | SELECT SUM(salary) FROM employees; | 
2. 是否忽略null
| 1 | SELECT SUM(commission_pct) ,AVG(commission_pct),SUM(commission_pct)/35,SUM(commission_pct)/107 FROM employees; | 
3. 和distinct搭配
| 1 | SELECT | 
4. count函数的详细介绍
| 1 | SELECT | 
MYISAM存储引擎下 ,COUNT(*)的效率高
INNODB存储引擎下,COUNT(*)和COUNT(1)的效率差不多,比COUNT(字段)要高一些
5. 和分组函数一同查询的字段有限制
| 1 | SELECT | 
相关测试
- 显示系统时间 - 1 - SELECT NOW(); 
- 询员工号,姓名,工资,以及工资提高20%以后的结果(new salary) - 1 
 2
 3
 4
 5
 6
 7- SELECT 
 employee_id,
 last_name,
 salary,
 salary * (1 + 0.2) 'new salary'
 FROM
 employees;
- 将员工的姓名按照,并写出姓名的长度 - 1 
 2
 3
 4
 5- SELECT 
 last_name, LENGTH(last_name) length
 FROM
 employees
 ORDER BY SUBSTR(last_name, 1, 1);
- 做一个查询,产生下面的结果 - earns - monthly but wants <salary*3> Dream Salary - 1 
 2
 3
 4
 5
 6
 7
 8
 9- SELECT 
 CONCAT(last_name,
 ' earns ',
 salary,
 'monthly but wants ',
 salary * 3,
 'Dream Salary') Sentence
 FROM
 employees;
- 使用case-when,按照下面的条件 - job_id grade 
 AD_PRES A
 ST_MAN B
 IT_PROG C- 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12- SELECT 
 last_name,
 job_id Job,
 CASE job_id
 WHEN 'AD_PRES' THEN 'A'
 WHEN 'ST_MAN' THEN 'B'
 WHEN 'IT_PROG' THEN 'C'
 END Grade
 FROM
 employees
 WHERE
 job_id IN ('AD_PRES' , 'ST_MAN', 'IT_PROG');
- 查询员工粽子最大值,最小值,平均值,总和。 - 1 
 2
 3
 4
 5
 6
 7- SELECT 
 MAX(salary) MAX_SAL,
 MIN(salary) MIN_SAL,
 AVG(salary) AVG_SAL,
 SUM(salary) SUM_SAL
 FROM
 employees;
- 查询员工表中的最大入职时间和最小入职时间相差的天数 - 1 
 2
 3
 4
 5
 6
 7
 8
 9- FROM 
 employees;
 
 SELECT
 MAX(hiredate) MAX_DATE,
 MIN(hiredate) MIN_DATE,
 DATEDIFF(MAX(hiredate), MIN(hiredate)) DIFFERENCE
 FROM
 employees;
- 查询部门编号为90的员工个数 - 1 
 2
 3
 4
 5
 6- SELECT 
 COUNT(*)
 FROM
 employees
 WHERE
 department_id = 90;