前言: 由於大一學習數據庫不紮實,學到後面有點吃力,所以回過頭來認真學習一邊,寫一些學習總結,提醒自己。也要告誡讀者,把
基礎打紮實
。讀者覺得有用的話可以收藏點贊哦!
文章目錄
- MySQL函數查詢
- 1.1、單行函數
- 字符函數
- `1、LENGTH 獲取參數的字節個數`
- `2、concat 拼接字符串`
- `3、UPPER 、LOWER 大小寫`
- `4、SUBSTR 字符截取`
- `案例:姓名中首字符用大寫,其他字符用小寫然後用_拼接起來`
- `5、INSTR(str,substr) 返回子串 `
- `6、TRIM()去空格`
- `7、lpad 用指定的長度實現左填充指定的長度`
- `8、Rpad 用指定的長度實現右填充指定的長度`
- `9、REPLACE 替換`
- 數字函數
- 日期函數
- `1、NOW() 返回當前系統日期加時間`
- `2、 CURDATE() 返回當前系統日期不包含時間`
- `3、 CURTIME() 返回當前時間,不包含系統日期`
- `4、 可以獲取指定的部分,年,月,日,小時,分鐘,秒`
- `5、 STR_TO_DATE 通過指定的格式轉換成日期`
- `6、 data_format`
- 其他函數
- 流程控制函數
- 1.2、分組函數
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 # 升序
總結: 數據庫這門語言呢,不難,但是要多練,沒有捷徑。讀者覺得有用的話可以收藏點贊哦!