# 進階4: 常見函數
/*
概念:將一組邏輯語句封裝在方法體中,對外暴露方法名
好處:1、隱藏了實現細節 2、提高代碼的重用性
調用: select 函數名(實參列表) 【from 表】;
特點:
①叫什麼(函數名)
②幹什麼(函數功能)
分類:
1、單行函數(字符函數、數學函數、日期函數、其他函數、流程控制函數)
如 concat、length、ifnull等
2、分組函數
功能:做統計使用,又稱爲統計函數、聚合函數、組函數
*/
# 一、字符函數
# 1.length 獲取參數值的字節個數
SELECT LENGTH('tan');
SELECT LENGTH('譚嗣同666');
# 2.concat 拼接字符串
SELECT CONCAT(last_name,'_',first_name) AS 姓名 FROM employees;
# 3.upper\lower
SELECT UPPER('john');
SELECT LOWER('TANk');
# 示例: 將姓變大寫、名變小寫,然後拼接
SELECT CONCAT(UPPER(last_name),'.',LOWER(first_name)) AS 姓名 FROM employees;
# 4. substr\substring
# 索引從1開始
#截取從索引處後面所有字符
SELECT SUBSTR('李莫愁愛上了陸展元',7) AS out_put;
#截取從指定索引處指定長度的字符
SELECT SUBSTR('李莫愁愛上了陸展元',1,3) AS out_put;
# 案例:姓名中首字母大寫,其他字符小寫,人後拼接,顯示出
SELECT CONCAT(UPPER(SUBSTR(last_name,1,1)),'_',LOWER(SUBSTR(last_name,2))) AS out_put
FROM employees;
# 5.instr #返回子串第一次出現的索引,如果沒有就返回0
SELECT INSTR('楊不悔愛上了殷六俠','殷六俠') AS out_put
FROM employees;
# 6.trim 去前後子串,缺省是空格
SELECT LENGTH(TRIM(' 666s撒 ')) AS out_put;
SELECT TRIM('ss' FROM 'sssssssssss666s撒ssssssss') AS out_put;
# 7.lpad 用指定的字符實現左填充指定長度,若超過就截斷
SELECT LPAD('嚶嚶怪',10,'*') AS out_put;
# 8.rpad 用指定的字符實現右填充指定長度,若超過就截斷
SELECT RPAD('嚶嚶怪',12,'ab') AS out_put;
# 9.replace 替換
SELECT REPLACE('周芷若周芷若周芷若周芷若張無忌愛上了周芷若','周芷若','金毛獅王') AS out_put;
# 二、數學函數
# 1.round 四捨五入
SELECT ROUND(1.45);
SELECT ROUND(1.567,2);
# 2.ceil 向上取整,返回大於等於該數的最小整數
SELECT CEIL(1.502);
# 3.floor 向下取整,返回小於等於該數的最大整數
SELECT FLOOR(1.502);
# 4. truncate 截斷
SELECT TRUNCATE(1.6999,1);
# 5.mod 取餘 :mod(x,y)=x-y*floor(x/y)
SELECT MOD(-10,3);
SELECT -10%3;
# 三、日期函數
# 1.now 返回當前系統日期+時間
SELECT NOW();
# 2.curdate 返回當前系統日期,不包含時間
SELECT CURDATE();
# 3.curtime 返回當前系統時間,不包含日期
SELECT CURTIME();
# 4.可以獲取指定的部分,年、月、日、小時、分鐘、秒
SELECT YEAR(NOW()) AS 年;
SELECT YEAR('1999-1-1') AS 年;
SELECT MONTH(NOW()) AS 月;
SELECT MONTHNAME(NOW()) AS 月;
SELECT DAY(NOW()) AS 日;
SELECT HOUR(NOW()) AS 小時;
SELECT MINUTE(NOW()) AS 分鐘;
SELECT SECOND(NOW()) AS 秒;
# 5.str_to_date 將日期格式的字符轉換成指定格式的日期
SELECT STR_TO_DATE('9-13-1999-4', '%m-%d-%Y-%h');
/*
%Y 四位的年份
%y 二位的年份
%m 月份(01,02,...,11,12)
%c 月份(1,2,...,11,12)
%d 日(01,02,...,)
%H 小時(24小時制)
%h 小時(12小時制)
%i 分鐘(00,01,...,59)
%s 秒(00,01,...,59)
*/
# 查詢入職日期爲1992-4-3的員工
SELECT * FROM employees WHERE hiredate='1992-4-3';
SELECT * FROM employees WHERE hiredate=STR_TO_DATE('4-3 1992','%c-%d %Y');
# 6. date_format 將日期轉換成字符
SELECT DATE_FORMAT(NOW(),'%y年%m月%d日') AS out_put;
# 查詢有獎金的員工名和入職日期(xx月/xx日 xx年)
SELECT last_name,DATE_FORMAT(hiredate, '%m月/%d日 %y年') AS 入職日期
FROM employees
WHERE commission_pct IS NOT NULL;
# 7. datediff函數
SELECT DATEDIFF('2017-10-1', '2017-10-10');
# 四、其他函數
SELECT VERSION();
SELECT DATABASE();
SELECT USER();
# 五、流程控制函數
# 1.if函數:if else 的效果
SELECT IF(10<5,'大','小');
SELECT last_name,commission_pct,IF(commission_pct IS NULL,'沒獎金,呵呵','有獎金,嘻嘻') AS 備註
FROM employees;
# 2.case函數
/*
一、switch case的效果
case 要判斷的字段或者表達式
when 常量1 then 要顯示的值1或語句1;
when 常量2 then 要顯示的值2或語句2;
...
else 要顯示的值n或語句n;
end
*/
/* 案例1: 查詢員工的工資,要求
部門號=30,顯示的工資爲1.1倍
部門號=40,顯示的工資爲1.2倍
部門號=50,顯示的工資爲1.3倍
其他的部門爲原工資
*/
SELECT salary AS 原始工資,department_id,
CASE department_id
WHEN 30 THEN salary*1.1
WHEN 40 THEN salary*1.2
WHEN 50 THEN salary*1.3
ELSE salary
END AS 新工資
FROM employees;
/*
二、多重if的效果
case
when 條件1 then 要顯示的值1或語句1;
when 條件2 then 要顯示的值2或語句2;
...
else 要顯示的值n或語句n;
end
*/
/* 案例2: 查詢員工的工資的情況
如果工資>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;
MySQL進階4: 常見函數(單行函數)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.