MySQL進階4: 常見函數(單行函數)

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章