SQL 聚合函數、分組GROUP BY、子查詢及組合查詢JOIN
1、聚合函數:
- COUNT:統計行數量
- SUM:獲取列的合計值(求和)
- AVG:計算列的平均值
- MAX:計算列的最大值
- MIN:計算列的最小值
1.1 COUNT 計數
SELECT COUNT(*) FROM TABLE1;
SELECT COUNT(DISTINCT 字段) FROM TABLE1; --DISTINCT即去重
1.2 返回列合計值(SUM):
SELECT SUM(字段) FROM TABLE1 ;
1.3 返回列平均值(AVG):
SELECT AVG(字段)FROM TABLE1;
1.4 返回最大值/最小值(MAX/MIN):
SELECT MAX(字段) FROM TABLE1;
SELECT MIN(字段) FROM TABLE1;
2、數據分組(GROUP BY):
字段1 分組,統計 字段2 的數量:
SELECT 字段1,COUNT(ALL 字段2) AS 數量 FROM TABLE1 GROUP BY (字段1);
執行順序為:WHERE過濾→分組→聚合函數
字段1分組 統計 字段2 中 字段3 >100 的數量:
SELECT 字段1,COUNT(字段2) AS 數量 FROM TABLE1 WHERE 字段3>100 GROUP BY (字段1);
HAVING 子句過濾條件(where):
字段1 分組 統計 字段3平均值 > 100 的值
SELECT 字段1,AVG(字段3) AS 平均值 FROM TABLE1 GROUP BY (字段1) HAVING AVG(字段3)>100;
在 SQL 中增加 HAVING 子句原因是,WHERE 關鍵字無法與合計函數一起使用。
注意:SQL的執行順序:
- 1、執行FROM
- 2、WHERE條件過濾
- 3、GROUP BY分組
- 4、執行SELECT投影列
- 5、HAVING條件過濾
- 6、執行ORDER BY 排序
3、子查詢:
什么是子查詢?子查詢就是嵌套在主查詢中的查詢。
子查詢可以嵌套在主查詢中所有位置,包括SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY。
從兩個不同的表中,查出 t1.id,t1.name,t2.name
SELECT t1.id,t1.name,(SELECT name FROM table2 t2 WHERE t2.ccid=t1.ccid) FROM table1 t1 GROUP BY t1.id;
--查出字段1='SQL'的且 字段2 的最大的信息
SELECT * FROM table1 WHERE 字段1='SQL' AND 字段2>=ALL (SELECT 字段2 FROM table1 WHERE 字段1='SQL') ;
運算符:
- ALL //和子查詢的結果逐一比較,必須全部滿足時表達式的值才為真。
- ANY //和子查詢的結果逐一比較,其中一條記錄滿足條件則表達式的值就為真。
- EXISTS/NOT EXISTS //EXISTS判斷子查詢是否存在數據,如果存在則表達式為真,反之為假。NOT EXISTS相反。
SELECT * FROM table1 WHERE 字段1='SQL' AND 字段2 >(SELECT 字段2 FROM table1 WHERE 字段3='你好' AND 字段1='SQL'
SELECT * FROM table1 t1 WHERE t1.字段1>= ALL(SELECT t2.字段1 FROM table2 t2 WHERE t1.字段2=t2.字段2);
4、組合查詢(UNION、INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN):
4.1 UNION 操作符
用於合並兩個或多個 SELECT 語句的結果集。
請注意,UNION 內部的 SELECT 語句必須擁有相同數量的列。列也必須擁有相似的數據類型。同時,每條 SELECT 語句中的列的順序必須相同。
UNION 不會出現重復值
SELECT 列1 , 列2 FROM 表1
UNION
SELECT 列3 , 列4 FROM 表2;
UNION ALL 列出所有值:
SELECT 列1 , 列2 FROM 表1
UNION ALL
SELECT 列3 , 列4 FROM 表2;
4.2 INNER JOIN
在表中存在至少一個匹配時,INNER JOIN 關鍵字返回行。
語法:
SELECT column_name(s)
FROM table_name1
INNER JOIN table_name2
ON table_name1.column_name=table_name2.column_name
4.3 LEFT JOIN
LEFT JOIN 關鍵字會從左表 (table_name1) 那里返回所有的行,即使在右表 (table_name2) 中沒有匹配的行。
語法:
SELECT column_name(s)
FROM table_name1
LEFT JOIN table_name2
ON table_name1.column_name=table_name2.column_name
4.4 RIGHT JOIN
RIGHT JOIN 關鍵字會右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中沒有匹配的行。
語法:
SELECT column_name(s)
FROM table_name1
RIGHT JOIN table_name2
ON table_name1.column_name=table_name2.column_name
4.5 FULL JOIN
只要其中某個表存在匹配,FULL JOIN 關鍵字就會返回行。
語法:
SELECT column_name(s)
FROM table_name1
FULL JOIN table_name2
ON table_name1.column_name=table_name2.column_name
創建時間:2020.09.10 更新時間: