1. 程式人生 > 實用技巧 >SQL 聚合函式、分組GROUP BY、子查詢及組合查詢JOIN

SQL 聚合函式、分組GROUP BY、子查詢及組合查詢JOIN

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.3LEFT 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.4RIGHT 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.5FULL 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  更新時間: