MySQL第7章单行函数

#第07章_单行函数

目录

#1.数值函数

#基本的操作

#2. 字符串函数

#3. 日期和时间函数

#4.流程控制函数

#5. 加密与解密的函数(5之后的当做了解,补充)

#6. MySQL信息函数

#7. 其他函数


#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),12 MOD 5,12 % 5
FROM DUAL;#123 32  -1 1 3.141593 33 -43 32 -44 2 2 2

#取随机数
SELECT RAND(),RAND(),RAND(10),RAND(10),RAND(-1),RAND(-1)
FROM DUAL;#0.3078384160137162    0.32390468504643505    0.6570515219653505    0.6570515219653505    0.9050373219931845    0.9050373219931845

#四舍五入,截断操作
SELECT ROUND(123.556),ROUND(123.456,0),ROUND(123.456,1),ROUND(123.456,2),
ROUND(123.456,-1),ROUND(153.456,-2)
FROM DUAL;#124 123 123.5 123.46 120 200

SELECT TRUNCATE(123.456,0),TRUNCATE(123.496,1),TRUNCATE(129.45,-1)
FROM DUAL;#123 123.4 120

#单行函数可以嵌套
SELECT TRUNCATE(ROUND(123.456,2),0)
FROM DUAL;#123

#角度与弧度的互换

SELECT RADIANS(30),RADIANS(45),RADIANS(60),RADIANS(90),
DEGREES(2*PI()),DEGREES(RADIANS(60))
FROM DUAL;#0.5235987755982988    0.7853981633974483    1.0471975511965976    1.5707963267948966    360    59.99999999999999(60°)

1 弧度=57.29578 度
#三角函数


SELECT SIN(RADIANS(30)),DEGREES(ASIN(1)),TAN(RADIANS(45)),DEGREES(ATAN(1))
FROM DUAL;#0.49999999999999994    90    0.9999999999999999    45

#指数和对数


SELECT POW(2,5),POWER(2,4),EXP(2)
FROM DUAL;#32    16    7.38905609893065

SELECT LN(EXP(2)),LOG(EXP(2)),LOG10(10),LOG2(4)
FROM DUAL;#2 2 1 2

#进制间的转换


SELECT BIN(10),HEX(10),OCT(10),CONV(10,10,8)
FROM DUAL;#1010    A    12    12


#2. 字符串函数

LENGTH(s) 返回字符串s的字节数,和字符集有关

SELECT ASCII('Abcdfsf'),CHAR_LENGTH('hello'),CHAR_LENGTH('我们'),
LENGTH('hello'),LENGTH('我们')
FROM DUAL;#65    5    2    5    6(UTF-8中每个中文占三个字节)

# 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;

CONCAT(s1,s2,......,sn) 连接s1,s2,......,sn为一个字符串

CONCAT_WS(x, s1,s2,......,sn) 同CONCAT(s1,s2,...)函数,但是每个字符串之间要加上x

SELECT CONCAT_WS('-','hello','world','hello','beijing')
FROM DUAL;#hello-world-hello-beijing
#字符串的索引是从1开始的!

INSERT(str, idx, len, replacestr) 将字符串str从第idx位置开始,len个字符长的子串替换为字符串replacestr

REPLACE(str, a, b) 用字符串b替换字符串str中所有出现的字符串a
SELECT INSERT('helloworld',2,3,'aaaaa'),REPLACE('hello','lol','mmm')
FROM DUAL;#haaaaaoworld    hello

UPPER(s) 或 UCASE(s) 将字符串s的所有字母转成大写字母

LOWER(s) 或LCASE(s) 将字符串s的所有字母转成小写字母

SELECT UPPER('HelLo'),LOWER('HelLo')
FROM DUAL;#HELLO    hello

SELECT last_name,salary
FROM employees
WHERE LOWER(last_name) = 'King';(MySQL中查询不区别大小写)

SELECT LEFT('hello',2),RIGHT('hello',3),RIGHT('hello',13)
FROM DUAL;#he    llo    hello

# LPAD:实现右对齐效果
# RPAD:实现左对齐效果

SELECT employee_id,last_name,LPAD(salary,10,' ')
FROM employees;

LTRIM(s) 去掉字符串s左侧的空格

RTRIM(s) 去掉字符串s右侧的空格

SELECT CONCAT('---',LTRIM('    h  el  lo   '),'***'),
TRIM('oo' FROM 'ooheollo')
FROM DUAL;#---h  el  lo   ***    heollo

REPEAT(str, n) 返回str重复n次的结果

SPACE(n) 返回n个空格

STRCMP(s1,s2) 比较字符串s1,s2的ASCII码值的大小

SELECT REPEAT('hello',4),LENGTH(SPACE(5)),STRCMP('abc','abe')
FROM DUAL;#hellohellohellohello    5    -1


SELECT SUBSTR('hello',2,2),LOCATE('lll','hello')
FROM DUAL;#el    0 

SELECT ELT(2,'a','b','c','d'),FIELD('mm','gg','jj','mm','dd','mm'),
FIND_IN_SET('mm','gg,mm,jj,dd,mm,gg')
FROM DUAL;#b    3    2

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;#2022-03-25    2022-03-25    23:15:37    2022-03-25 23:15:37    2022-03-25 23:15:37    2022-03-25    15:15:37(与北京时间相差8小时)

SELECT CURDATE(),CURDATE() + 0,CURTIME() + 0,NOW() + 0(日期时间转换为数值,相当于加法的运算)
FROM DUAL;#2022-03-25    20220325    231822    20220325231822

#3.2 日期与时间戳的转换(重点)


SELECT UNIX_TIMESTAMP(),UNIX_TIMESTAMP('2021-10-01 12:12:32'),
FROM_UNIXTIME(1635173853),FROM_UNIXTIME(1633061552)
FROM DUAL;#1648221573    1633061552    2021-10-25 22:57:33    2021-10-01 12:12:32

#3.3 获取月份、星期、星期数、天数等函数


SELECT YEAR(CURDATE()),MONTH(CURDATE()),DAY(CURDATE()),
HOUR(CURTIME()),MINUTE(NOW()),SECOND(SYSDATE())
FROM DUAL;#2022    3    25    23    28    38

(这里的日期进行隐式转换,从字符串转换为日期类型)
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;#October    Tuesday    1    1    12    84    25    6

#3.4 日期的操作函数

SELECT EXTRACT(SECOND FROM NOW()),EXTRACT(DAY FROM NOW()),
EXTRACT(HOUR_MINUTE FROM NOW()),EXTRACT(QUARTER FROM '2021-05-12')
FROM DUAL;#21    25(日期)    2336(23点36分)    2

#3.5 时间和秒钟转换的函数


SELECT TIME_TO_SEC(CURTIME()),
SEC_TO_TIME(83355)
FROM DUAL;#40409    23:09:15

#3.6 计算日期和时间的函数(重点)

SELECT NOW(),DATE_ADD(NOW(),INTERVAL 1 YEAR),
DATE_ADD(NOW(),INTERVAL -1 YEAR),
DATE_SUB(NOW(),INTERVAL 1 YEAR)
FROM DUAL;#2022-03-26 11:15:23    2023-03-26 11:15:23    2021-03-26 11:15:23    2021-03-26 11:15:23(增加日期时间和减少日期时间)


SELECT DATE_ADD(NOW(), INTERVAL 1 DAY) AS col1,DATE_ADD('2021-10-21 23:32:12',INTERVAL 1 SECOND) AS col2,
ADDDATE('2021-10-21 23:32:12',INTERVAL 1 SECOND) AS col3,
DATE_ADD('2021-10-21 23:32:12',INTERVAL '1_1' MINUTE_SECOND) AS col4,
DATE_ADD(NOW(), INTERVAL -1 YEAR) AS col5, #可以是负数
DATE_ADD(NOW(), INTERVAL '1_1' YEAR_MONTH) AS col6 #需要单引号
FROM DUAL;#2022-03-27 11:16:25    2021-10-21 23:32:13    2021-10-21 23:32:13    2021-10-21 23:33:13    2021-03-26 11:16:25    2023-04-26 11:16:25


SELECT ADDTIME(NOW(),20),SUBTIME(NOW(),30),SUBTIME(NOW(),'1:1:3'),DATEDIFF(NOW(),'2021-10-01'),
TIMEDIFF(NOW(),'2021-10-25 22:10:10'),FROM_DAYS(366),TO_DAYS('0000-12-25'),
LAST_DAY(NOW()),MAKEDATE(YEAR(NOW()),32),MAKETIME(10,21,23),PERIOD_ADD(2020010101,10)(period_add更多是放日期)
FROM DUAL;#period_add(P,N)函数参数“P” 的格式为“YYYYMM” 或者 “YYMM” 2022-03-26 12:43:35    2022-03-26 12:42:45    2022-03-26 11:42:12    176    838:59:59    0001-01-01    359    2022-03-31    2022-02-01    10:21:23    2020010905

#3.7 日期的格式化与解析(重点)
# 格式化:日期 ---> 字符串
# 解析:  字符串 ----> 日期

第三个是为了服务于第一第二和第四个 

 

#此时我们谈的是日期的显式格式化和解析

#之前,我们接触过隐式的格式化或解析
SELECT *
FROM employees
WHERE hire_date = '1993-01-13';(将字符串转换为日期)

#格式化:
SELECT DATE_FORMAT(CURDATE(),'%Y-%M-%D'),
DATE_FORMAT(NOW(),'%Y-%m-%d'),TIME_FORMAT(CURTIME(),'%h:%i:%S'),
DATE_FORMAT(NOW(),'%Y-%M-%D %h:%i:%S %W %w %T %r')
FROM DUAL;#2022-March-26th    2022-03-26    12:48:18    2022-March-26th 12:48:18 Saturday 6 12:48:18 12:48:18 PM

#解析:格式化的逆过程
SELECT STR_TO_DATE('2021-October-25th 11:37:30 Monday 1','%Y-%M-%D %h:%i:%S %W %w')
FROM DUAL;#2021-10-25 11:37:30(只能格式化24小时的日期)

SELECT GET_FORMAT(DATE,'USA')
FROM DUAL;#%m.%d.%Y

SELECT DATE_FORMAT(CURDATE(),GET_FORMAT(DATE,'USA'))
FROM DUAL;#03.26.2022

#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 ... 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",department_id
FROM employees;

SELECT last_name,salary,CASE WHEN salary >= 15000 THEN '白骨精' 
                 WHEN salary >= 10000 THEN '潜力股'
                 WHEN salary >= 8000 THEN '小屌丝'
                 END "details"(也可以没有else,跟java中类似)
FROM employees;

#4.4 CASE ... (expr)WHEN ... THEN ... WHEN ... THEN ... ELSE ... END
# 类似于java的swich ... case...
/*

CASE WHEN 条件1 THEN 结果1 WHEN 条件2 THEN 结果2 .... [ELSE resultn] END 相当于Java的if...else if...else...

CASE expr WHEN 常量值1 THEN 值1 WHEN 常量值1 THEN 值1 .... [ELSE 值n] 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);

顺序、分支、循环(MySQL中的查询自带循环,等后面再提及循环)

#5. 加密与解密的函数(5之后的当做了解,补充)


# PASSWORD()在mysql8.0中弃用。
SELECT MD5('mysql'),SHA('mysql'),MD5(MD5('mysql'))#(两个都是不可逆的加密)
FROM DUAL;

#ENCODE()\DECODE() 在mysql8.0中弃用。
/*
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;#8.0.13    11    atguigudb    atguigudb    root@localhost    root@localhost    utf8    utf8_general_ci

#7. 其他函数


#如果n的值小于或者等于0,则只保留整数部分(跟round有区别)
SELECT FORMAT(123.125,2),FORMAT(123.125,0),FORMAT(123.125,-2)
FROM DUAL;#123.13    123    123

SELECT CONV(16, 10, 2), CONV(8888,10,16), CONV(NULL, 10, 2)
FROM DUAL;#10000    22B8    NULL
#以“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;#3232235876    192.168.1.100

#BENCHMARK()用于测试表达式的执行效率
SELECT BENCHMARK(100000,MD5('mysql'))
FROM DUAL;
# CONVERT():可以实现字符集的转换
SELECT CHARSET('atguigu'),CHARSET(CONVERT('atguigu' USING 'gbk'))
FROM DUAL;


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值