常用的分組函數:
分組函數在計算時省略列中的空值
不能在where語句中使用分組函數
①:AVG/SUM:在數字類型數據使用AVG and SUM 函數
AVG:計算平均值
SUM:計算總和
②:COUNT(*)返回表中所有符合條件的記錄數.
COUNT(字段) 返回所有符合條件並且字段值非空的記錄
③:MAX/MIN:MIN and MAX適用於任何數據類型
MIN: 計算最小值
MAX:計算最大值
分組語句:
原表內容:
①:group by語法
SELECT column, group_function FROM table [WHERE condition] [GROUP BY group_by_expression] [ORDER BY column];
使用GROUP BY子句將表分成小組
組函數忽略空值,可以使用ifnull
結果集隱式按升序排列,如果需要改變排序方式可以使用Order by 子句
②:group by使用
#把工資小於300的過濾掉再分組
#把工資大於等於300的分組
SELECT e_name,e_id, e_salary FROM employee WHERE e_salary>=300 GROUP BY e_deptid
結果:
#把工資大於等於300的分組 並按照組平均工資的降序排序
SELECT *,AVG(e_salary) FROM employee WHERE e_salary>=300 GROUP BY e_deptid ORDER BY AVG(e_salary) DESC;
結果:
③:使用HAVING:
1,不能在 WHERE 子句中限制組.
2,限制組必須使用 HAVING 子句.
3,不能在 WHERE 子句中使用組函數.
#列出部門的平均工資大於250的部門
SELECT e_deptid,AVG(e_salary) FROM employee GROUP BY e_deptid HAVING AVG(e_salary)>250
結果:
分組函數執行流程:
在整個語句執行的過程中,最先執行的是From,然后是Where子句,在對表數據進行過濾后,符合條件的數據通過Group by進行分組,分組數據通過Having子句進行組函數過濾,最終的結果通過order by子句進行排序,排序的結果被返回給用戶。
多表查詢:(分為隱式連接和顯式連接)
原表: employee 部門表 dept
隱式查詢
目的:進行多張表的聯合查詢
缺點:
1)會把表中的null的記錄直接過濾,所以:隱式連接只能做內連接
#列舉出所有的員工還有所在部門的名稱
SELECT employee.e_id,employee.e_name,employee.e_salary,employee.e_deptid,dept.d_name FROM employee,dept WHERE employee.e_deptid=dept.deptid
結果:
顯式連接:可以理解為把隱式連接的條件從where挪到on里
分為內連接,外連接,自連接
如果想把一張表的信息包括null都查詢出來則使用外連接,如果想把null信息忽略則使用內連接
隱式連接的問題在於:
1,需要在where條件中寫連接條件,如果忘記寫,代碼不會出錯,產生笛卡爾乘積;
2,隱式連接只能做內連接;
優化:
1)如果on后面有多個條件,並且這些條件中有連接條件和顧慮條件, 那么先寫過濾條件后寫連接條件,性能會有大的提升→有了JOIN就可以不寫where了
2)盡量使用記錄少的表連接記錄相對較多的表
SELECT [表名1.列名1,表名1.列名2,表名1.列名3,表名2.列名1,表名2.列名2] FROM 表名1 , 表名2 WHERE 表名1.列=表名2.列
SELECT [表名1.列名1,表名1.列名2,表名1.列名3,表名2.列名1,表名2.列名2] FROM 表名1 JOIN 表名2 ON 表名1.列=表名2.列
,---> JOIN WHERE--->ON
#左連接:在連接生成的新表中,把JOIN關鍵字左邊的表的記錄全部顯示出來
SELECT emp.e_id,emp.e_name,emp.e_salary,dept.d_name FROM employee AS emp LEFT JOIN dept ON emp.e_deptid=dept.deptid
結果:
自連接:
場景1:
同一張表中的記錄中, 存在多種身份的記錄
如:班長和學生的關系, 部門經理和部門員工的關系
查詢,某個班長管理哪些學生。
場景2:
同一個對象中包含兩個同類型的對象,在同一張表中查詢出三個表中的信息。
在查詢語句中,一張表可以重復使用多次,完成多次連接的需要;
查詢員工和其經理
原表: e_monitor相當於部門經理 由表得1,2為部門經理
查詢有經理管理的員工和其經理
SELECT emp.e_id '員工編號',emp.e_name '員工姓名',monitor.e_id'經理編號',monitor.e_name '經理姓名' FROM
employee emp JOIN employee monitor ON emp.e_monitor=monitor.e_id
結果:
子查詢:
在一個查詢A的結果集中再次查詢B, 那么A就叫做B的子查詢
在使用select語句查詢數據時,有時候會遇到這樣的情況,在where查詢條件中的限制條件不是一個確定的值,而是一個來自於另一個查詢的結果。
SELECT select_list FROM table WHERE expr operator (SELECT select_list FROM table);
1、子查詢在主查詢前執行一次
2、主查詢使用子查詢的結果
##找出所有小於平均工資的員工
SELECT e_name , e_salary FROM employee WHERE e_salary<(SELECT AVG(e_salary) FROM employee)
結果:
UNION/UNION ALL:(比如查詢全校的學生信息)
JOIN是用於把表橫向連接,UNION/UNION ALL是用於把表縱向連接
UNION 操作符用於合並兩個或多個 SELECT 語句的結果集。
注意:
1,UNION 操作的表列數必須相同;
2,列也必須擁有相兼容的數據類型。
3,每條 SELECT 語句中的列的順序必須對應。
4,UNION 結果集中的列名總是使用 UNION 中第一個 SELECT 語句中的列名
5,UNION 操作的表會把結果中重復的記錄刪除
UNION ALL則允許重復的值出現
# UNION:有去重功能 (SELECT * FROM t_employee) UNION (SELECT * FROM t_employee_bak); # UNION ALL簡單的堆疊 (SELECT * FROM t_employee) UNION ALL (SELECT * FROM t_employee_bak);