(MySQL学习笔记)常见函数-单行函数、分组函数

常见函数

/*
类似于java方法,将一组逻辑语句封装在方法体中,对外暴露方法名
1、隐藏了实现细节
2、提高代码的重用性

调用:
	select 函数名(实参列表) [from 表];
	什么时候用 from 表 : 实参列表中用到了表中的字段
分类:
	1、单行函数
		功能:返回一个值
		如concat(),length(),ifnull()等
		①字符函数
		②数学函数
		③日期函数
		④其他函数
		⑤流程控制函数
	2、分组函数-统计函数-聚合函数-组函数
		功能:做统计使用
*/

单行函数

一、字符函数

1、length(str):用于获取参数值的字节
SELECT LENGTH('length');
SELECT LENGTH('数据库');
2、concat():拼接字符
SELECT 
	CONCAT(last_name,'_',first_name)
FROM 
	employees;
3、upper、lower
#变大写
SELECT UPPER('joHn');
#变小写
SELECT LOWER('joHn');
#例:将姓变大写,名变小写,然后拼接
SELECT
	CONCAT(UPPER(first_name),LOWER(last_name))
FROM 
	employees;
4、substr、substring 截取字符

注意:索引从1开始

#substr(str,pos):从pos开始截取后面所有字符
SELECT SUBSTR('一二三四五六七八九十',6);

#substr(str,pos,len):从pos开始截取len个字符长度
SELECT SUBSTR('一二三四五六七八九十',1,5);

#substr(str FROM pos)
SELECT SUBSTR('一二三四五六七八九十' FROM 6);

#substr(str\nstr FROM pos FOR len)
SELECT SUBSTR('一二三四五六七八九十' FROM 1 FOR 5);
#例:姓名中首字母大写,其他字母小写然后用_拼接
SELECT
	CONCAT(UPPER(SUBSTR(last_name,1,1)),LOWER(SUBSTR(last_name,2)),'_',LOWER(first_name))
FROM
	employees;
5、instr:返回子串在字符串中第一次出现的起始索引
#instr(str,substr)
SELECT INSTR('一二三四五六七八九十','八九十');
SELECT INSTR('八九十一二三四五六七八九十','八九十');
6、trim去掉前后空格
#trim([{both | leading | trailing} [remstr] from] str)
SELECT TRIM('    一二三     ');

#去掉前后端指定字符
SELECT TRIM('a' FROM 'aaaaaMMMaaaaMMMaaaaaa');

#去掉头部的指定字符
SELECT TRIM(LEADING 'a' FROM 'aaaaaMMMaaaaMMMaaaaaa');

#去掉尾端的指定字符
SELECT TRIM(TRAILING 'a' FROM 'aaaaaMMMaaaaMMMaaaaaa');

#
SELECT TRIM('abc' FROM 'abccbaabc');
7、lpad 左填充
#LPAD(str,len,padstr):将str补够10个,在左边(L)进行填充padstr
SELECT LPAD('123',10,'0');

#str超过了len,则会进行截断
SELECT LPAD('123',2,'0');

#padstr可以不为单个字符
SELECT LPAD('123',10,'*&');
8、rpad 右填充
#RPAD(str,len,padstr):将str补够10个,在左边(L)进行填充padstr
SELECT RPAD('123',10,'0');

#str超过了len,则会进行截断
SELECT RPAD('123',2,'0');

#padstr可以不为单个字符
SELECT RPAD('123',10,'*&');
9、replace 替换
#replace(str,from_str,to_str):将str中的所有from_str替换为to_str
SELECT REPLACE('123123123123456789','123','$$');

二、数学函数

1、round四舍五入

#①round(X);

SELECT ROUND(-1.5);
#②round(X,D); D:在第D位进行四舍五入,后面全置0;D>0是小数部分,D<0是整数部分
SELECT ROUND(-2.225234,2);
SELECT ROUND(-25532,-2);
2、ceil向上取整
#ceil(x):返回大于等于x的最小整数
SELECT CEIL(-1.002);
3、floor向下取整
#floor(x):返回小于等于x的最大整数
SELECT FLOOR(-9.98);
4、truncate 截断
#truncate(X,D):X小数点后保留D位
SELECT TRUNCATE(1.22345,4);
5、mod取余
#mod(n,m):n对m取余,结果为n-n/m*m,n为正则结果为正,n为负则结果为负;
SELECT MOD(4,3);

三、日期函数

1、now()返回当前系统日期+时间
SELECT NOW();
2、curdate() 返回当前系统日期,不包含时间
SELECT CURDATE();
3、curtime()返回当前时间,不包含日期
SELECT CURTIME();

可以获得制定的部分:年 月 日 小时 分钟 秒

4、year() 年
SELECT YEAR(NOW());
5、month(),monthname()月
SELECT MONTH(NOW());
SELECT MONTHNAME(NOW());  #英文显示
6、day()日
SELECT DAY(NOW());
7、hour()小时
SELECT HOUR(NOW());
8、minute()分钟
SELECT MINUTE(NOW());
9、second()秒
SELECT SECOND(NOW());
10、str_to_date:将字符转换为日期
#STR_TO_DATE(str,FORMAT):format为指定的格式
SELECT STR_TO_DATE('9-12-2000','%d-%m-%Y');
#例:查询入职日期为1992-4-3的员工信息
SELECT * FROM employees WHERE hiredate = STR_TO_DATE('4 3 1992','%m %d %Y');
11、date_format:将日期转换为字符
#date_format(data,format)
SELECT DATE_FORMAT(NOW(),'%m %d %Y');
#例:查询有奖金的员工的员工名和入职日期(xx月/xx日/xx年)
SELECT
	last_name,
	DATE_FORMAT(hiredate,'%m月/%d日/%y年');
FROM
	employees
WHERE 
	commission_pct IS NOT NULL;

四、其他函数

1、version查看版本号
SELECT VERSION();
2、database查看当前的库
SELECT DATABASE();
3、user当前的用户
SELECT USER();

五、流程控制函数

1、if函数:实现if else 的效果
#if(expr1,expr2,expr3)
#expr1:条件表达式,true->expr2,false->expr3
SELECT IF(10>5,'对','错');

#例:查询
SELECT 
	last_name,IF(commission_pct IS NOT NULL,'y','n')
FROM
	employees;
2、case函数

①与switch case效果类似

/*	case 需要判断的字段或者表达式
	when 常量1 then 要显示的值1或语句1
	when 常量2 then 要显示的值1或语句2
	...
	else 要显示的值n或者语句n
	end
*/
/*例:查询员工的工资,要求:

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

*/
SELECT 
	salary,
	CASE department_id
	WHEN 30 THEN 1.1*salary
	WHEN 40 THEN 1.2*salary
	WHEN 50 THEN 1.3*salary
	ELSE salary
	END
	AS 新工资
FROM 
	employees;

②多重if

/*
case
when 条件 then 要显示的值(结尾不加分号)或者语句(结尾需要加分号)
when 条件 then 要显示的值或者语句
else 要显示的值或者语句
...
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 '级别'
FROM
	employees
ORDER BY 
	salary DESC;
#例:显示系统时间(注:日期+时间)
SELECT NOW();
#例:查询员工号,姓名,工资,以及工资提高百分之二十之后的结果(new salary)
SELECT 
	employee_id,
	last_name,
	salary,
	salary*1.2 'new salary'
FROM 
	employees;
#例:将员工的姓名按首字母排序,并写出姓名的长度
SELECT 
	last_name,
	LENGTH(last_name) AS 'length'
FROM 
	employees
ORDER BY 
	SUBSTR(last_name,1,1) ASC;
#例:
SELECT 
	CONCAT(last_name,' earns ',salary,' monthly but wants ',salary*3,' Dream salary ')
FROM 
	employees;
#例:
SELECT 
	job_id,
	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')
ORDER BY 
	grade ASC;

分组函数

/*
功能:用作统计实用,又称为聚合函数或统计函数或组函数

分类:
	sum求和
	avg平均值
	max最大值
	min最小值
	count计算个数
*/
1、简单的使用
#sum([distinct] expr)
#avg([distinct] expr)
#min([distinct] expr)
#max([distinct] expr)
/*
COUNT(X)
COUNT(X,X)
COUNT(expr)
COUNT(DISTINCT expr,[expr...])
*/
/*
特点:
1、#①sum,avg用于处理数值型
   #②max,min,count任何类型都支持,count计算不为null的个数
2、以上分组函数都忽略了null
3、和distinct搭配-去重
4、count函数的单独介绍
	一般使用count(*)统计行数
5、和分组函数一同查询的字段要求是group by后的字段
*/
SELECT SUM(salary)FROM employees;
SELECT MIN(salary)FROM employees;
SELECT MAX(salary)FROM employees;
SELECT AVG(salary)FROM employees;
SELECT COUNT(salary) FROM employees;	#salary中非null的个数
SELECT SUM(salary) 'sum',MIN(salary) 'min',MAX(salary) 'max',COUNT(salary) 'count'
FROM employees;	
2、参数支持哪些类型
#①sum,avg用于处理数值型
#②max,min,count任何类型都支持,count计算不为null的个数
3、是否忽略null
#以上运算忽略了null
4、和distinct搭配-去重
SELECT COUNT(DISTINCT salary),COUNT(salary) FROM employees;
5、count函数的详细介绍
/*
COUNT(X)
COUNT(X,X)
COUNT(expr)
COUNT(DISTINCT expr,[expr...])
*/

SELECT COUNT(salary) FROM employees;
#计算总行数
SELECT COUNT(*) FROM employees;
#count里面参数为常量值,相当于在表中加了一列这个常量值
SELECT COUNT(1) FROM employees;
/*

效率:
MYISAM存储引擎下,count(*)效率最高
INNODB存储引擎下,count(*)和count(1)效率差不多,比count(字段)高

*/
6、和分组函数一同查询的字段有限制
#****报错****
SELECT AVG(salary),employee_id FROM employees;
#例:查询公司员工工资的最大值,最小值,平均值,总和
SELECT MAX(salary),MIN(salary),AVG(salary) FROM employees;
#例:查询员工表中的最大入职时间和最小入职时间的相差天数(difference)
SELECT MAX(hiredate),MIN(hiredate) FROM employees;
#例:查询部门编号为90的员工个数
SELECT 
	last_name
FROM 
	employees
WHERE 
	department_id = 90;
SELECT COUNT(*) FROM employees WHERE department_id=90;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值