|
@@ -0,0 +1,277 @@
|
|
|
+#第七章、单行函数
|
|
|
+
|
|
|
+#1、数值函数
|
|
|
+#基本操作
|
|
|
+SELECT ABS(-123),ABS(32),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(123.456),ROUND(123.456,0),ROUND(123.456,1),ROUND(123.456,2),
|
|
|
+ROUND(123.456,-1),ROUND(153.456,-2)
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+SELECT TRUNCATE(123.456,0),TRUNCATE(123.496,1),TRUNCATE(129.45,-1)
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+#单行函数可以嵌套
|
|
|
+SELECT TRUNCATE(ROUND(123.456,2),0)
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+#角度与弧度的互换
|
|
|
+SELECT RADIANS(30),RADIANS(45),RADIANS(60),RADIANS(90)
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+SELECT DEGREES(2*PI()),DEGREES(RADIANS(60))
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+#三角函数
|
|
|
+SELECT SIN(RADIANS(30)),DEGREES(ASIN(1)),TAN(RADIANS(45)),DEGREES(ATAN(1))
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+#指数和对数
|
|
|
+SELECT POW(2,5),POWER(2,4),EXP(2)
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+SELECT LN(EXP(2)),LOG(EXP(2)),LOG10(10),LOG2(4)
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+#进制间的转换
|
|
|
+SELECT BIN(10),HEX(10),OCT(10),CONV(10,2,8),CONV(10,10,8)
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+#2、字符串函数
|
|
|
+SELECT ASCII('abc'),CHAR_LENGTH('hello'),CHAR_LENGTH('我们'),LENGTH('hello'),LENGTH('我们')
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+# xxx worked for yyy
|
|
|
+SELECT CONCAT(emp.last_name,' worked for ',mgr.last_name) "details"
|
|
|
+FROM employees emp JOIN employees mgr
|
|
|
+WHERE emp.manager_id = mgr.employee_id;
|
|
|
+
|
|
|
+SELECT CONCAT_WS('-','hello','world','hello','beijing')
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+#字符串的索引是从1开始的
|
|
|
+SELECT INSERT('helloworld',2,3,'aaaaa'),REPLACE('hello','ll','mmm')
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+SELECT REPLACE('hello','lol','mmm')
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+SELECT UPPER('Hello'),LOWER('heLLo')
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+SELECT last_name,salary
|
|
|
+FROM employees
|
|
|
+WHERE LOWER(last_name) = 'king';
|
|
|
+
|
|
|
+SELECT LEFT('hello',2),LEFT('hello',12),RIGHT('hello',3),RIGHT('hello',13)
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+#LPAD:实现右对齐效果
|
|
|
+#RPAD:实现左对齐效果
|
|
|
+
|
|
|
+SELECT employee_id,last_name,LPAD(salary,10,'*')
|
|
|
+FROM employees;
|
|
|
+
|
|
|
+SELECT CONCAT('---',TRIM(' he l l o '),'***'),TRIM('oo' FROM 'ooheollo')
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+SELECT REPEAT('hello',4),LENGTH(SPACE(5)),STRCMP('abc','abd')
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+SELECT SUBSTR('hello',2,2),LOCATE('ll','hello')
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+SELECT ELT(2,'aa','bb','cc','dd'),FIELD('mm','gg','jj','mm','dd','mm'),FIND_IN_SET('mm','gg,mm,jj,dd,mm,gg')
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+SELECT employee_id,NULLIF(LENGTH(first_name),LENGTH(last_name)) "compare"
|
|
|
+FROM employees;
|
|
|
+
|
|
|
+#3、日期和时间函数
|
|
|
+#3.1、获取日期、时间
|
|
|
+SELECT CURDATE(),CURRENT_DATE(),CURTIME(),NOW(),SYSDATE(),UTC_DATE(),UTC_TIME()
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+SELECT CURDATE(),CURDATE() + 0,CURTIME(),CURTIME() + 0,NOW(),NOW() + 0
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+#3.2、日期与时间戳的转换
|
|
|
+SELECT UNIX_TIMESTAMP(),UNIX_TIMESTAMP('2022-11-14 23:45:32'),FROM_UNIXTIME(1669634117),FROM_UNIXTIME(1668440732)
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+#3.3、获取月份、星期、星期数、天数等函数
|
|
|
+SELECT YEAR(CURDATE()),MONTH(CURDATE()),DAY(CURDATE()),HOUR(CURTIME()),MINUTE(CURTIME()),SECOND(CURTIME())
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+#以下日期类型存在隐式转换,将字符串转换成日期类型
|
|
|
+SELECT MONTHNAME('2022-11-14'),DAYNAME('2022-11-14'),WEEKDAY('2022-11-14'),QUARTER(CURDATE()),WEEK(CURDATE()),DAYOFYEAR(NOW()),DAYOFMONTH(NOW()),DAYOFWEEK(NOW())
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+#3.4、日期的操作函数
|
|
|
+SELECT EXTRACT(SECOND FROM NOW()),EXTRACT(DAY FROM NOW()),EXTRACT(HOUR_MINUTE FROM NOW()),EXTRACT(QUARTER FROM '2022-11-14')
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+#3.5、时间和秒钟转换的函数
|
|
|
+SELECT TIME_TO_SEC(CURTIME()),SEC_TO_TIME(71239)
|
|
|
+FROM DUAL
|
|
|
+
|
|
|
+#3.6、计算日期和时间的函数
|
|
|
+SELECT NOW(),DATE_ADD(NOW(),INTERVAL 1 YEAR),DATE_ADD(NOW(),INTERVAL -1 YEAR),DATE_SUB(NOW(),INTERVAL 1 YEAR)
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+SELECT DATE_ADD(NOW(),INTERVAL 1 DAY) AS addDay,DATE_ADD('2022-11-14 23:32:12',INTERVAL 10 SECOND) AS addSecond,ADDDATE('2022-11-14 23:32:12',INTERVAL 10 SECOND) AS addSecond2,DATE_ADD('2022-11-14 23:32:12',INTERVAL '10_10' MINUTE_SECOND) AS addMS,DATE_ADD(NOW(),INTERVAL -1 YEAR) AS addY,DATE_ADD(NOW(),INTERVAL '10_10' YEAR_MONTH) AS addYM
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+SELECT DATE_SUB('2022-11-14',INTERVAL 28 DAY) AS col1,SUBDATE('2022-11-14',INTERVAL 28 DAY) AS col2,DATE_SUB('2022-11-14 13:32:45',INTERVAL '1_1' DAY_HOUR) AS col3
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+SELECT ADDTIME(NOW(),20),SUBTIME(NOW(),30),SUBTIME(NOW(),'1:1:3'),DATEDIFF(NOW(),'2022-11-14'),TIMEDIFF(NOW(),'2022-11-14 22:10:10')
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+SELECT FROM_DAYS(366),TO_DAYS('0000-12-25'),LAST_DAY(NOW()),MAKEDATE(YEAR(NOW()),12),MAKETIME(10,21,23),PERIOD_ADD(20200101010101,10)
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+#3.7、日期的格式化与解析
|
|
|
+#格式化:日期 ---> 字符串
|
|
|
+#解析: 字符串 ---> 日期
|
|
|
+
|
|
|
+#此时我们谈的是日期的显式格式化和解析
|
|
|
+
|
|
|
+#格式化
|
|
|
+SELECT DATE_FORMAT(CURDATE(),'%Y-%M-%D') AS col1,DATE_FORMAT(NOW(),'%y-%m-%d') AS col2,TIME_FORMAT(CURTIME(),'%h:%i:%s') AS col3,DATE_FORMAT(NOW(),'%Y-%m-%d %h:%i:%s %W %w %T %r') AS col4
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+#解析:格式化的逆过程
|
|
|
+SELECT STR_TO_DATE('2022-11-29 10:13:49 Tuesday 2 10:13:49 10:13:49 AM','%Y-%m-%d %h:%i:%s %W %w %T %r') AS col
|
|
|
+FROM DUAL
|
|
|
+
|
|
|
+SELECT GET_FORMAT(DATE, 'USA')
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+SELECT DATE_FORMAT(CURDATE(),GET_FORMAT(DATE, 'USA'))
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+#4、流程控制函数
|
|
|
+#4.1、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;
|
|
|
+
|
|
|
+#4.2、IFNULL(value1,value2):看做是IF(value,value1,value2)的特殊情况
|
|
|
+SELECT last_name,commission_pct,IFNULL(commission_pct,0) "details"
|
|
|
+FROM employees;
|
|
|
+
|
|
|
+#4.3、CASE WHEN...THEN...WHEN...THEN...END
|
|
|
+SELECT last_name,salary,CASE WHEN salary >= 15000 THEN '白骨精'
|
|
|
+ WHEN salary >= 10000 THEN '潜力股'
|
|
|
+ WHEN salary >= 8000 THEN '小屌丝'
|
|
|
+ ELSE '草根' END AS "details",department_id
|
|
|
+FROM employees;
|
|
|
+
|
|
|
+SELECT last_name,salary,CASE WHEN salary >= 15000 THEN '白骨精'
|
|
|
+ WHEN salary >= 10000 THEN '潜力股'
|
|
|
+ WHEN salary >= 8000 THEN '小屌丝'
|
|
|
+ END AS "details",department_id
|
|
|
+FROM employees;
|
|
|
+
|
|
|
+#4.4、CASE...WHEN...THEN...WHEN...THEN...END
|
|
|
+#相当于Java的switch…case…
|
|
|
+/*
|
|
|
+练习1
|
|
|
+查询部门号为10,20,30的员工信息,
|
|
|
+若部门号为10,则打印其工资的1.1倍,
|
|
|
+若部门号为20,则打印其工资的1.2倍,
|
|
|
+若部门号为30,则打印其工资的1.3倍,
|
|
|
+其他部门,则打印其工资的1.4倍。
|
|
|
+*/
|
|
|
+
|
|
|
+SELECT employee_id,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
|
|
|
+ ELSE salary*1.4 END "details"
|
|
|
+FROM employees;
|
|
|
+
|
|
|
+
|
|
|
+/*
|
|
|
+练习2:
|
|
|
+查询部门号为10,20,30的员工信息,
|
|
|
+若部门号为10,则打印其工资的1.1倍,
|
|
|
+若部门号为20,则打印其工资的1.2倍,
|
|
|
+若部门号为30,则打印其工资的1.3倍
|
|
|
+*/
|
|
|
+
|
|
|
+SELECT employee_id,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中已被弃用,在MySQL5.7中可正常使用
|
|
|
+-- SELECT PASSWORD('mysql')
|
|
|
+-- FROM DUAL;
|
|
|
+
|
|
|
+SELECT MD5('mysql'),SHA('mysql')
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+#ENCODE()/DECODE():在MySQL8.0中弃用,在MySQL5.7中可正常使用
|
|
|
+
|
|
|
+-- SELECT ENCODE('atguigu','mysql'),DECODE(ENCODE('atguigu','mysql'),'mysql')
|
|
|
+-- FROM DUAL;
|
|
|
+
|
|
|
+#6、MySQL信息函数
|
|
|
+SELECT VERSION(),CONNECTION_ID(),DATABASE(),SCHEMA(),USER(),CURRENT_USER(),CHARSET('世界杯'),COLLATION('世界杯')
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+#7、其他函数
|
|
|
+#如果n的值小于或者等于0,则只保留整数部分
|
|
|
+SELECT FORMAT(123.125,2),FORMAT(123.125,0),FORMAT(123.125,-2)
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+SELECT CONV(16,10,2),CONV(8888,10,16),CONV(NULL,10,2)
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+#以“192.168.1.100”为例,计算方式为192乘以256的3次方,加上168乘以256的2次方,加上1乘以256,再加上100
|
|
|
+SELECT INET_ATON('192.168.1.100'),INET_NTOA(3232235876)
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+#BENCHMARK(n,expr):用于测试表达式的执行效率
|
|
|
+SELECT BENCHMARK(1000000,MD5('mysql'))
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+#CONVERT():可以实现字符集的转换
|
|
|
+SELECT CHARSET('atguigu'),CHARSET(CONVERT('atguigu' USING 'gbk'))
|
|
|
+FROM DUAL;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|