123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277 |
- #第七章、单行函数
- #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;
|