MySQL函數查詢——MySQL 基礎查詢你會了嗎?

前言: 由於大一學習數據庫不紮實,學到後面有點吃力,所以回過頭來認真學習一邊,寫一些學習總結,提醒自己。也要告誡讀者,把基礎打紮實。讀者覺得有用的話可以收藏點贊哦!

MySQL函數查詢

1.1、單行函數

字符函數
1、LENGTH 獲取參數的字節個數
SELECT LENGTH('join')  # 4
# 如果是gbk,一個漢字佔2個字節
# 如果是utf-8,一個漢字佔3個字節

#-------------------------------

SELECT LENGTH('張三丰')  # 9 
#獲取當前字符編碼
SHOW VARIABLES LIKE '%char%'
2、concat 拼接字符串
SELECT CONCAT(last_name,'_',first_name) name
FROM employees

# 結果 K_ing_Steven ....
3、UPPER 、LOWER 大小寫
SELECT UPPER('Join')  # JOIN
SELECT LOWER('JOIN')  # join
4、SUBSTR 字符截取
# SUBSTR重載
#SELECT SUBSTR(str FROM pos FOR len)
#		    SUBSTR(str FROM pos)
#       SUBSTR(str,pos,len)
#       SUBSTR(str,pos)
#-------------------------------

SELECT substr('李莫愁愛上陸展元',6) output #下標是從 1 開始的 =>陸展元

SELECT substr('李莫愁愛上陸展元',4,5) output #下標是從 1 開始的  =>愛上陸展元

案例:姓名中首字符用大寫,其他字符用小寫然後用_拼接起來
SELECT CONCAT(UPPER(SUBSTR(last_name,1,1)),LOWER(SUBSTR(last_name,2)),'_',LOWER(first_name)) as name
FROM employees
5、INSTR(str,substr) 返回子串
# 第一回出現的位置,如果沒有返回 0
SELECT INSTR('楊不悔愛上了殷六叔','六叔') AS out_put  # 8
6、TRIM()去空格
SELECT LENGTH(trim('        張翠山           ')) AS out_put # 9

有時候這個函數不滿如要求,比如aaaaa張翠aaaaa山aaaaa把前後的a 去掉怎麼辦呢?

SELECT TRIM('a' FROM 'aaaaa張翠aaaaa山aaaaa') AS out_put  # 張翠aaaaa山

注意點: 如果a前面有空格或後面有空格就只是去空格,如果你需要去掉a字符前面和後面就不能有空格

比如:

SELECT TRIM('a' FROM '  aaaaa張翠aaaaa山aaaaa')   # aaaaa張翠aaaaa山
SELECT TRIM('a' FROM '  aaaaa張翠aaaaa山aaaaa   ')   # aaaaa張翠aaaaa山aaaaa 
7、lpad 用指定的長度實現左填充指定的長度
SELECT LPAD('殷素素',10,'*') AS out_put  # *******殷素素
SELECT LPAD('殷素素',2,'*') AS out_put  # 殷素
#(如果長度小於給定的字符長度就從左邊依次截取)
8、Rpad 用指定的長度實現右填充指定的長度
SELECT RPAD('殷素素',12,'ab') AS out_put # 殷素素ababababa
9、REPLACE 替換
SELECT REPLACE('張無忌愛上了周芷若','周芷若','趙敏') AS out_put
# 張無忌愛上了趙敏

後者替換前者

數字函數
1、ROUND(X) 四捨五入
SELECT ROUND(1.65)  # 取整
SELECT ROUND(1.569,2) # 小數點後保留2位
2、CEIL(X) 向上取整
SELECT CEIL(1.02) #  => 2
3、 FLOOR(X) 向下取整
SELECT FLOOR(9.99) #  =>9
4、 TRUNCATE(X,D) 截取小數點後D位
SELECT TRUNCATE(1.699,1)  #  =>1.6
5、 MOD(N,M) 取模
SELECT MOD(10,3)
SELECT 10%3

擴展:MOD(a,b) 的計算 a-a/b*b

日期函數
1、NOW() 返回當前系統日期加時間
SELECT NOW();  # 2020-05-09 18:10:03 
2、 CURDATE() 返回當前系統日期不包含時間
SELECT CURDATE();  # 2020-05-09 
3、 CURTIME() 返回當前時間,不包含系統日期
SELECT CURTIME();  # 18:10:57
4、 可以獲取指定的部分,年,月,日,小時,分鐘,秒
SELECT YEAR(NOW())#這兩種都可以
SELECT YEAR('1997-9-13')SELECT YEAR('1997/9/13')SELECT YEAR(hiredate)FROM employees 


SELECT MONTH(NOW())SELECT MONTHNAME(NOW())# => May  英文版書寫
SELECT MONTH(hiredate)FROM employees 


SELECT DAY(NOW())# 只輸出星期幾沒有幾號
SELECT DAYNAME(NOW())# =>Thursday 英文版書寫
SELECT DAYNAME('1997-9-13')# =>Thursday 英文版書寫


SELECT HOUR(NOW()) 小時
SELECT MINUTE(NOW())SELECT SECOND(NOW())
5、 STR_TO_DATE 通過指定的格式轉換成日期
SELECT STR_TO_DATE('1/2 1997','%d/%c %Y') AS out_put
6、 data_format
SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日')  AS out_put


SELECT last_name,DATE_FORMAT(hiredate,'%m月%d日  %y年')  
FROM employees
WHERE commission_pct IS NOT NULL

在這裏插入圖片描述

其他函數
1、版本號
SELECT VERSION();  # 8.0.19
2、DATABASE()
SELECT DATABASE();  # myemployees
3、USER()
SELECT USER();  # root@localhost
流程控制函數
1、 IF(expr1,expr2,expr3)
SELECT IF(TRUE,'真','假')    # 真
SELECT IF(FALSE,'真','假')   # 假
2、 case 函數使用一 switch case 的效果

案例 : 查詢員工的工資,要求
部門號:30 ,顯示的工資爲1.1倍
部門號:40 ,顯示的工資爲1.2倍
部門號:50 ,顯示的工資爲1.3倍
其他部門,顯示原工資

SELECT
	salary 原始工資,
	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
2、 case 函數使用二: 類似於多重if

java 中
if(條件1){
語句一;
}else if(條件2){
語句二;
}

else{
語句n;
}

mysql中

case
WHEN 條件1 then 要顯示的值1或語句1
WHEN 條件2 then 要顯示的值2或語句2

else 要顯示的值n或語句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

1.2、分組函數

特點:

1、sum,avg 一般用於處理數值型;max,min,count可以處理任何類型

2、以上分組函數都忽略null值

3、可以和 DISTINCT 搭配,實現去重功能。

4、count函數的單獨介紹一般使用count(*)

5、和分組函數一起查詢的字段要求是group by後的字段

  • sum 求和

  • avg 平均值

  • max 最大值

  • min 最小值

  • count 計算個數

SELECT COUNT(*) FROM employees  # 查詢表中的行數。

SELECT COUNT(1) FROM employees  # 查詢表中的行數。

效率問題:

  • MYISAM存儲引擎下 COUNT()效率最高
  • INNODB存儲引擎下 COUNT(*)和COUNT(1)效率差不多
分組函數篩選條件
數據源 位置 關鍵字
分組前篩選 原始表 GROUP BY子句前面 WHERE
分組後篩選 分組後的結果集 GROUP BY子句後面 HAVING

分組函數做條件肯定放在 HAVING 子句中。

以下是案例鞏固以上所以學

# 引入 查詢每個部門的平均工資

SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id

# 案例一: 每個工種的最高工資

SELECT MAX(salary),job_id 
FROM employees
GROUP BY job_id

# 案例二: 查詢每個位置上的部門個數

SELECT COUNT(*),location_id
FROM departments 
GROUP BY location_id


# 1、添加分組前篩選條件

# 案例一: 查詢郵箱中包含a字符的,每個部門的平均工資。

SELECT AVG(salary),department_id,email
FROM employees
WHERE email LIKE '%a%'
GROUP BY department_id



# 案例二: 查詢有獎金的每個領導手下員工的最高工資

SELECT MAX(salary),manager_id
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY manager_id

# 2、添加複雜的(分組後)篩選條件

# 案例一:那個部門的員工個數大於2

# 步驟1.查詢每個部門的員工個數
	SELECT COUNT(*),department_id
	FROM employees
	GROUP BY department_id

# 步驟2.根據第一的結果查詢那個部門的員工個數大於2

	SELECT COUNT(*),department_id
	FROM employees
	GROUP BY department_id
	HAVING count(*)>2
	
	
# 案例二: 查詢每個工種有獎金的員工的最高工資>12000的工種編號和最高工資

# 步驟1:查詢每個工種有獎金的員工的最高工資

	SELECT MAX(salary),job_id
	FROM employees
	WHERE commission_pct is not NULL
	GROUP BY job_id

# 步驟2:>12000的工種編號和最高工資

	SELECT MAX(salary),job_id
	FROM employees
	WHERE commission_pct is not NULL
	GROUP BY job_id
	HAVING MAX(salary) >12000


# 案例三: 查詢領導編號>120的每個領導手下的最低工資>5000的領導編號是哪個,以及其最低工資。

# 步驟1.查詢領導編號>120的每個領導手下的最低工資
SELECT MIN(salary),manager_id
FROM employees
WHERE manager_id>120
GROUP BY manager_id

# 步驟2.最低工資大於5000的

SELECT MIN(salary),manager_id
FROM employees
WHERE manager_id>120
GROUP BY manager_id
HAVING MIN(salary)>5000



# 3、按表達式或函數分組

# 案例一: 按員工姓名的長度分組,查詢每一組的員工個數,篩選員工個數>5 的有哪些。

SELECT COUNT(*) 個數,LENGTH(CONCAT(last_name,first_name)) 長度
FROM employees
GROUP BY 長度
HAVING 個數>5


# 4、按多個字段進行分組

# 案例: 查詢每個部門每個工種的員工的平均工資

SELECT AVG(salary),department_id,job_id
FROM employees 
GROUP BY department_id,job_id



# 5、添加排序

# 案例: 查詢每個部門每個工種的員工的平均工資,並且按平均工資的高低進行排序

SELECT AVG(salary),department_id,job_id
FROM employees 
GROUP BY department_id,job_id
ORDER BY AVG(salary) DESC

SELECT AVG(salary),department_id,job_id
FROM employees 
GROUP BY department_id,job_id
ORDER BY AVG(salary) ASC # 升序

總結: 數據庫這門語言呢,不難,但是要多練,沒有捷徑。讀者覺得有用的話可以收藏點贊哦!

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