(以下內容全部來自上述課程)
單行函數
1. 內置函數及分類
- 單行函數
- 聚合函數(或分組函數)
1.1 單行函數特點
- 操作數據對象
- 接受參數返回一個結果
- 只對一行進行變換
- 每行返回一個結果
- 可以嵌套
- 參數可以是一列或一個值
2. 數值函數
2.1 基本函數
#1.數值函數
# 基本的操作
# 絕對值:123 32 正負號:-1 1 3.14... 33 -43 32
SELECT ABS (-123),ABS (32),SIGN (-23),SIGN (43),PI(),CEIL(32.32),CEILING(-43.23),FLOOR(32.32),
# -44 取余:2 2 2
FLOOR(-43.23),MOD(12,5),12 MOD 5,12 % 5
FROM DUAL;# 取隨機數:()內因子相同,隨機數也相同
SELECT RAND(),RAND(),RAND(10),RAND(10),RAND(-1),RAND(-1)
FROM DUAL;#四舍五入,截斷操作
# 124 123 123.5 123.46 120 200
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;# 123 123.4 120
SELECT TRUNCATE(123.456,0),TRUNCATE(123.496,1),TRUNCATE(129.45,-1)
FROM DUAL;#單行函數可以嵌套
# 123
SELECT TRUNCATE(ROUND(123.456,2),0)
FROM DUAL;
2.2 角度與弧度的轉換
#角度與弧度的互換
SELECT RADIANS(30),RADIANS(45),RADIANS(60),RADIANS(90),
DEGREES(2*PI()),DEGREES(RADIANS(60))
FROM DUAL;
2.3 三角函數
2.4 指數與對數
# 指數與對數
# 32 16 7.389....
select pow(2,5),power(2,4),exp(2)
from dual;# 2 2 1 2
select ln(exp(2)),log(exp(2)),log10(10),log2(4),
from dual;
2.5 進制間的轉換
#進制間的轉換
SELECT BIN(10),HEX(10),OCT(10),CONV(10),2,8)
FROM DUAL;
3.字符串函數
# 2.字符串函數
# 65 5 2
SELECT ASCII('Abcdfsf'),CHAR_LENGTH('hello'),CHAR_LENGTH('我們'),
# 5 6
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;#字符串的索引是從1開始的!
SELECT INSERT('helloworld',2,3,'aaaaa'),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),RIGHT('hello',3),RIGHT('hello',13)
FROM DUAL;# LPAD:實現右對齊效果
# RPAD:實現左對齊效果
SELECT employee_id,last_name,LPAD(salary,10,'')
FROM employees;
4. 日期和時間函數
4.1 獲取日期、時間
4.2 日期與時間戳的轉換
4.3 獲取月份、星期、星期數、天數等函數
4.4 日期的操作函數
SELECT EXTRACT(MINUTE FROM NOW()),EXTRACT( WEEK FROM NOW()),
EXTRACT( QUARTER FROM NOW()),EXTRACT(MINUTE_SECOND FROM NOW())
FROM DUAL;
4.5 時間和秒鐘轉換的函數
4.6 計算日期和時間的函數
- 第一組:
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;SELECT DATE_SUB('2021-01-21',INTERVAL 31 DAY) AS col1,
SUBDATE('2021-01-21',INTERVAL 31 DAY) AS col2,
DATE_SUB('2021-01-2102:01:01',INTERVAL '1 1'DAY_HOUR) AS col3
FROM DUAL;
- 第二組:
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()),12),MAKETIME(10,21,23),PERIOD_ADD(20200101010101,10)
FROM DUAL;
4.7 日期的格式化與解析
#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;#解析:格式化的逆過程
SELECT STR_TO_DATE('2021-0ctober-25th 11:34:42 Monday 1 23:34:42','%Y-%M-%D %h:%i:%S %W %w %T')
FROM DUAL;
5. 控制流程函數
#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;#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;