一、條件查詢
1、含義:前面學的基礎查詢可以查詢一個或多個字段,如果需要的數據僅僅是其中的某一行或多行就用到了條件查詢。
2、語法:(序號表示語句執行順序)
SELECT 字段名 ③
FROM 表名 ①
WHERE 篩選條件; ②
3、篩選條件
#1條件運算符:
> < = <> >= <=
#2邏輯運算符:
&& || !
#3模糊查詢:
like、between and、in、is null
案例一:查詢所有員工中工資大於10000的員工名、工資(條件運算符+起別名+點語法)
SELECT last_name,salary
FROM employees e #起別名
WHERE e.`salary`>10000; #點語法訪問表中的字段
注意:在from中給表employees起別名後where中再使用employees.salary是錯誤的
案例二:查詢所有員工中工資大於5000並且部門編號大於105的員工信息(邏輯運算符+起別名)
SELECT *
FROM employees e
WHERE e.`salary`>5000 && e.`department_id`>105;
注意:MySQL中支持&&但推薦使用 AND、OR分別代替&&、||
案例三:查詢所有員工中姓名第二個字母位'k'且工資在1000到20000之間的員工信息(模糊查詢)
SELECT *
FROM employees e
WHERE e.`last_name` LIKE '_k%' AND e.`salary` BETWEEN 1000 AND 20000;
補充:
1、通配符:(使用like的模糊查詢中用到)
①'%'在通配符中代表任意長度任意字符,其中任意長度可爲0
②'_'在通配符中代表長度爲1的任意字符
③如果要查詢的字段中包含'%'、'_' 可以使用轉義符'\'或自定義轉義符,例如:
案例:查詢員工姓名中包含'_'的員工信息
//使用'\'作爲轉義符(默認)
SELECT *
FROM employees e
WHERE e.`last_name` LIKE '%\_%' ;
//自定義轉義符,使用escape關鍵字
SELECT *
FROM employees e
WHERE e.`last_name` LIKE '%$_%' ESCAPE '$';
2、between ... and ... :
①兩者之間均可滿足(不可等於臨界值)
②between numa and numb,numa與numb的位置不可交換即必須滿足:numa<=numb
3、模糊查詢(in):
語法:
last_name in('a','b','c');
注意:
①括號中多個元素在一起時逗號隔開
②當last_name與括號中至少一個字符串完全一直時纔會被篩選出來
4、模糊查詢(is null):
語法:
last_name is null;
注意:MySQL中不能直接使用 ' == '來判空,但使用安全等於 ' <=> ' 可判空也可判定其它任意類型的數據
二、排序查詢
1、含義:排序查詢可將查詢出的數據按照特定字段的數值按由小到大或由大到小排序。
2、語法:(執行順序如序號所示)
SELECT 字段名 ④
FROM 表名 ①
【WHERE 篩選條件】 ②
ORDER BY 排序方式; ③
注意:
①排序方式分爲兩種ASC(升序)、DESC(降序)
②OREDER BY子句一般在查詢語句的最後面,除了limit子句
案例:查詢全體員工中薪資大於8000的員工姓名並將薪資按升序排列(排序查詢+起別名)
SELECT last_name,salary
FROM employees e
WHERE e.`salary`>8000
ORDER BY e.`salary` ASC;
三、分組查詢
1、單行函數:
①字符函數:
SELECT LENGTH('hello world!'); 返回括號中所佔總字節數(多數函數返回字符數,僅該函數返回字節數)
SELECT CONCAT('str1','str2','str3'); 將括號中多個字符串拼接成一個長的字符串
SELECT UPPER('str'),LOWER('STR'); 變大、小寫
SELECT SUBSTR('str',a,b); 在str中從第a位開始截取長度爲b的字符串(第一個字符索引爲1)
SELECT REPLACE('str','str1','str2');將str中的str1全部替換爲str2
②數學函數
SELECT ROUND(1.345,2); 將1.345保留2位小數的四捨五入
SELECT CEIL(0.9),FLOOR(1.1); 將0.9向上取整,將1.1向下取整
SELECT TRUNCATE(1.55555,2); 保留兩位小數
SELECT MOD(10,9); 取餘(10%9)
③日期函數
SELECT NOW(); 打印當前時間
SELECT DATE_FORMAT(NOW(),'%Y年%m月%d日'); 將標準日期類型(datetime)的數據轉化爲字符串(varchar)
SELECT STR_TO_DATE('1998-3-2','%Y-%c-%d') AS out_put; 將字符串(varchar)轉化爲指定日期類型
④流程控制函數(只舉一例if函數)
SELECT IF(3>2,end1,end2); 當3>2成立時,執行end1,否則執行end2
2、分組函數
求和:sum()、均值:avg()、最大值:max()、最小值:min()、求數目:count()、求日期差(天):datediff()
注意:用法在下面的分組查詢中會詳細講解
3、分組查詢
1、含義:題目中出現’ 每個 ‘的時候一般要使用分組查詢,即:將整個表的數據按某個性質分成n組(理解不了就直接看案例)
2、語法:
SELECT 字段名或分組函數
FROM 表名
【WHERE 篩選條件】
GROUP BY 分組依據
ORDER BY 排序方式
案例一:查詢每個部門的最低工資(起別名+分組排序)
理解:題中出現每個,要用分組排序,查詢每個部門的最低工即:先將所有人按部門編號分成多組,再從每組中選出最低工資
SELECT MIN(salary) 最低工資,department_id 部門編號
FROM employees
GROUP BY department_id;
運行結果:
案例二:查詢每個管理者手下員工的最低工資,並且最低工資不能低於6000,沒有管理者的員工不計算在內
題目比較複雜分兩步做:
①按照manage_id分組,從中選出最低工資
SELECT MIN(salary),manager_id
FROM employees
WHERE manager_id IS NOT NULL
GROUP BY manager_id;
②篩選最低工資大於等於6000的數據
SELECT MIN(salary),manager_id
FROM employees
WHERE manager_id IS NOT NULL
GROUP BY manager_id
HAVING MIN(salary)>=6000;
注意:既然也是篩選爲什麼用的時having?
where篩選與having篩選的區別:分組前篩選用where,分組後篩選用having。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
複習整理,如有錯誤請指出。