MySQL數據庫之--函數語法

學習目標: 掌握以下sql函數

數字函數: FORMAT ABS MOD CEIL FLOOR ROUND EXP…
字符函數: UPPER LOWER CHAR_LENGTH CONCAT INSTR…
日期函數: NOW DATE_FORMAT DATE_ADD DATEDIFF IF IFNULL…
條件函數:


數字函數

第一批數字函數

函數 功能 用例
ABS 求絕對值 ABS(-100)
ROUND 四捨五入 ROUND(4.62)
FLOOR 強制舍位 FLOOR(9.9)
CEIL 強制進位 CEIL(3.2)
POWER 冪函數 POWER(2,3)
LOG 對數函數 LOG(7,3)
LN 對數函數 LN(10) 以常熟e爲底
-- 數學函數1
SELECT ABS(-100);    --絕對值100
SELECT ROUND(4.62);  --四捨五入5
SELECT FLOOR(9.9);   --向下舍位9
SELECT CEIL(3.2);    --向上強進位4
SELECT POWER(2,3);   --冪函數2的3次方8
SELECT LOG(7,3);     --log7(3)
SELECT LN(10);       --ln10

第二批數字函數

函數 功能 用例
SQRT 開平方 SQRT(9)
PI 圓周率 PI() 三角函數
SIN 三角函數 SIN(1)
COS 三角函數 COS(1)
TAN 三角函數 TAN(1)
COT 三角函數 COT(1)
RADIANS 角度轉換弧度 RADIANS(30)
DEGRESE 弧度轉換角度 DEGREES(1)
-- 數學函數2
SELECT SQRT(9);
SELECT PI();
SELECT SIN(1);
SELECT COS(1);
SELECT TAN(1);
SELECT COT(1);
SELECT RADIANS(30); -- 角度轉弧度

SELECT SIN(RADIANS(30));
SELECT COS(RADIANS(45));
SELECT TAN(RADIANS(30));
SELECT COT(RADIANS(45));
SELECT DEGREES(1); -- 弧度轉角度

日期函數

獲取系統時間函數

NOW()函數能獲得系統日期和時間,格式yyyy-mm-dd hh:mm:ss
CURDATE()函數能獲得當前系統時間, 格式hh:mm:ss
CURTIME()函數能獲得當前系統時間, 格式hh:mm:ss
在這裏插入圖片描述
DATE_FORMAT(日期, 表達式) 用來提煉如星期幾\第幾天\等信息

-- 時間函數  
SELECT NOW(),CURDATE(),CURTIME();
-- 查員工那年入職的
SELECT ename ,DATE_FORMAT(hiredate,"%j") FROM t_emp;

日期格式化函數

在這裏插入圖片描述

案例:

-- 案例:明年你的生日是星期幾?
SELECT DATE_FORMAT("2020-11-22","%W");

-- 利用日期函數,查詢1981年上半年入職的員工有多少人?
SELECT count(*) from t_emp where
DATE_FORMAT(hiredate,"%Y")=1981 AND DATE_FORMAT(hiredate,"%m")<=6;

日期偏移計算函數

日期函數注意事項: MySQL數據庫裏,兩個日期不能直接加減, 日期也不能與數字加減.
DATE_ADD()函數可以實現日期偏移計算,而且時間單位很靈活

DATE_ADD( 日期 ,INTERVAL 偏移量  時間單位) 
  • 時間單位: day hour year
    案例:
-- 時間偏移
SELECT DATE_ADD(NOW(),INTERVAL 400 DAY);
SELECT DATE_ADD("2019-03-02",INTERVAL 500 day);

-- 6個月前的再往前推3天_嵌套查詢
SELECT DATE_FORMAT(
DATE_ADD( DATE_ADD( NOW(),INTERVAL -6 MONTH), INTERVAL -3 DAY), "%Y/%m/%d");

兩個日期之間計算差距

DATEDIFF( 日期, 日期) 括號裏可以是日期,可以是年

-- 案例:計算2020-02-02 舉例建國多少年
SELECT DATEDIFF("2020-02-02","1949-10-01")/365;

字符函數

如首字母大寫 保留手機尾號後四位 等

概覽

字符函數
在這裏插入圖片描述

  • instar 判斷是否出現A,以及他的位置
  • insert 1,0 意思是在第一刀位置插入,不替換; 改成1 ,替換一個字符,改成2替換兩個字符
  • replace 是前邊的那個字符串,把其中的先生替換成女士
    練習案例:
-- 字符函數練習:小寫名\大寫名\名字長度(utf8一個漢字3個字符)\工資連接美元符號\名字中A的位置
SELECT 
	LOWER(ename) , UPPER(ename), LENGTH(ename),CONCAT(sal,"$") , INSTR(ename,"A")
FROM t_emp;

-- 字符串練習2 插入,第一個1意思是在1個字符的位置處插入;第二個位置的0表示不替換,1替換1個,2替換兩個...
SELECT INSERT("你好",1,0,"先生");
-- 字符串練習3 把前邊你好先生 的先生二字換爲女士
SELECT REPLACE("你好先生","先生","女士");

字符函數2
在這裏插入圖片描述

  • 解釋: substr 和 substring 區別在於 3截取到4, 和3開始截取2個字符的差異
-- 練習內容提取
SELECT SUBSTR("你好世界",3,4),SUBSTRING("你好世界",3,2);

-- 練習lpad 電話尾號
SELECT LPAD(SUBSTRING("13810888888",8,4),11,"*");

-- 練習rpad  只保留姓氏
SELECT RPAD(SUBSTRING("李曉娜",1,1),LENGTH("李曉娜")/3,"*");

-- 練習TRIM  去空格
SELECT TRIM("        Hello World       ");

條件函數

IF 和 IFNULL

SQL語句中可以利用條件函數來實現編程語言裏的條件判斷
IFNULL(表達式,替換值)
IF (表達式,值1,值2) true返回值1,false返回值2

-- 條件函數 SALES部門的員工法禮品A,別的法禮品B
SELECT e.empno, e.ename , d.dname,IF(d.dname='SALES','禮品A','禮品B')
FROM t_emp e join t_dept d on e.deptno=d.deptno;

多種狀態的條件語句

CASE WHEN 表達式 THEN 值1 WHEN 表達式2 THEN 值2 ELSE END

SELECT e.empno , e.ename ,
	CASE  
		WHEN d.dname='SALES' THEN  'P1'
		WHEN d.dname='ACCOUNTING' THEN  'P2'
		WHEN d.dname='RESEARCH' THEN  'P3'	
		ELSE
			'HOME'
	END AS place
FROM t_emp e join t_dept d on e.deptno=d.deptno
ORDER BY place;

練習:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-u9C8ntOp-1579260629599)(./_image/2020-01-15-13-16-03.png)]

-- 公司決定爲員工調整基本工資,具體方案如下截圖
UPDATE t_emp e 
LEFT join t_dept d on e.deptno=d.deptno
LEFT JOIN (SELECT deptno,AVG(sal) AS avgg FROM t_emp GROUP BY deptno) t ON e.deptno=t.deptno
SET e.sal=(
	CASE
		WHEN d.dname='SALES' and DATEDIFF(NOW(),e.hiredate)/365>=20  THEN e.sal*1.1
		WHEN d.dname='SALES' and DATEDIFF(NOW(),e.hiredate)/365<20   THEN e.sal*1.05 
		WHEN d.dname='ACCOUNTING' THEN e.sal+300 
		WHEN d.dname='RESEARCH' AND e.sal<t.avgg THEN e.sal+200
		WHEN d.dname IS NULL THEN e.sal+100
		ELSE e.sal	
END);

總結: 本次涉及了以下四個常用函數

  • 數字函數
  • 字符函數
  • 日期函數
  • 條件函數
發佈了44 篇原創文章 · 獲贊 5 · 訪問量 1949
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章