#进阶4:常见函数
函数:类似于java中的”方法“,将完成某个功能的一系列步骤封装起来,对外暴露一个名字,供外界调用
当我们学习别人定义好的方法(函数),只需要关心两件事:
①叫什么(函数名)
②干什么(函数功能)
sql中的函数:肯定有,并且仅有一个返回值
调用语法:
select 函数名(实参列表);
一、数学函数:
abs绝对值
mod取余
floor向下取整
truncate 截断
ceil向上取整
round四舍五入
注意:
sql中的round支持两个重载,规则:先按绝对值四舍五入,然后再添加正负
round(x):只保留整数部位
round(x,d):保留小数点后一位
java中Math.round只支持一个参数,规则:Math.round(x)等价于Math.floor(x+0.5)
Math.round(x)
rand随机数
二、字符函数
upper转换成大写
lower转换成小写
length获取字节长度
char_length获取字符长度
substr截取子串
trim去掉前后空格或字符
concat拼接
strcmp比较两个字符串
instr获取子串第一次出现的索引,如果找不到,返回0
注意:sql中起始索引,一般从1开始!
三、日期函数
now当前日期+时间
curdate当前日期
curtime当前时间
datediff两个日期天数差
date_format日期——>字符
str_to_date字符——>日期
四、流程控制函数
1、if函数
2、case结构
形式1:类似于switch
形式2:类似于多重if
#一、数学函数
#abs绝对值
SELECT ABS(-1.5);
#floor 向下取整,返回<=该参数的最大整数
SELECT FLOOR(-1.5);
#ceil 向上取整,返回>=该参数的最小整数
SELECT CEIL(-1.5);
#round 四舍五入
SELECT ROUND(-1.56);
SELECT ROUND(-1.56,1);
#truncate 截断
SELECT TRUNCATE(1.67,1);
#rand随机数 0——1之间的小数[0,1)
SELECT RAND();
#mod取余
SELECT MOD(10,3);
SELECT 10%3;
#二、字符函数
#length字节长度
SELECT LENGTH(‘john你好’);
#char_length字符长度
SELECT CHAR_LENGTH(‘john你好’);
#upper转大写
SELECT UPPER(last_name) FROM employees;
#lower转小写
SELECT LOWER(last_name) FROM employees;
#concat拼接
SELECT CONCAT(first_name,last_name) FROM employees;
#substr截取子串
注意:起始索引从1开始
包含起始索引
substr(str,起始索引,截取字符的长度):截取从起始索引(包含)开始,指定长度的子串
substr(str,起始索引):截取从起始索引开始,一直到后面所有的子串
SELECT SUBSTR(‘hello,郭襄爱上了杨过’,1,5);
SELECT SUBSTR(‘hello,郭襄爱上了杨过’,12,2);
SELECT SUBSTR(‘hello,郭襄爱上了杨过’,12);
#练习:查询员工的姓名,其中姓首字符大写,其他字符小写。
#名前两个字符大写,去其他字符小写,中间用.拼接,最终起别名 :姓名
SELECT UPPER(SUBSTR(last_name,1,2))
SELECT LOWER(SUBSTR(last_name,3))
SELECT CONCAT(UPPER(SUBSTR(first_name,1,1)),LOWER(SUBSTR(first_name,2)),’.’,UPPER(SUBSTR(last_name,1,2)),LOWER(SUBSTR(last_name,3))) 姓名
FROM employees;
#instr
类似于java中indexOf
功能:获取子串第一次出现的索引,如果找不到,返回0!
SELECT INSTR(‘郭襄张三丰郭襄爱上了郭襄’,‘郭小襄’);
#trim
trim(【substr from 】str):去掉str前后的指定的子串。如果substr from省略,默认去掉空格
SELECT TRIM('哈' FROM '哈哈哈哈he哈llo张 三 丰哈哈哈哈') AS 备注; #strcmp
功能:比较两个字符串大小,
如果前者比后者大,则返回1,
如果前者比后者小,则返回-1
如果相等,则返回0
SELECT STRCMP('hillo','hillo');
#三、日期函数
#获取当前日期+时间 SELECT NOW(); #只获取当前日期,不包含时间 SELECT CURDATE(); #只获取当前时间,不包含日期 SELECT CURTIME(); #获取两个日期之差(前面-后面的天数差) SELECT DATEDIFF('2018-8-18','2018-8-9'); #将日期转换成指定格式的字符串 SELECT DATE_FORMAT(NOW(),'%Y-%m-%d %H:%i:%s %W') 日期; #将字符串解析成日期 SELECT STR_TO_DATE('2018-10-19 10:40:09 Friday','%Y-%m-%d %H:%i:%s %W') 日期; #案例:将入职日期早于'09-09/2000'的员工信息 SELECT * FROM employees WHERE hiredate<STR_TO_DATE('09-09/2000','%m-%d/%Y');
#四、流程控制函数
#1、if函数
类似于java的三元运算符。
参数1:条件
参数2:条件成立,返回的值
参数3:条件不成立,返回的值
SELECT IF(LENGTH(last_name)>LENGTH(first_name),'名大','姓大') 备注, last_name, first_name FROM employees;
#2、case结构
回顾java的switch case语句
switch(判断的变量){
case 常量值1:语句1;break;
case 常量值2:语句1;break;
case 常量值3:语句1;break;
…
default:语句n;break
}
特点:做等值判断
语法1:类似于switch case,实现等值判断
case 判断的字段或表达式
when 值1 then 显示的值1
when 值2 then 显示的值2
…
【else 显示的值n】
end
#案例:显示不同职位的新工资。AD_VP 3倍 IT_PROG 4倍 FI_MGR 5倍 SELECT salary 原工资,job_id 职位, CASE job_id WHEN 'AD_VP' THEN SALARY*3 WHEN 'IT_PROG' THEN SALARY*4 WHEN 'FI_MGR' THEN SALARY*5 #ELSE SALARY END 新工资 FROM employees;
语法2:类似于多重if的效果,实现区间判断
case
when 条件1 then 显示的值1
when 条件2 then 显示的值2
…
【else 显示的值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 级别 FROM employees;
#1. 显示系统时间(注:日期+时间)
SELECT NOW();
#2. 查询员工号,姓名,工资,以及工资提高百分之 20%后的结果(new salary)
SELECT employee_id,last_name,salary,salary1.2 ‘new salary’
FROM employees;
#3. 将员工的姓名按首字母排序,并写出姓名的长度(length)
SELECT last_name,LENGTH(last_name) 长度
FROM employees
ORDER BY SUBSTR(last_name,1,1);
#4. 做一个查询,产生下面的结果
<last_name> earns monthly but wants <salary3>
Dream Salary
King earns 24000 monthly but wants 72000
SELECT CONCAT(last_name,' earns ',salary,' monthly but wants ',salary*3) 'Dream Salary' FROM employees WHERE salary=24000;
#5. 使用 case-when,按照下面的条件:
job grade
AD_PRES A
ST_MAN B
IT_PROG C
SA_REP D
ST_CLERK E
产生下面的结果
Last_name Job_id Grade
king AD_PRES A
/
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' WHEN 'ST_CLERK' THEN 'E' END Grade FROM employees WHERE last_name = 'k_ing';