进阶4 常见函数
字符函数:LENGTH CONCAT SUBSTR INSTR TRIM UPPER LOWER 1pad RPAD REPLACE
数学函数:ROUND CEIL FLOOR TRUNCATE MOD
日期函数:NOW CURDATE CURTIME YEAR MONTH MONTHNAME DAY HOUR MINUTE SECOND STR_TO_DATE DATE_FORMAT
其他函数:VERSION DATABASE USER
控制函数: IF CASE
一.单行函数
如:CONCAT(),LENGTH(),IFNULL()等
1.字符函数
#length 获取参数值的字节个数
SELECT LENGTH("world");
#结果 5
SELECT LENGTH("中国");
#结果 6
utf8下,一个英文字母占1个字节,一个汉子占3个字节
2.concat 拼接函数
SELECT
CONCAT(`last_name`,"_",`first_name`) AS 姓名
FROM
`employees`;
#结果:Kochhar_Neena
3.upper 小写变大写 LOWER 大写变小写
SELECT UPPER("world");
#结果 WORLD
SELECT LOWER("WoRlD");
#结果 world
示例:将姓变大写,名变小写,然后拼接
SELECT
CONCAT(UPPER(`last_name`),"_",LOWER(`first_name`)) AS 姓名
FROM
employees;
#结果 KOCHHAR_neena
4.SUBSTR,SUBSTRING
注意:SQL索引从1开始
(1)截取从指定索引处后面的所有字符
SELECT SUBSTR("我爱我的祖国",5);
#结果 祖国
(2)截取从指定索引处指定字符长度的字符
SELECT SUBSTR("我爱我的祖国",1,3);
#结果 我爱我
案例:姓名中首字符大写,其他字符小写然后用_拼接,显示出来
SELECT
CONCAT(UPPER(SUBSTR(`last_name`,1,1)),"_",
LOWER(SUBSTR(`last_name`,2)))
FROM `employees`;
#结果 K__ing
5.instr
返回子串第一次出现的索引,如果找不到,则返回0
SELECT INSTR("我爱我的祖国","祖国") AS out_put;
#结果 5
#表示祖国是第五个索引开始
SELECT INSTR("我爱我的祖国和你的祖国","祖国") AS out_put;
#结果 5
SELECT INSTR("我爱我的祖国","租过") AS out_put;
#结果 0
6.trim
剔除前后的空格,也可以是字符
SELECT LENGTH(TRIM(" 祖国 ")) AS out_put;
#结果 6
SELECT LENGTH(TRIM("a" FROM "aaa祖国aaa")) AS out_put;
#结果 6
SELECT TRIM("a" FROM "aaa祖aa国aaa") AS out_put;
#结果 祖aa国
7.lpad
用指定的字符实现左填充指定长度
SELECT LPAD("祖国",5,"=");#左填充=
#结果 ===祖国
8.rpad
用指定的字符实现右填充指定长度
SELECT RPAD("祖国",5,"=");#右填充=
#结果 祖国===
9.replace替换
SELECT REPLACE("我爱我的祖国","我","你");
#结果 你爱你的祖国
二、数学函数
1.round 四舍五入
SELECT ROUND(2.25);
#结果 2
SELECT ROUND(2.22564,3);
#结果 2.226
2.ceil 向上取整,返回大于等于该参数的最小整数
SELECT CEIL(2.04);
#结果 3
3.floor 向下取整
SELECT FLOOR(2.99);
#结果 2
4.truncate 截断
SELECT TRUNCATE(1.599999,2);
#结果 1.59
5.mod 取余
SELECT MOD(5,2);
#结果 1
#-----------------等价
SELECT 5%2;
三、日期函数
1.now 返回当前系统日期+时间
SELECT NOW();
2.curdate 返回当前的系统日期,不包括时间
SELECT CURDATE();
3.curtime 只返回当前时间
SELECT CURTIME();
4.可以获取指定的部分,年、月、日、小时、分钟、秒
SELECT YEAR(NOW()) AS 年;
SELECT YEAR(`hiredate`) AS 年
FROM `employees`;
SELECT MONTH(NOW()) AS 月;
5.str_to_date:将日期格式的字符转换成指定格式的日期
SELECT STR_TO_DATE("9-13-1999","%m-%d-%Y");
#1999-09-13
案例:查询入职日期为1992-4-3的员工信息
SELECT *
FROM `employees`
WHERE `hiredate`="1992-4-3";
#但是在实际中,用户输入的日期格式不一样,就需要str_to_date
例如用户输入的是“4 3-1992”
SELECT *
FROM `employees`
WHERE `hiredate`=STR_TO_DATE("4 3-1992","%m %d-%Y");
左序号 | 格式符 | 功能 |
---|---|---|
1 | %Y | 4位的年份 |
2 | %y | 2位的年份 |
3 | %m | 月份(01,02…11,12) |
4 | %c | 月份(1,2…11,12 |
5 | %d | 日(01,02…) |
6 | %H | 小时(24小时制)7%h小时(12小时制) |
7 | %i | 分钟(00,01…59) |
8 | %s | 秒(00,01…59) |
6.date_format:将日期转换成指定的字符
DATE_FORMAT("2018/6/6","%Y年%m月%d日")
#例子1:
SELECT
DATE_FORMAT(`hiredate`,"%y年%m月%d日") AS 日期
FROM
`employees`;
#例子2:查询有奖金的员工名和入职日期(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(z,z1,z2)如果z是真,则返回z1,否则返回z2
SELECT
`last_name`,
`commission_pct`,
IF(`commission_pct` IS NULL,"没奖金","有奖金") AS out_put
FROM `employees`;
2.case()函数使用1
#在其他语言中
switch(变量或表达式){
CASE 常量1:语句1;
break;
CASE 常量2:语句2;
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 `last_name` AS 原工资,`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`;
3.case()函数使用2
#在其他语言中
IF(条件1)
{语句1;}
ELSE IF(条件2)
{语句2;}
...
ELSE
{语句n;}
#在MySQL中
CASE
WHEN 条件1 THEN 要显示的值1或者语句1;
WHEN 条件1 THEN 要显示的值2或者语句2;
...
ELSE 要显示的值n或者语句n;
案例:查询员工的工资的情况
如果工资>20000,显示A级别
如果工资>15000,显示B级别
如果工资>10000,显示c级别
否则,显示D级别
SELECT
`salary` AS 原工资,
CASE
WHEN `salary`>20000 THEN "A"
WHEN `salary`>15000 THEN "B"
WHEN `salary`>10000 THEN "C"
ELSE "D"
END AS 工资等级
FROM `employees`;
测试
1.显示系统时间(注:日期+时间)
SELECT NOW();
2.查询员工号,姓名,工资,以及工资提高百分之20后的结果(NEW salary)
SELECT `employee_id`,
`last_name`,
`salary` AS 原工资,
`salary`*1.2 AS 新工资
FROM `employees`;
3.将员工的姓名按首字母排序,并写出姓名的长度(LENGTH)
SELECT `last_name`,
LENGTH(`last_name`) AS 长度,
SUBSTR(`last_name`,1,1) AS 首字母
FROM `employees`
ORDER BY 首字母;
4.做一个查询,产生下面的结果
earns monthly but wants <salary*3>
别名:Dream Salard
结果:King earns 24000 monthly but wants 720005.
SELECT
CONCAT(`last_name`," earns",`salary`," monthly but wants",`salary`*3) AS "Dream Salard"
FROM `employees`;
5.使用CASE-WHEN,按照下面的条件:|
job | grade |
---|---|
AD_PRES | A |
ST_MAN | B |
IT_PROG | C |
否则 | D |
SELECT `job_id` AS job,
CASE `job_id`
WHEN "AD_PRES" THEN "A"
WHEN "ST_MAN" THEN "B"
WHEN "IT_PROG" THEN "C"
ELSE "D"
END AS 等级
FROM `employees`;