5.常见函数

声明:此MySQL基础学习源自尚硅谷。(推荐)b站官方链接:https://www.bilibili.com/video/BV1xW411u7ax?p=1
大佬榜:
未来旅行号-https://www.cnblogs.com/zluckiy/p/10295387.html

进阶4:常见函数

概念:类似于java的方法,将一组逻辑语句封装在方法体中,对外暴露方法名
好处:1、隐藏了实现细节 2、提高代码的重用性
调用:select 函数名(实参列表) 【from 表】;
特点:
①叫什么(函数名)
②干什么(函数功能)
分类:
1、单行函数
如 concat、length、ifnull等
2、分组函数
功能:做统计使用,又称为统计函数、聚合函数、组函数

常见函数:

一、单行函数
字符函数:
length:获取字节个数(utf-8一个汉字代表3个字节,gbk为2个字节)
concat:字符串拼接
substr:截取指定索引字符串('字符串',索引)、('字符串',索引,长度) : 索引值从1开始
instr:返回子串在字符串中第一次出现的索引,没有返回0
trim:去除前后空白
upper:置为大写
lower:置为小写
lpad:左填充:lpad(字符串,总长度,填充字符):用指定的字符实现左填充指定长度(如果指定的长度小于原字符长度,会缩短字符长度)
rpad:右填充:
replace:替换字符串内容:replace('字符串',被替换字符,替换字符)
数学函数:
round 四舍五入
ceil 向上取整
floor 向下取整
truncate 截断,truncate(1.6666,保留小数位数):保留小数位数=1 -> 1.6; =0 -> 1;
mod 取余
日期函数:
now 返回当前系统日期+时间
curdate 返回当前系统日期,不包含时间
curtime 返回当前系统时间,不包含日期
year 返回年
month 返回月
monthname 以英文形式返回月
day 返回日
hour 小时
minute 分钟
second
str_to_date 将字符转换成日期
date_format 将日期转换成字符
datediff 返回两个日期相差的天数
其他函数:
version 当前数据库服务器的版本
database 当前打开的数据库
user 当前用户
password('字符') 返回该字符的密码形式
md5('字符') 返回该字符的md5加密形式
流程控制函数
①if(条件表达式,表达式1,表达式2):如果条件表达式成立,返回表达式1,否则返回表达式2
case情况1
case 变量或表达式或字段
when 常量1 then1
when 常量2 then2
...
else 值n
end
case情况2
case
when 条件1 then1
when 条件2 then2
...
else 值n
end
分组函数
1、分类
max 最大值
min 最小值
sum 和
avg 平均值
count 计算个数
2、特点
①语法
select max(字段) from 表名;
②支持的类型
sum和avg一般用于处理数值型
max、min、count可以处理任何数据类型
③以上分组函数都忽略null
④都可以搭配distinct使用,实现去重的统计
select sum(distinct 字段) from 表;
⑤count函数
count(字段):统计该字段非空值的个数
count(*):统计结果集的行数

1.字符函数

1.length 获取参数值的字节个数

SELECT LENGTH('john');
SELECT LENGTH('张三丰hahaha');
-- 查看数据库的编码格式
SHOW VARIABLES LIKE '%character%';

2.concat 拼接字符串

SELECT CONCAT(last_name,'_',first_name) 姓名 FROM employees;
# concat(str1,str2,...) 可以传入多个参数

3.upper、lower大小写转换

SELECT UPPER('john'); # 转换为大写
SELECT LOWER('joHn'); # 转换为小写

示例:将姓变大写,名变小写,然后拼接

SELECT CONCAT(UPPER(last_name),LOWER(first_name)) 姓名 FROM employees;

4.substr(substring)截取子串

注意:索引从1开始

SELECT SUBSTR('李莫愁爱上了陆展元',7) as out_put; # 陆展元
# substr(str,pos) 截取从pos指定索引处后面所有字符(包括索引处字符)
SELECT SUBSTR('李莫愁爱上了陆展元',1,3) as out_put; # 李莫愁
# substr(str,pos,len) 截取从pos指定索引处指定len字符长度的字符(指定索引开始,后面是截取的长度)

案例:姓名中首字符大写,其他字符小写然后用_拼接,显示出来

SELECT CONCAT(UPPER(SUBSTR(last_name,1,1)),'_',LOWER(SUBSTR(last_name,2))) out_put
FROM employees;

5.instr 返回子串第一次出现的索引

如果找不到返回0

SELECT INSTR('杨不殷六侠悔爱上了殷六侠','殷八䩠') AS out_put;

6.trim去前后指定的空格和字符

SELECT LENGTH(TRIM(' 张翠山 ')) AS out_put;
SELECT TRIM('a' FROM 'aaaaaaaaa张aaaaaaaaaaaa翠山aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa') AS out_put;

ltrim去左边空格
rtrim去右边空格

7.lpad左填充

用指定的字符实现左填充指定长度(如果指定的长度小于原字符长度,会缩短字符长度)

SELECT LPAD('殷素素',2,'*') AS out_put; # 指定长度2小于原字符长度3,则字符变为'殷素'
# lpad(str,len,padstr) str原字符串,len填充后总的字符长度,padstr填充的字符

8.rpad右填充

用指定的字符实现右填充指定长度

SELECT RPAD('殷素素',12,'ab') AS out_put;

9.replace 替换

SELECT REPLACE('周芷若周芷若周芷若周芷若张无忌爱上了周芷若','周芷若','赵敏') AS out_put;
# replace(str,from_str,to_str) from_str被替换的字符,to_str替换字符

2.数学函数

round 四舍五入

SELECT ROUND(-1.55);
SELECT ROUND(1.567,2);
# round(X,D) D:保留小数点的位数

ceil 向上取整

返回 >= 该参数的最小整数

SELECT CEIL(-1.02);

floor 向下取整

返回 <= 该参数的最大整数

SELECT FLOOR(-9.99);

truncate 截断

SELECT TRUNCATE(1.69999,1);
# truncate(X,D) D:小数点后保留位数

mod取余

mod(a,b) --> a-a/b*b
mod(-10,-3) -10- (-10)/(-3)*(-3) = -1
SELECT MOD(10,3); => SELECT 10%3;

3.日期函数

1.now 返回当前系统日期+时间

SELECT NOW();

2.curdate 返回当前系统日期,不包含时间

SELECT CURDATE();

3.curtime 返回当前系统时间,不包含日期

SELECT CURTIME();

4.获取指定的部分,年、月、日、小时、分钟、秒

SELECT YEAR(NOW()) 年;
SELECT YEAR('1998-1-1') 年;
SELECT YEAR(hiredate) 年 FROM employees;
SELECT MONTH(NOW()) 月;
SELECT MONTHNAME(NOW()) 月; # 以英文形式返回月
SELECT DAY(NOW()) 日;
SELECT DAYNAME(NOW()) 日; # 以英文形式返回日

unix_timestamp(now()); 时间转时间戳
unix_timestamp('2019-01-20'); 字符串转时间戳
from_unixtime(1451997924,'%Y-%d'); 时间戳转字符串

日期格式:

str_to_date 将字符通过指定的格式转换成日期(第二个参数为格式)

SELECT STR_TO_DATE('1998-3-2','%Y-%c-%d') AS out_put;

查询入职日期为1992-4-3的员工信息

SELECT * FROM employees WHERE hiredate = '1992-4-3';
SELECT * FROM employees WHERE hiredate = STR_TO_DATE('4-3 1992','%c-%d %Y');

date_format 将日期转换成字符

SELECT DATE_FORMAT(NOW(),'%y年%m月%d日') AS out_put;

查询有奖金的员工名和入职日期(xx月/xx日 xx年)

SELECT last_name,DATE_FORMAT(hiredate,'%m月/%d日 %y年') 入职日期
FROM employees
WHERE commission_pct IS NOT NULL;

4.其他函数

SELECT VERSION(); # 查看版本号
SELECT DATABASE(); # 查看当前使用的数据库
SELECT USER(); # 查看当前用户

5.流程控制函数

1.if函数

if else 的效果

SELECT IF(10<5,'大','小'); # 后面两个选项类型可以不同
SELECT last_name,commission_pct,IF(commission_pct IS NULL,'没奖金,呵呵','有奖金,嘻嘻') 备注
FROM employees;

2.case函数

case 函数的使用一: switch case 的效果

java中:
switch(变量或表达式){
case 常量1:语句1;break;
...
default:语句n;break;
}
mysql中:
case 要判断的字段或表达式
when 常量1 then 要显示的值1或语句1
when 常量2 then 要显示的值2或语句2
...
else 要显示的值n或语句n
end

案例:查询员工的工资,要求

部门号=30,显示的工资为1.1倍
部门号=40,显示的工资为1.2倍
部门号=50,显示的工资为1.3倍
其他部门,显示的工资为原工资

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 AS 新工资
FROM
employees;

case 函数的使用二:类似于 多重if

java中:
if(条件1){
语句1
}else if(条件2){
语句2
}
...
else{
语句n;
}
mysql中:
case
when 条件1 then 要显示的值1或语句1
when 条件2 then 要显示的值2或语句2
...
else 要显示的值n或语句n
end

案例:查询员工的工资的情况
如果工资>20000,显示A级别
如果工资>15000,显示B级别
如果工资>10000,显示C级别
否则,显示D级别

select salary,
case
when salary>20000 then 'A'
when salary>15000 then 'B'
when salary>10000 then 'C'
else 'D'
end as 工资级别
from employees;

6.分组函数

功能:用作统计使用,又称为聚合函数或统计函数或组函数
分类:
sum 求和、avg 平均值、max 最大值 、min 最小值 、count 计算个数
特点:
1、sum、avg一般用于处理数值型
max、min、count可以处理任何类型
2、以上分组函数都忽略null
3、以上函数均可以和distinct搭配实现去重的运算
4、count函数的单独介绍
一般使用count(*)用作统计行数
5、和分组函数一同查询的字段要求是group by后的字段
6、聚合函数不可以直接嵌套使用,比如: max(count(*))
但是可以嵌套子查询使用(先分组取出count值, 再将count值倒序排列,取第一个值就是最大的)

1、简单的使用

SELECT SUM(salary) FROM employees;
SELECT AVG(salary) FROM employees;
SELECT MIN(salary) FROM employees;
SELECT MAX(salary) FROM employees;
SELECT COUNT(salary) FROM employees;
SELECT SUM(salary) 和,AVG(salary) 平均,MAX(salary) 最高,MIN(salary) 最低,COUNT(salary) 个数
FROM employees;
SELECT SUM(salary) 和,ROUND(AVG(salary),2) 平均,MAX(salary) 最高,MIN(salary) 最低,COUNT(salary) 个数
FROM employees;

2、参数支持哪些类型

SELECT SUM(last_name) ,AVG(last_name) FROM employees;
SELECT SUM(hiredate) ,AVG(hiredate) FROM employees;
SELECT MAX(last_name),MIN(last_name) FROM employees;
SELECT MAX(hiredate),MIN(hiredate) FROM employees;
SELECT COUNT(commission_pct) FROM employees;
SELECT COUNT(last_name) FROM employees;

3、是否忽略null

SELECT SUM(commission_pct) ,AVG(commission_pct),SUM(commission_pct)/35,SUM(commission_pct)/107 FROM employees;
SELECT MAX(commission_pct) ,MIN(commission_pct) FROM employees;
SELECT COUNT(commission_pct) FROM employees;
SELECT commission_pct FROM employees;

4、和distinct搭配

SELECT SUM(DISTINCT salary),SUM(salary) FROM employees;
SELECT COUNT(DISTINCT salary),COUNT(salary) FROM employees;

5、count函数的详细介绍

一般参数放1

SELECT COUNT(salary) FROM employees;
SELECT COUNT(*) FROM employees;
SELECT COUNT(1) FROM employees; # count(1):统计结果集的行数,相当于在表中加了一列1,统计列中1的个数

效率:

MYISAM存储引擎下 ,COUNT(*)的效率高
INNODB存储引擎下,COUNT(*)和COUNT(1)的效率差不多,比COUNT(字段)要高一些
mysql5.5之前默认MyISAM

6、和分组函数(聚合函数)一同查询的字段有限制

SELECT AVG(salary),employee_id FROM employees;
-- 和分组函数一同查询的字段要求是group by后的字段

注意

分组函数不能放在where子句后面,但可以放在having后面。
例如:
where count(*) 报错 having count(*) 可以使用
posted @   Lz_蚂蚱  阅读(278)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起