MySQL学习笔记4:常见函数(一) 单行函数

简介

本系列(MySQL学习笔记)是我基于B站上很是受欢迎的MySQL 基础+高级篇- 数据库 -sql -尚硅谷视频所作的笔记,方便你们学习和掌握MySQL。mysql

说明

1.这个系列基本包含了视频中老师讲课的全部内容,包括知识点、案例、部分测试题。
2.所需的配套资料(来自B站评论区)web

@黎曼的猜测:
配套资料下载–>公众号公众号 DragonWell 回复:mysql 注意:是公众号!!是公众号!!是公众号,点那个 搜一搜 搜索!!!
不是私人号,是公众号!!! (能够直接在 搜一搜 搜索 dragonwell) 名称是:DragonWell公众号sql

3.SQLyog的安装(来自B站评论区)数据库

@江左萌粽猪 连接:https://pan.baidu.com/s/18PDjbqEeDSAjQM0VQye6og 提取码:qjuzide

目录

MySQL学习笔记1:select查询(一) 基本用法
MySQL学习笔记2:select查询(二) 条件查询
MySQL学习笔记3:select查询(三) 排序查询
MySQL学习笔记4:常见函数(一) 单行函数
MySQL学习笔记5:常见函数(二) 分组函数svg

常见函数的学习

函数功能:将逻辑语句封装在方法体中,对外暴露方法名
调用:select 函数名(实参列表) [from];
特色:
	函数名,函数功能
分类:
	单行函数(ifnull ,concat, length) 输入一个值返回一个值	
	分组函数,作统计使用 又称为统计函数、聚合函数、组函数
常见单行函数:
	字符函数:length,concat,substr,instr,upper,lower,lpad,rpad,replace
	数学函数:round,ceil,floor,truncate,mod
	日期函数:now,curdate,curtime,year,monthname,str_to_date,date_format
	其余函数:version,database,user
	控制函数:if,case
分组函数见MySQL学习笔记5:常见函数(二)

一.单行函数

USE myemployees;

一.字符函数

1.length 获取字节个数 (不是字符长度)

SELECT LENGTH('john');SHOW VARIABLES LIKE '%char%';  # utf8 
SELECT LENGTH('张三丰'); #9 一个汉字占3个字节

2.concat拼接字符串

SELECT CONCAT(last_name,'_',first_name) AS 姓名 FROM employees;

3.upper 全大写,lower 全小写

SELECT LOWER(UPPER('john'));
SELECT CONCAT(UPPER(last_name),LOWER(first_name)) FROM employees;

4.substr(substring) 截取字符

SQL 索引从1开始

截取从指定索引7开始全部字符,这里是字符的长度,不是字节的长度
SELECT SUBSTR('李莫愁爱上了陆展元',7) AS out_put; #‘陆展元’
截取从指定索引处指定长度的字符
SELECT SUBSTR('李莫愁爱上了陆展元',1,3) AS out_put; # '李莫愁'

姓名首字符大写,其余字符小写,而后下划线拼接显示
SELECT 
	CONCAT(UPPER(SUBSTR(last_name,1,1)),'_',LOWER(SUBSTR(last_name,2))) 
FROM employees;

5.instr 返回字串第一次出现的索引,找不到返回0

SELECT INSTR('杨不悔爱上了殷六侠','殷六侠') AS out_put; #7 
SELECT INSTR('杨殷六侠不悔爱上了殷六侠','殷六侠') AS out_put; #2 
SELECT INSTR('杨不悔爱上了','殷六侠') AS out_put; #0 

6.trim 去掉左右的空格或指定内容

SELECT LENGTH(TRIM(' 张翠山 ')) AS out_put; #9

SELECT TRIM('a' FROM 'aaaaaaaaaaaaaaa张aa翠a山aaaaaaaaaa') AS out_put; #张aa翠a山

7.lpad 用指定的字符实现左填充,指定长度是 字符个数

SELECT LPAD('殷素素',10,'*') AS out_put; #*******殷素素
SELECT LPAD('殷素素',2,'*') AS out_put; #殷素

8.rpad 右填充

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

9.replace 所有替换

SELECT REPLACE('张无忌周芷若爱周芷若上了周芷若','周芷若','赵敏') AS out_put;

二.数学函数

1.round 四舍五入

SELECT ROUND(-23.45);  #-23
SELECT ROUND(23.4333,2); #23.43 小数点后保留两位

2.ceil 向上取整

SELECT CEIL(-23.24); #-23

3.floor 向下取整

SELECT FLOOR(-2.03); #-3

4.truncate 截断

SELECT TRUNCATE(1.65,1) #1.6 小数点后保留1位

5.mod 取余=a-a/b*b

SELECT MOD(-10,-3); # -1 被除数为负,结果为负
SELECT MOD(10,-3); # 1
SELECT MOD(-10,3); # -1

三.日期函数

now 返回系统日期+时间

SELECT NOW();

curdate 只返回系统日期,不包含时间

SELECT CURDATE();

curtime 只返回当前时间,不包含日期

SELECT CURTIME();

获取指定的年,月,日,时,分,秒

SELECT YEAR(NOW());
SELECT MONTH('2011-05-01');
SELECT YEAR(hiredate) FROM employees;
SELECT MONTHNAME('2011-05-01'); # 返回May
SELECT DAY(NOW());

str_to_date 将日期格式的字符转化成指定格式的日期

%Y 四位年份 %y 二位年份 
%m 二位月份(01,02,03%c 月份 (1,23%d 日 
%H 小时(24小时制)
%h 小时(12小时制)
%i 分钟
%s 秒
SELECT STR_TO_DATE('5-1-2011','%m-%d-%Y');
SELECT STR_TO_DATE('1998-3-2','%Y-%c-%d');
查询入职日期为1992-4-3的员工信息
SELECT * FROM employees WHERE hiredate=STR_TO_DATE('4-3 1992','%m-%d %Y');

date_format 将日期转换为字符

SELECT DATE_FORMAT(NOW(),'%y %m %d');
查询有奖金的员工的名和入职日期,格式为xx月/xx日/xx年
SELECT last_name,DATE_FORMAT(hiredate,'%m/%d/%y') FROM employees WHERE commission_pct IS NOT NULL;

四.其余函数

SELECT VERSION();
SELECT DATABASE(); # 查看当前数据库
SELECT USER();

五.流程控制函数

1.if : if else 的效果

SELECT IF (10>5,'big','small');

SELECT last_name,commission_pct,IF(commission_pct IS NULL,'无奖金','有奖金') AS 备注 
FROM employees;

2.case

使用1:switch case的效果  能够单独当语句用
case 要判断的字段、表达式
when 常量1 then 要显示的值1或语句1; # 值不加分号,语句加分号
when 常量2 then 要显示的值2或语句2;
else 要显示的值n或语句n;
end
/*查询员工的工资,部门编号,新工资, 要求部门号=30 显示的工资为1.1倍, 要求部门号=40 显示的工资为1.2倍, 要求部门号=40 显示的工资为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 使用2:相似于多重if
case 
when 条件1 then 要显示的值1或语句1;
when 条件2 then 要显示的值2或语句2;
when 条件3 then 要显示的值3或语句3;
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 ORDER BY salary DESC; # 降序排序

测试题

将员工姓名按首字母排序,显示姓名的长度,姓名
SELECT LENGTH(last_name),last_name FROM employees ORDER BY SUBSTR(last_name,1,1);


SELECT CONCAT(last_name,' earns ',salary, ' monthly but wants ',salary*3) FROM employees WHERE salary=24000;

使用case-when 按照条件
/* job grade AD_PRES A ST_MAN B IT_PROG C SA_REP D */
SELECT last_name,job_id,
CASE job_id
WHEN 'AD_PRES' THEN 'A'
WHEN 'ST_MAN' THEN 'B'
WHEN 'IT_PROG' THEN 'C'
WHEN 'SA_REP' THEN 'D'
ELSE 'E'
END AS 'grade'
FROM employees;