MySQL數據庫
全部SQL源文件鏈接:https://pan.baidu.com/s/1wc51qkVetSRybFzcIYGBIg
提取碼:3wpt
DQL語言
基礎查詢
-
語法:select 查詢列表 from 表名;
-
類似於System.out.println(打印東西);
-
特點:
- 1.查詢列表可以是:表中的字段、常量值、表達式、函數
- 2.查詢的結果可以是一個虛擬表格;
-
案例
USE myemployees;
#1.查詢表中的單個字段
SELECT last_name FROM employees;
#2.查詢表中多個字段
SELECT last_name,salary,email FROM employees;
#3.查詢表中的所有字段
SELECT * FROM employees;
#4.查詢常量
# select 常量值;
# 注意:字符型和日期型的常量值必須用單引號引起來,數值型不需要
SELECT 100;
SELECT 'join';
#5.查詢函數
#select 函數名(實參列表);
SELECT VERSION();
#6.查詢表達式
SELECT 100%98;
#7.起別名
/*
1.便於理解
2.如果要查詢的字段有重名的情況,使用別名區分
*/
#方式一:使用AS
SELECT 100%98 AS 結果;
SELECT last_name AS 姓,first_name AS 名 FROM employees;
#方式二:使用空格
SELECT last_name 姓,first_name 名 FROM employees;
#案例:查詢salary,結果顯示 out put
SELECT salary AS "out put" FROM employees;
#8.去重
# select distinct 字段名 from 表名;
#案例:查詢員工表中涉及的所有部門編號
SELECT DISTINCT department_id FROM employees;
#9.+號的作用
#案例:查詢員工的名和姓,並顯示爲姓名
/*
java中的+號:
1.運算符:兩個操作數都爲數據型
2.連接符:只要有一個操作數爲字符串
mysql中的+號:
只能作爲運算符
select 100+90; 兩個操作數都爲數值型,做加法運算
select '123+90';其中一方爲字符型,試圖將字符型數值轉換爲數值型
如果轉換成功,則繼續做加法運算
select 'john'+90; 如果轉換失敗,則將字符型數值轉換成0
select null+0; 只要其中一方爲null,則結果肯定爲null.
*/
SELECT last_name+first_name AS 姓名 FROM employees;
#10.【補充】concat函數
/*
功能:拼接字符
select concat(字符1,字符2,字符3,...);
*/
SELECT CONCAT('a','b','c') AS 結果 FROM employees;
SELECT CONCAT(last_name,first_name) AS 姓名 FROM employees;
#11.【補充】ifnull函數
#功能:判斷某字段或表達式是否爲null,如果爲null 返回指定的值,否則返回原本的值
SELECT IFNULL(commission_pct,0) FROM employees;
#12.【補充】isnull函數
#功能:判斷某字段或表達式是否爲null,如果是,則返回1,否則返回0
條件查詢
-
語法:select 查詢列表 from 表名 where 篩選條件;
-
分類
一、按條件表達式篩選 條件運算符:> < = != <> >= <= <=>安全等於 二、按邏輯表達式篩選 邏輯運算符:&& || | and or not && 和 and:兩個條件都爲true,結果爲true,反之爲false || 和 or:只要有一個條件爲true,結果爲true,反之爲false ! 或 not:如果連接的條件本身爲false,結果爲true,反之爲false 三、模糊查詢 like:一般搭配通配符使用,可以判斷字符型或數值型 通配符:%任意多個字符,_任意單個字符 like、between and、in、is null
-
案例
#一.按條件表達式篩選
#案例1:查詢工資>12000的員工信息
SELECT * FROM employees WHERE salary>12000;
#案例2:查詢部門編號不等於90號的員工名和部門編號
SELECT last_name,department_id FROM employees WHERE department_id <> 90;
#二、按邏輯表達式篩選
#案例1:查詢工資z在10000到20000之間的員工名、工資及獎金
SELECT last_name,salary,commission_pct FROM employees WHERE salary>=10000 AND salary<=20000;
#案例2:查詢部門編號不是在90-110之間,或者工資高於15000的員工信息
SELECT * FROM employees WHERE department_id <90 OR department_id>110 OR salary>15000;
#三、模糊查詢
#1.like
#案例1:查詢員工名中包含字符a的員工信息
SELECT * FROM employees WHERE last_name LIKE '%a%';
#案例2:查詢員工名中第三個字符爲b,第五個字符爲a的員工名和工資
SELECT last_name,salary FROM employees WHERE last_name LIKE '__b_a%';
#案例3:查詢員工名種第二個字符爲_的員工名
SELECT last_name FROM employees WHERE last_name LIKE '_\_%';
#2.between and
#案例1:查詢員工編號在100到120之間的員工信息
SELECT * FROM employees WHERE employee_id>=100 AND employee_id<=120;
SELECT * FROM employees WHERE employee_id BETWEEN 100 AND 120;
/*注意事項:
1.提高語句簡潔度
2.包含臨界值
3.兩個臨界值不能調換順序
*/
#3.in
/*
含義:判斷某字段的值是否屬於in列表中的某一項
特點:
1.使用in提高語句簡潔度
2.in列表的值類型必須一致或兼容
*/
#案例1:查詢員工的工種編號是IT_PROG、AD_VP、AD_PRES中的一個員工名和工種編號
SELECT last_name,job_id FROM employees WHERE job_id='IT_PROG' OR job_id='AD_PRES' OR job_id='AD_VP';
SELECT last_name,job_id FROM employees WHERE job_id IN('IT_PROG','AD_PRES','AD_VP');
#4.is null
/*
=或<>不能用於判斷null值
is null 或 is not null 可以判斷null值
*/
#案例1:查詢沒有獎金的員工名和獎金率
SELECT last_name,commission_pct FROM employees WHERE commission_pct IS NULL;
SELECT last_name,commission_pct FROM employees WHERE commission_pct IS NOT NULL;
#安全等於<=>
#案例1:查詢沒有獎金的員工名和獎金率
SELECT last_name,commission_pct FROM employees WHERE commission_pct <=> NULL;
#案例2:查詢工資爲12000的員工信息
SELECT last_name,commission_pct FROM employees WHERE salary <=> 12000;
#is null PK <=>
# 普通類型的數值 null值 可讀性
# is null × √ √
# <=> √ √ ×
排序查詢
-
引入:select * from employees;
-
語法:select 查詢列表 from 表 【where 篩選條件】 order by
-
特點:
- 1.asc代表的是升序,desc代表降序,不寫默認爲升序
- 2.order by子句中可以支持單個字段、多個字段、表達式、函數、別名
- 3.order by子句一般是放在查詢語句的最後面,limit子句除外
-
案例
#案例1:查詢員工信息,要求工資從高到低排序
SELECT * FROM employees ORDER BY salary DESC;
SELECT * FROM employees ORDER BY salary;
#案例2:查詢部門編號是>=90,按入職時間的先後進行排序
SELECT * FROM employees WHERE department_id>=90 ORDER BY hiredate ASC;
#案例3:按年薪的高低顯示員工的信息和年薪【按表達式排序】
SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪 FROM employees
ORDER BY salary*12*(1+IFNULL(commission_pct,0)) DESC;
#案例4:按年薪的高低顯示員工的信息和年薪【按別名排序】
SELECT *,salary*12*(1+IFNULL(commission_pct,0)) 年薪 FROM employees
ORDER BY salary*12*(1+IFNULL(commission_pct,0)) 年薪 DESC;
#案例5:按姓名的長度顯示員工的姓名和工資【按函數排序】
SELECT LENGTH(last_name) 字節長度,last_name,salary
FROM employees
ORDER BY LENGTH(last_name) DESC;
#案例6:查詢員工共信息,要求按工資排序,再按員工編號排序【按多個字段排序】
SELECT * FROM employees
ORDER BY salary ASC,employee_id DESC;
常見函數
-
概念:類似於Java的方法,將一組邏輯語句封裝在方法體中,對外暴露方法名
-
優點:1.隱藏了實現細節 2.提高了代碼的重用性
-
語法:select 函數名(實參列表) 【from 表】;
-
特點:
-
1.叫什麼(函數名)
-
2.幹什麼(函數功能)
-
-
分類:
- 1.單行函數,如concat、length、ifnull等
- 2.分組函數,做統計使用
單行函數
- 單行函數分類:字符函數、數學函數、日期函數、其他函數、流程控制函數
字符函數具體案例:
#一.字符函數
#1.length 獲取參數值的字節值
SELECT LENGTH('subei');
SELECT LENGTH('鬼谷子qwe');
SHOW VARIABLES LIKE '%char%';
#2.concat 拼接字符串
SELECT CONCAT(last_name,'_',first_name) 姓名 FROM employees;
#3.upper:變大寫、lower:變小寫
SELECT UPPER('ton');
SELECT LOWER('ton');
#示例:將姓變大寫,名變小寫,然後拼接
SELECT CONCAT(UPPER(last_name),LOWER(first_name)) 姓名 FROM employees;
#4.substr、substring
#注意:索引從1開始
#截取從指定所有處後面的所以字符
SELECT SUBSTR('吳剛伐桂在天上',4) out_put;
#截取從指定索引處指定字符長度的字符
SELECT SUBSTR('吳剛伐桂在天上',1,2) out_put;
#案例:姓名中首字符大寫,其他字符小寫,然後用_拼接,顯示出來
SELECT CONCAT(UPPER(SUBSTR(last_name,1,1)),'_',LOWER(SUBSTR(last_name,2))) out_put FROM employees;
#5.instr:獲取子串第一次出現的索引,找不到返回0
SELECT INSTR('MySQL技術進階','技術') AS out_put;
#6.trim:去前後空格
SELECT LENGTH(TRIM(' 霍山 ')) AS out_put;
SELECT TRIM('+' FROM '++++李剛+++劉邦+++') AS out_put;
#7.lpad:用指定的字符實現左填充指定長度
SELECT LPAD('梅林',8,'+') AS out_put;
#8.rpad:用指定的字符實現右填充指定長度
SELECT RPAD('梅林',5,'&') 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.005);
SELECT CEIL(-1.002);
#3.floor:向下取整,返回<=該參數的最大整數
SELECT FLOOR(-9.99);
#4.truncate:截斷
SELECT TRUNCATE(1.65,1);
#5.mod:取餘
SELECT MOD(10,3);
#6.rand:獲取隨機數,返回0-1之間的小數
SELECT RAND();
日期函數具體案例:
#1.now:返回當前系統時間+日期
SELECT NOW();
#2.year:返回年
SELECT YEAR(NOW());
SELECT YEAR(hiredate) 年 FROM employees;
#3.month:返回月
#MONTHNAME:以英文形式返回月
SELECT MONTH(NOW());
SELECT MONTHNAME(NOW());
#4.day:返回日
#DATEDIFF:返回兩個日期相差的天數
SELECT DAY(NOW());
SELECT DATEDIFF('2020/06/30','2020/06/21');
#5.str_to_date:將字符通過指定格式轉換成日期
SELECT STR_TO_DATE('2020-5-13','%Y-%c-%d') AS out_put;
#6.date_format:將日期轉換成字符
SELECT DATE_FORMAT('2020/6/6','%Y年%m月%d日') AS out_put;
SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日') AS out_put;
#7.curdate:返回當前日期
SELECT CURDATE();
#8.curtime:返回當前時間
SELECT CURTIME();
其他函數具體案例:
#version 當前數據庫服務器的版本
SELECT VERSION();
#database 當前打開的數據庫
SELECT DATABASE();
#user當前用戶
SELECT USER();
#password('字符'):返回該字符的密碼形式
SELECT PASSWORD('a');
#md5('字符'):返回該字符的md5加密形式
SELECT MD5('a');
流程控制函數具體案例:
#1.if函數: if else效果
SELECT IF(10<5,'大','小');
SELECT last_name,commission_pct,IF(commission_pct IS NULL,'沒獎金!!!','有獎金!!!') 備註 FROM employees;
#2.case函數
#使用一:switch case 的效果
/*
java中
switch(變量或表達式){
case 常量1:語句1;break;
...
default:語句n;break;
}
mysql中
case 要判斷的變量或表達式
when 常量1 then 要顯示的值1或語句1
when 常量2 then 要顯示的值2或語句2
...
else 要顯示的值n或語句n
end
#案例:查詢員工的工資,要求:
部門號=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;
#3.case函數的使用二:類似於多重if
/*
java中:
if(條件1){
語句1;
}else if(條件2){
語句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;
分組函數
- 功能:用作統計使用,又稱爲聚合函數或統計函數或組函數
- 分類:sum 求和、avg 平均值、max 最大值、min最小值count 計算個數
- 特點:
- 1.sum和avg一般用於處理數值型
max、min、count可以處理任何數據類型 - 2.以上分組函數都忽略null
- 3.都可以搭配distinct使用,實現去重的統計
select sum(distinct 字段) from 表; - 4.count函數
count(字段):統計該字段非空值的個數
count(*):統計結果集的行數 - 5.和分組函數一同查詢的字段,要求是group by後出現的字段
- 1.sum和avg一般用於處理數值型
#1.簡單使用
SELECT SUM(salary) FROM employees;
SELECT AVG(salary) FROM employees;
SELECT MAX(salary) FROM employees;
SELECT MIN(salary) FROM employees;
SELECT COUNT(salary) FROM employees;
SELECT SUM(salary) 和,ROUND(AVG(salary),2) 平均,MAX(salary) 最高,MIN(salary) 最低,COUNT(salary) 個數
FROM employees;
#2.參數支持哪些數據類型
SELECT SUM(last_name),AVG(last_name) FROM employees;
SELECT SUM(hiredate),AVG(hiredate) FROM employees;
SELECT MAX(last_name),MIN(last_name) FROM employees;
SELECT MAX(hiredate),MIN(hiredate) FROM employees;
SELECT COUNT(commission_pct) FROM employees;
SELECT COUNT(last_name) FROM employees;
#3.是否忽略null
SELECT SUM(commission_pct),AVG(commission_pct) FROM employees;
SELECT commission_pct FROM employees;
SELECT SUM(commission_pct),AVG(commission_pct),SUM(commission_pct)/35,AVG(commission_pct)/107 FROM employees;
SELECT MAX(commission_pct),MIN(commission_pct) FROM employees;
SELECT COUNT(commission_pct) FROM employees;
#4.和distinct搭配
SELECT SUM(DISTINCT salary),SUM(salary) FROM employees;
SELECT COUNT(DISTINCT salary),COUNT(salary) FROM employees;
#5.count函數詳解
SELECT COUNT(salary) FROM employees;
SELECT COUNT(*) FROM employees;
SELECT COUNT(1) FROM employees;
/*
效率上:
MyISAM存儲引擎,count(*)最高
InnoDB存儲引擎,count(*)和count(1)效率>count(字段)
*/
#6.和分組函數一同查詢的字段有限制
SELECT AVG(salary),employee_id FROM employees;
分組查詢
-
語法:
select 分組函數,分組後的字段 from 表 【where 篩選條件】 group by 分組的字段 【having 分組後的篩選】 【order by 排序列表】
- 注意:查詢列表必須特殊,要求是分組函數和group by後出現的字段
-
特點:
-
1.分組查詢中的篩選條件分爲兩類
使用關鍵字 篩選的表 位置 分組前篩選 where 原始表 group by的前面 分組後篩選 having 分組後的結果 group by的後面 1.分組函數做條件肯定是放在having子句中 2.能用分組前篩選的,就優先考慮使用分組前篩選
-
2.group by子句支持單個字段分組,多個字段分組(多個字段之間用逗號隔開沒有順序要求),表達式或函數(使用較少)
-
3.也可以添加排序(排序放在整個分組查詢的最後)
-
-
案例
#引入:查詢每個部門的平均工資
SELECT AVG(salary) FROM employees;
#案例1:查詢每個工種的最高工資
SELECT MAX(salary),job_id FROM employees
GROUP BY job_id;
#案例2:查詢每個位置上的部門個數
SELECT COUNT(*),location_id
FROM departments
GROUP BY location_id;
#添加篩選條件
#案例1:查詢郵箱中包含a字符的,每個部門的平均工資
SELECT AVG(salary),department_id FROM employees
WHERE email LIKE '%a%' GROUP BY department_id;
#案例2:查詢有獎金的每個領導手下員工的最高工資
SELECT MAX(salary),manager_id FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY manager_id;
#添加複雜的篩選條件
#案例1:查詢哪個部門的員工個數>2
#1.查詢每個部門的員工個數
SELECT COUNT(*),department_id FROM employees
GROUP BY department_id;
#2.根據1的結果進行篩選,查詢哪個部門的員工個數大於2
SELECT COUNT(*),department_id FROM employees
GROUP BY department_id HAVING COUNT(*)>2;
#案例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;
#按表達式或函數分組
#案例:按員工姓名的長度分組,查詢每一組的員工個數,篩選員工個數>5
#1.查詢每個長度的員工個數
SELECT COUNT(*),LENGTH(last_name) len_name
FROM employees GROUP BY LENGTH(last_name);
#2.添加篩選條件
SELECT COUNT(*) c,LENGTH(last_name) len_name
FROM employees GROUP BY len_name HAVING c>5;
#按多個字段查詢
#案例:查詢每個部門每個工種的員工的平均工資
SELECT AVG(salary),department_id,job_id
FROM employees GROUP BY department_id,job_id;
#添加排序
#案例:查詢每個部門每個工種的員工的平均工資,按平均工資的高低查詢
SELECT AVG(salary),department_id,job_id
FROM employees GROUP BY department_id,job_id
ORDER BY AVG(salary) DESC;