1. 程式人生 > 其它 >mysql語句中的常見函式

mysql語句中的常見函式

技術標籤:java後端字串javamysqlsql

函式:類似於java中學過的”方法”,為了解決某個問題,將編寫的一系列的命令集合封裝在一起,對外僅僅暴露方法名,供外部呼叫。

分為兩個層面:
1.自定義方法(函式)
2.呼叫方法(函式)
叫什麼:函式名
幹什麼:函式功能

字元函式

#一. 字元函式
#1. CONCAT 拼接字元
SELECT CONCAT('HELLO',`first_name`,`last_name`) 備註 FROM `employees`;

#2. length 獲取位元組長度:文字佔3個位元組
SELECT LENGTH('hello,狗狗');#12

#3. char_LENGTH 獲取字元個數:一個字元佔一個位元組
SELECT CHAR_LENGTH('hello,狗狗');#8

#4. substring/substr 擷取子串 
/*
注:sql中起始索引是1
形式1:substr(str,起始索引,擷取的字元長度)
形式2:substr(str,起始索引) 長度不寫,預設都截
*/
SELECT SUBSTR('小胡愛上了小王',2,3);

#5. INSTR 獲取字元第一次出現的索引
SELECT INSTR('小胡愛上了小王','愛');#3

#6. trim 去前後空格/前後字元 預設去空格
SELECT TRIM('  小胡 小王 ') a;
SELECT TRIM('x' FROM 'xxx小胡xx小王xxxx') a;

#7. lpad/rpad 左填充/右填充 填充至指定長度
SELECT LPAD('小胡小王',10,'a');#aaaaaa小胡小王
SELECT RPAD('小胡小王',10,'a');#小胡小王aaaaaa

#8. UPPER/LOWER 變大寫/變小寫
#姓名首字母大寫
SELECT UPPER(SUBSTR(`first_name`,1,1)),`first_name` FROM `employees`;

#9. STRCMP 比較兩個字元大小
SELECT STRCMP('abc','aaa');#前面大,輸出1

#10. left/right 從左/右擷取子串
SELECT LEFT('小狗勾',1);#小
SELECT RIGHT('小狗勾',1);#勾

數學函式

#二. 數學函式
#1. abs 絕對值
SELECT ABS(-2.4);

#2、CEIL 向上取整  返回>=該引數的最小整數
SELECT CEIL(-1.09);#-1
SELECT CEIL(0.09);#1
SELECT CEIL(1.00);#1

#3、FLOOR 向下取整,返回<=該引數的最大整數
SELECT FLOOR(-1.09);#-2
SELECT FLOOR(0.09);#0
SELECT FLOOR(1.00);#1

#4、ROUND 四捨五入 第二個引數表示保留位數
SELECT ROUND(1.8712345);#2
SELECT ROUND(1.8712345,2);#1.87

#5、TRUNCATE 截斷 第二個引數表示保留位數
SELECT TRUNCATE(1.8712345,1);#1.8

#6、MOD 取餘          
SELECT MOD(-10,3);#-1
#被除數的正負決定了結果的正負
SELECT -10%3;#-1
SELECT 10%3;#1
SELECT -10%-3;#-1
SELECT 10%-3;#1

日期函式

#三、日期函式
#1、NOW 當前日期和時間
SELECT NOW();

#2、CURDATE 當前日期
SELECT CURDATE();

#3、CURTIME 當前時間
SELECT CURTIME();

#4、DATEDIFF 求兩個日期天數的差
SELECT DATEDIFF('1998-7-16','2019-7-13');

#5、DATE_FORMAT 將日期轉化為指定形式

SELECT DATE_FORMAT('1998-7-16','%Y年%m月%d日 %H小時%i分鐘%s秒') 出生日期;
SELECT DATE_FORMAT(hiredate,'%Y年%M月%d日 %H小時%i分鐘%s秒') 入職日期 
FROM employees;

#6、STR_TO_DATE 按指定格式解析字串為日期型別
SELECT * FROM employees
WHERE hiredate<STR_TO_DATE('3/15 1998','%m/%d %Y');

流程控制函式

#四、流程控制函式
#1、IF函式:若表示式1成立,結果為表示式2,若不成立,結果為表示式3
SELECT IF(100>9,'好','壞');
#需求:如果有獎金,則顯示最終獎金,如果沒有,則顯示0
SELECT IF(commission_pct IS NULL,0,salary*12*commission_pct) 獎金,
commission_pct
FROM employees;

#2、CASE函式
/*
情況1 :類似於switch語句,可以實現等值判斷
CASE 表示式
WHEN 值1 THEN 結果1
WHEN 值2 THEN 結果2
...
ELSE 結果n
END

案例:
部門編號是30,工資顯示為2倍
部門編號是50,工資顯示為3倍
部門編號是60,工資顯示為4倍
否則不變

顯示 部門編號,新工資,舊工資
*/
SELECT department_id,salary,
CASE department_id
WHEN 30 THEN salary*2
WHEN 50 THEN salary*3
WHEN 60 THEN salary*4
ELSE salary
END  AS newSalary
FROM employees;

/*
情況2:類似於多重IF語句,實現區間判斷
CASE 
WHEN 條件1 THEN 結果1
WHEN 條件2 THEN 結果2
...
ELSE 結果n
END

案例:如果工資>20000,顯示級別A
      工資>15000,顯示級別B
      工資>10000,顯示級別C
      否則,顯示D
*/
 SELECT salary,
 CASE 
 WHEN salary>20000 THEN 'A'
 WHEN salary>15000 THEN 'B'
 WHEN salary>10000 THEN 'C'
 ELSE 'D'
 END
 AS 級別
 FROM employees;