#第07章_单行函数
#1.数值函数
#基本操作函数
SELECT ABS(-123),ABS(32),SIGN(-23),SIGN(43),PI(),CEIL(32.32),CEILING(-43.23),FLOOR(32.32),
FLOOR(-43.23),MOD(12,5)
FROM DUAL;
#随机数
SELECT RAND(),RAND(),RAND(10),RAND(10),RAND(-1),RAND(-1)
FROM DUAL;
#四舍五入,截断操作
SELECT ROUND(34152.5),ROUND(34152.5,1)#后面的数字代表保留的位数
SELECT TRUNCATE(1324.45,-1)
#单行函数可以嵌套:
SELECT TRUNCATE(ROUND(2345.3245,3),0)
#角度与弧度的互换:
SELECT RADIANS(180)
SELECT DEGREES(1.5 * PI())
#进制间的转换:
SELECT BIN(10),HEX(10),OCT(10)
#字符串函数:
#ASCII(S) 返回字符串S中的第一个字符的ASCII码值
SELECT ASCII('Axc')
#CHAR_LENGTH(s) 返回字符串s的字符数。作用与CHARACTER_LENGTH(s)相同
#LENGTH(s) 返回字符串s的字节数,和字符集有关
SELECT CHAR_LENGTH('hello'), CHAR_LENGTH('我们'),
LENGTH('hello'),LENGTH('我们')
#CONCAT(s1,s2,......,sn) 连接s1,s2,......,sn为一个字符串
SELECT CONCAT(emp.last_name,' worked for ',mgr.last_name)
FROM employees emp JOIN employees mgr
ON emp.manager_id = mgr.employee_id;
#CONCAT_WS(x,s1,s2,......,sn)同CONCAT(s1,s2,...)函数,但是每个字符串之间要加上x
SELECT CONCAT_WS('-',emp.last_name,' worked for ',mgr.last_name)
FROM employees emp JOIN employees mgr
ON emp.manager_id = mgr.employee_id;
#INSERT(str, idx, len,replacestr)将字符串str从第idx位置开始,len个字符长的子串替换为字符串replacestr
#字符串的索引是从1开始的!
SELECT INSERT('helloworld',2,3,'aaaaa')
#REPLACE(str, a, b) 用字符串b替换字符串str中所有出现的字符串a
SELECT REPLACE('hello','l','m')
#UPPER(s) 或 UCASE(s) 将字符串s的所有字母转成大写字母
SELECT UPPER('asdfg')
#LOWER(s) 或LCASE(s) 将字符串s的所有字母转成小写字母
SELECT LOWER('FDGHN')
#LEFT(str,n) 返回字符串str最左边的n个字符
SELECT LEFT('QSDEF',3)
#RIGHT(str,n) 返回字符串str最右边的n个字符
#LPAD(str, len, pad) 用字符串pad对str最左边进行填充,直到str的长度为len个字符
#实现右对齐效果:
#RPAD(str ,len, pad) 用字符串pad对str最右边进行填充,直到str的长度为len个字符
#实现左对齐效果:
#LTRIM(s) 去掉字符串s左侧的空格
#RTRIM(s) 去掉字符串s右侧的空格
#TRIM(s) 去掉字符串s开始与结尾的空格
#TRIM(s1 FROM s) 去掉字符串s开始与结尾的s1
SELECT TRIM('o' FROM 'ooheolloooo')
#TRIM(LEADING s1FROM s)去掉字符串s开始处的s1
SELECT TRIM(LEADING 'o' FROM 'ooheolloooo')
#TRIM(TRAILING s1FROM s)去掉字符串s结尾处的s1
SELECT TRIM(TRAILING 'o' FROM 'ooheolloooo'),STRCMP('agefr','aa')
#REPEAT(str, n) 返回str重复n次的结果
#SPACE(n) 返回n个空格
#STRCMP(s1,s2) 比较字符串s1,s2的ASCII码值的大小
#SUBSTR(s,index,len)返回从字符串s的index位置其len个字符,作用与SUBSTRING(s,n,len)、
#MID(s,n,len)相同
#LOCATE(substr,str)返回字符串substr在字符串str中首次出现的位置,作用于POSITION(substrIN str)、INSTR(str,substr)相同。未找到,返回0
#ELT(m,s1,s2,…,sn)返回指定位置的字符串,如果m=1,则返回s1,如果m=2,则返回s2,如果m=n,则返回sn
#FIELD(s,s1,s2,…,sn) 返回字符串s在字符串列表中第一次出现的位置
#FIND_IN_SET(s1,s2)返回字符串s1在字符串s2中出现的位置。其中,字符串s2是一个以逗号分隔的字符串
#REVERSE(s) 返回s反转后的字符串
#NULLIF(value1,value2)比较两个字符串,如果value1与value2相等,则返回NULL,否则返回value1函数 用法
#注意:MySQL中,字符串的位置是从1开始的。
#3.日期和时间函数:
#3.1 获取时间和日期的函数
#CURDATE() ,CURRENT_DATE()返回当前日期,只包含年、月、日
#CURTIME() , CURRENT_TIME()返回当前时间,只包含时、分、秒
#NOW() / SYSDATE() / CURRENT_TIMESTAMP() / LOCALTIME() /
#LOCALTIMESTAMP()返回当前系统日期和时间
#UTC_DATE()返回UTC(世界标准时间)日期
#UTC_TIME()返回UTC(世界标准时间)时间
SELECT CURDATE(), CURRENT_DATE(), CURTIME(),NOW(),SYSDATE(),UTC_DATE(),UTC_TIME()
#3.2日期和时间戳之间的转换
#UNIX_TIMESTAMP()以UNIX时间戳的形式返回当前时间。SELECT UNIX_TIMESTAMP() ->1634348884
#UNIX_TIMESTAMP(date) 将时间date以UNIX时间戳的形式返回。
#FROM_UNIXTIME(timestamp) 将UNIX时间戳的时间转换为普通格式的时间
SELECT UNIX_TIMESTAMP(),FROM_UNIXTIME(1659332664),UNIX_TIMESTAMP(NOW())
#3.3获取月份、星期、星期数、天数等函数
#YEAR(date) / MONTH(date) / DAY(date) 返回具体的日期值
#HOUR(time) / MINUTE(time) /
#SECOND(time)返回具体的时间值
#MONTHNAME(date) 返回月份:January,...
#DAYNAME(date) 返回星期几:MONDAY,TUESDAY.....SUNDAY
#WEEKDAY(date) 返回周几,注意,周1是0,周2是1,。。。周日是6
#QUARTER(date) 返回日期对应的季度,范围为1~4
#WEEK(date) , WEEKOFYEAR(date) 返回一年中的第几周
#DAYOFYEAR(date) 返回日期是一年中的第几天
#DAYOFMONTH(date) 返回日期位于所在月份的第几天
#DAYOFWEEK(date)返回周几,注意:周日是1,周一是2,。。。周六是7
SELECT YEAR(CURDATE()),MONTH(CURDATE()),DAY(CURDATE()),
HOUR(CURTIME()),MINUTE(NOW()),SECOND(SYSDATE())
FROM DUAL;
SELECT MONTHNAME('2021-10-26'),DAYNAME('2021-10-26'),WEEKDAY('2021-10-26'),
QUARTER(CURDATE()),WEEK(CURDATE()),DAYOFYEAR(NOW()),
DAYOFMONTH(NOW()),DAYOFWEEK(NOW())
FROM DUAL;
#3.4日期操作函数:
SELECT EXTRACT()
#3.6计算日期和时间的函数:
SELECT NOW(),DATE_ADD(NOW(),INTERVAL -1 DAY)
FROM DUAL;
#3.7日期的格式化和解析:
#格式化:日期--- >字符串
#解析:字符串--->日期
#DATE_FORMAT(date,fmt) 按照字符串fmt格式化日期date值
SELECT DATE_FORMAT(NOW(),'%y-%M-%D')
#TIME_FORMAT(time,fmt) 按照字符串fmt格式化时间time值
#GET_FORMAT(date_type,format_type) 返回日期字符串的显示格式
#STR_TO_DATE(str, fmt) 按照字符串fmt对str进行解析,解析为一个日期
SELECT STR_TO_DATE()
#4流程控制函数:
#IF(VALUE,VALUE1,VALUE2)
SELECT last_name,salary,IF(salary >= 6000,'高工资','低工资') "details"
FROM employees;
SELECT last_name,commission_pct,IF(commission_pct IS NOT NULL,commission_pct,0) "details",
salary * 12 * (1 + IF(commission_pct IS NOT NULL,commission_pct,0)) "annual_sal"
FROM employees;
#IFNULL(VALUE1,VALUE2)
SELECT last_name,commission_pct,IFNULL(commission_pct,0) "details"
FROM employees;
# CASE WHEN... THEN...WHEN... THEN...WHEN... THEN...ELSE...END
#类似于Java中的if ...else if ...else if... else
SELECT last_name, salary,CASE WHEN salary >= 15000 THEN '高薪'
WHEN salary >= 10000 THEN '中薪'
WHEN salary >= 8000 THEN '低薪'
ELSE '屌丝' END "details"
FROM employees;
#CASE... WHEN... THEN...WHEN... THEN...WHEN... THEN...ELSE...END
#练习:查询部门号为 10,20, 30 的员工信息, 若部门号为 10, 则打印其工资的 1.1 倍, 20 号部门, 则打印其
#工资的 1.2 倍, 30 号部门打印其工资的 1.3 倍数。
SELECT last_name,department_id,salary,CASE department_id WHEN 10 THEN salary * 1.1
WHEN 20 THEN salary * 1.2
WHEN 30 THEN salary * 1.3
END "details"
FROM employees
WHERE department_id IN (10,20,30);
#5.加密和解密的函数:
# PASSWORD()在MySQL8.0已经弃用
SELECT MD5('mysql'),SHA('mysql')#都是不可逆的!
FROM DUAL;
#8.0已经弃用
#ENCODE(value,password_seed) 返回使用password_seed作为加密密码加密value
#DECODE(value,password_seed) 返回使用password_seed作为加密密码解密value
#6.信息函数:
#VERSION() 返回当前MySQL的版本号
#CONNECTION_ID() 返回当前MySQL服务器的连接数
#DATABASE(),SCHEMA() 返回MySQL命令行当前所在的数据库
#USER(),CURRENT_USER()、SYSTEM_USER(),SESSION_USER()返回当前连接MySQL的用户名,返回结果格式为“主机名@用户名”
#CHARSET(value) 返回字符串value自变量的字符集
#COLLATION(value) 返回字符串value的比较规则
SELECT VERSION(),CONNECTION_ID(),DATABASE(),USER(),
CHARSET('尚硅谷'),COLLATION('尚硅谷')
#8.其他函数
FORMAT(VALUE,n)
返回对数字value进行格式化后的结果数据。n表示 四舍五入 后保留
到小数点后n位
# 如果n的值小于或者等于0,则只保留整数部分
#CONV(value,from,to) 将value的值进行不同进制之间的转换
# 以“192.168.1.100”为例,计算方式为192乘以256的3次方,加上168乘以256的2次方,加上1乘以256,再加上100。
#INET_ATON(ipvalue) 将以点分隔的IP地址转化为一个数字
#INET_NTOA(value) 将数字形式的IP地址转化为以点分隔的IP地址
#用于测试表达式的执行效率:
#BENCHMARK(n,expr)将表达式expr重复执行n次。用于测试MySQL处理expr表达式所耗费的时间
SELECT BENCHMARK(1000,MD5('mysql'))
#CONVERT(value USINGchar_code)将value所使用的字符编码修改为char_code
SELECT CHARSET ('atguigu'),CHARSET(CONVERT('atguigu' USING 'gbk'))