SQL 基礎知識- 聚合和排序

2021-03-02 IT外包



  這是《SQL 基礎知識梳理(二) - 查詢基礎》的下篇。

目錄

對表進行聚合查詢

對表進行分組

為聚合結果指定條件

對查詢結果進行排序

一、對表進行聚合查詢

  1.聚合函數

    (1)5 個常用函數:

      ①COUNT:計算表中的記錄(行)數。

      ②SUM:計算表中數值列的數據合計值。

      ③AVG:計算表中數值列的數據平均值。

      ④MAX:求出表中任意列中數據的最大值。

      ⑤MIN:求出表中任意列中數據的最小值。

    (2)聚合:將多行匯總成一行。

圖1-1 Shohin 表

  2.計算表中數據的行數 

--示例
SELECT COUNT(*)  -- *:參數,這裡代表全部列
FROM dbo.Shohin;

  3.計算 NULL 以外數據的行數

  將 COUNT(*) 的參數改成指定對象的列,就可以得到該列的非 NULL 行數。

SELECT COUNT(shiire_tanka)
FROM dbo.Shohin;

只計算非 NULL 的行

  【備註】除了 COUNT 函數,其它函數不能將星號作為參數。

  【備註】COUNT 函數的結果根據參數的不同而不同。COUNT(*) 會得到包含 NULL 的數據行數,而 COUNT(<列名>) 會得到 NULL 之外的數據行數。

  4.計算合計值

SELECT SUM(hanbai_tanka) AS sum_hanbai_tanka, --總和
AVG(hanbai_tanka) AS avg_hanbai_tanka, --平均
MAX(hanbai_tanka) AS max_hanbai_tanka, --最大
MIN(hanbai_tanka) AS min_hanbai_tanka --最小
FROM dbo.Shohin;

  【備註】所有的聚合函數,如果以列名為參數,會無視 NULL 值所在的行。

SELECT MAX(torokubi),  --torokubi 為日期
MIN(torokubi)
FROM dbo.Shohin

  【備註】MAX/MIN 函數幾乎適用於所有數據類型的列。SUM/AVG 函數隻適用於數值類型的列。

  5.使用聚合函數刪除重複值(關鍵字 DISTINCT)

--示例1:計算去除重複數據後的數據行數
SELECT COUNT(DISTINCT shohin_bunrui)
FROM dbo.Shohin;

--示例2:先計算數據行數再刪除重複數據的結果
SELECT DISTINCT COUNT(shohin_bunrui)
FROM dbo.Shohin;

  【備註】在聚合函數的參數中使用 DISTINCT(示例1),可以刪除重複數據。DISTINCT 不僅限於 COUNT 函數,所有的聚合函數都可以使用。

二、對表進行分組

  1.GROUP BY 子句

--語法:
--SELECT <列名1>, <列名2>, ...
--FROM <表名>
--GROUP BY <列名1>, <列名2>, ...;

--示例
SELECT shohin_bunrui AS '商品種類',
COUNT(*) AS '數量'
FROM dbo.Shohin
GROUP BY shohin_bunrui;

  【備註】GROUP BY 子句中指定的列稱為「聚合鍵」或「分組列」。

  【子句的書寫順序(暫定)】SELECT --> FROM --> WHERE --> GROUP BY

  2.聚合鍵中包含 NULL 的情況

SELECT shiire_tanka, COUNT(*)
FROM dbo.Shohin
GROUP BY shiire_tanka;

  【備註】聚合鍵中包含 NULL 時,在結果中也會以 NULL 行的形式表現出來。

  3.WHERE 對 GROUP BY 執行結果的影響

--語法
--SELECT <列名1>, <列名2>, ...
--FROM <表名>
--WHERE <表達式>
--GROUP BY <列名1>, <列名2>, ...

SELECT shiire_tanka, COUNT(*)
FROM dbo.Shohin
WHERE shohin_bunrui = '衣服'
GROUP BY shiire_tanka

  這裡是先根據 WHERE 子句指定的條件進行過濾,然後再進行聚合處理。

  【執行順序】FROM --> WHERE --> GROUP BY --> SELECT。這裡是執行順序,跟之前的書寫順序是不一樣的。

  4.與聚合函數和 GROUP BY 子句有關的常見錯誤

  (1)易錯:在 SELECT 子句中書寫了多餘的列

    SELECT 子句只能存在以下三種元素:

      ①常數

      ②聚合函數

      ③GROUP BY 子句中指定的列名(即聚合鍵)

易錯點1

  【總結】使用 GROUP BY 子句時,SELECT 子句不能出現聚合鍵之外的列名。

  (2)易錯:在 GROUP BY 子句中寫了列的別名   

易錯點2

  回顧之前說的執行順序,SELECT 子句是在 GROUP BY 子句之後執行。所以執行到 GROUP BY 子句時無法識別別名。

  【總結】GROUP BY 子句不能使用 SELECT 子句中定義的別名。

  (3)易錯:GROUP BY 子句的結果能排序嗎?

  【解答】它是隨機的。如果想排序,請使用 ORDER BY 子句。

  【總結】GROUP BY 子句結果的顯示是無序的。

  (4)易錯:在 WHERE 子句中使用聚合函數

易錯點3

  【總結】只有 SELECT 子句和 HAVING 子句(以及 ORDER BY 子句)中能夠使用聚合函數。

  

三、為聚合結果指定條件

  1.HAVING 子句

  WHERE 子句智能指定記錄(行)的條件,而不能用來指定組的條件。

  【備註】HAVING 是 HAVE(擁有)的現在分詞。

--語法:
--SELECT <列名1>, <列名2>, ...
--FROM <表名>
--GROUP BY <列名1>, <列名2>, ...
--HAVING <分組結果對應的條件>

  【書寫順序】SELECT --> FROM --> WHERE --> GROUP BY --> HAVING

SELECT shohin_bunrui, COUNT(*)
FROM dbo.Shohin
GROUP BY shohin_bunrui
HAVING COUNT(*) = 2

從通過商品種類進行聚合分組後的結果中,取出「包含數據的行數為 2 行」的數據

  2.HAVING 子句的構成要素

    (1)3 要素:

      ①常數

      ②聚合函數

      ③GROUP BY 子句中指定的列名(即聚合鍵)

易錯用法

  3.HAVING 與 WHERE

  有些條件可以寫在 HAVING 子句中,又可以寫在 WHERE 子句中。這些條件就是聚合鍵所對應的條件。

  

結果一樣

  【建議】雖然結果一樣,聚合鍵對應的條件應該寫在 WHERE 子句中,不是 HAVING 子句中。

  【理由】①WHERE 子句的執行速度比 HAVING 快。

      ②意義:WHERE 子句 = 指定行所對應的條件,HAVING 子句 = 指定組所對應的條件。

四、對查詢結果進行排序

  1.ORDER BY 子句

--語法:
--SELECT <列名1>, <列名2>, ...
--FROM <表名>
--ORDER BY <排序基準列1>, <排序基準列2>, ...

SELECT shohin_id, hanbai_tanka
FROM dbo.Shohin
ORDER BY hanbai_tanka; --升序排列

銷售單價由低到高(升序)

  排序鍵:ORDER BY 子句中書寫的列名。

  【書寫順序】SELECT --> FROM --> WHERE --> GROUP BY --> HAVING --> ORDER BY

  2.升序(ASC)和降序(DESC):

SELECT shohin_id, hanbai_tanka
FROM dbo.Shohin
ORDER BY hanbai_tanka DESC; --降序排列

  【備註】ORDER BY 子句中排列順序時會默認使用升序(ASC)進行排列。

  3.指定多個排序鍵

SELECT shohin_id, shohin_mei, hanbai_tanka, shiire_tanka
FROM dbo.Shohin
ORDER BY hanbai_tanka, shohin_id;

  4.NULL 值的順序:排序鍵中包含 NULL 時,會在開頭或末尾進行匯總。

  5.在排序鍵中使用 SELECT 子句中的別名

SELECT shohin_id AS id, shohin_mei, hanbai_tanka AS ht
FROM dbo.Shohin
ORDER BY ht, id;

  【執行順序】FROM --> WHERE --> GROUP BY --> HAVING --> SELECT --> ORDER BY

  【備註】ORDER BY 子句可以使用 SELECT 子句中定義的別名,GROUP BY 子句不能使用別名。

  6.ORDER BY 子句中使用聚合函數

SELECT shohin_bunrui, COUNT(*)
FROM dbo.Shohin
GROUP BY shohin_bunrui
ORDER BY COUNT(*);

  7.不建議使用列的編號進行排序,雖然可以

SELECT shohin_id ,
shohin_mei ,
shohin_bunrui ,
hanbai_tanka ,
shiire_tanka ,
torokubi
FROM dbo.Shohin
ORDER BY hanbai_tanka DESC, shohin_id;

SELECT shohin_id ,
shohin_mei ,
shohin_bunrui ,
hanbai_tanka ,
shiire_tanka ,
torokubi
FROM dbo.Shohin
ORDER BY 4 DESC, 1;  --這裡使用列的編號,由於閱讀不便,不推薦使用

結果是一樣的

  【備註】在 ORDER BY 子句中不要使用列的編號。

傳送門

  《SQL 基礎知識梳理(一) - 資料庫與 SQL》

  《SQL 基礎知識梳理(二) - 查詢基礎》

備註

  這裡採用 MS SQL Server 進行驗證,不保證所有的 DBMS 執行結果正確。

圖片和內容源自網絡分享,若有侵權,請聯繫刪除!

上海艾磊科技有限公司專門為企業提供IT諮詢,IT外包,系統集成,以及各類IT增值服務。其中增值服務包括OFFICE 365雲服務,鼎捷企業ERP管理軟體,雲備份,企業郵箱,無線覆蓋,上網行為管理,VPN架設,網絡安全服務,INTERNET接入,設備租賃, IP電話服務

相關焦點

  • 基礎SQL-DQL語句-條件查詢-排序-聚合函數-分組-limit語句
    基礎SQL-DQL語句-條件查詢-排序-聚合函數-分組-limit語句1.;asc(默認) : 升序   desc : 降序先根據欄位1排序,若有第二排序欄位,在第一排序欄位的基礎上進行第二次排序2.1 單列排序單列排序就是使用一個欄位排序具體操作:查詢所有數據,使用年齡降序排序
  • HiveSql基礎函數使用(三)
    從執行順序來說,兩者主要存在以下幾點區別 ① distinct只是將重複的行從結果中剔除出去;group by是按指定的列分組,一般這時在select中會用到聚合函數。 ②distinct是把不同的記錄顯示出來;group by是在查詢時先把紀錄按照類別分出來再查詢。
  • SQL Server資料庫基礎知識第四講:數據查詢(理論部分)
    SQL Server資料庫基礎知識:數據查詢我們前面學習了資料庫、數據表、數據的操作,那麼這一部分,將學習資料庫中最為重要的數據查詢。我們今天的內容主要講述以下查詢的知識:簡單查詢模糊查詢聚合函數查詢,如果要進行降序排序,在列名後需要加上desc關鍵字。
  • 如何用 SQL 的方式打開 Pandas?
    # 導入相關庫import numpy as npimport pandas as pdfrom pandasql import sqldf, load_meat, load_births基礎pandasql 中的主要函數是 sqldf,它接收兩個參數:一個SQL 查詢語句;一組會話/環境變量(locals() 或 globals
  • 適用於初學者和分析師的SQL –使用Python入門SQL
    它的結構使其可以輕鬆訪問和操縱存儲的數據。組織使用它來存儲決策過程可能需要的任何信息。與普通文件存儲系統相比,資料庫的主要優點在於,它在很大程度上減少了數據冗餘,促進了各種用戶之間的數據共享,並確保了對於組織而言極為重要的數據安全性。儘管存在各種類型的資料庫,並且它們的使用選擇因組織而異,但最基礎和使用最廣泛的是關係資料庫模型。
  • SQL超入門第五篇:寫給產品、運營、分析師的SQL教程之排序
    之前已經給大家分享四節教程了第一節:講了SQL中最簡單最基礎的檢索語句。第二節:我們對第一節中的檢查語句增加了過濾條件。第三節:我們講解了5個常用的聚合函數。第四節:SQL超入門第四篇:分組聚合今天我們來講排序,大家工作中可能經常要對一些數據的排序,比如查看近30天每日銷量就肯定要按順序進行比較,再比如查看對各城市的銷量進行排序,看看哪些城市排在前面,哪些排在後面。這些都是經常使用的。在Excel上排序,這個想必大家應該都熟悉。我這裡給個簡單Excel的例子。1.
  • Spark SQL重點知識總結
    (filename,org.apache.spark.sql.types.StringType,nullable = true))val schema=org.apache.spark.sql.types.StructType(filed)peopleRDD.map(_.split(",")).map(para=>org.apache.spark.sql.Row(para(0).trim,para
  • 調多了API,來聊一聊SQL - 碼農登陸
    一篇很基礎基礎的文章,算是查缺補漏。PS:我就是一個菜雞…希望各位看官輕噴。一、增刪改查的基本操作1.1、查詢中的子句平時資料庫用到最多的就是select語句:select…from…,一條把沒有過濾的數據無腦擺在你眼前語句。這裡就不聊它了,主要說一下兩個有過濾能力的查詢子句:Group by…having…和Order by…。
  • SparkSQL基礎及實戰練習
    5.查詢Score表中的最高分的學生學號和課程號。(子查詢或者排序)6.查詢每門課的平均成績。7.查詢Score表中至少有5名學生選修的並以3開頭的課程的平均分數。8.查詢分數大於70,小於90的Sno列。9.查詢所有學生的Sname、Cno和Degree列。10.查詢所有學生的Sno、Cname和Degree列。11.查詢所有學生的Sname、Cname和Degree列。
  • 產品經理學SQL(二)一天學會用SQL解決業務查詢問題
    本篇文章意在幫助大家系統地入門SQL,教大家如何解決sql查詢任務。前言回顧一下,上一篇文章我們已經知道了SQL語言的基本框架,並能完成簡單的單表查詢和雙表連接查詢。這篇文章希望能幫助你系統地入門SQL,從而解決產品經理80%的sql查詢任務。和上篇的一個小時入門SQL一樣,這篇文章的建議學習時間為一天。
  • PySpark SQL——SQL和pd.DataFrame的結合體
    例如Spark core中的RDD是最為核心的數據抽象,定位是替代傳統的MapReduce計算框架;SQL是基於RDD的一個新的組件,集成了關係型資料庫和數倉的主要功能,基本數據抽象是DataFrame,與pandas.DataFrame極為相近,適用於體量中等的數據查詢和處理。那麼,在已經有了RDD的基礎上,Spark為什麼還要推出SQL呢?
  • 開發者課程 | 資料庫知識-SQL基礎
    COMMIT;查詢表中部分行,此案例查找(崗位名稱=「銷售」或者崗位名稱=「人事」)並且工資>3000的全部數據SELECT * FROM emp e WHERE (e.JOB="銷售" OR e.JOB="人事") AND e.sal>3000;查找空值(空值使用IS NULL,非空值使用IS NOT NULL),此案例查找獎金為空全部數據
  • 女朋友都能看懂的,SQL優化乾貨
    :select * from teacher where INSTR(name,'老師')>0使用了in和not in,會全表掃描普通查詢:select * from teacher where=1來查詢,sql內部自動進行了類型轉換,不走索引order by條件與where條件不一致,order by無法使用索引排序select * from where A order by ageselect * from
  • SQL入門基礎知識詳解
    對於想走數據分析職業道路的小夥伴,不僅僅需要了解統計學的基本知識(參考《數據分析必備——統計學入門基礎知識》),Excel的基礎知識(參考《數據分析必備——Excel基礎知識》),也要學習一些資料庫和SQL的內容哦!SQL的全稱是Structured Query Language(結構化查詢語言),是一種古老而簡潔的程序設計語言。
  • 數據分析師-快速掌握SQL基礎
    max聚合函數和子查詢操作,通過這一次的聚合統計出每個用戶對應的最大的登錄時長。到此,以上為這道SQL題目的完整解答過程,整個過程涉及SQL的基礎操作(建表、查詢、限定、排序)的同時,也加入了聚合函數、子查詢和窗戶分析函數相對進階的操作。各用戶最長的連續登錄天數-這樣短短的12個字,翻譯成SQL語句居然用到了兩層嵌套查詢、兩個聚合操作、一個日期操作和一個窗口分析函數。
  • SQL基礎培訓--SQL語言基本概念及簡單查詢
    什麼是SQL語句,及簡單的寫法sql 語句是對資料庫進行操作的一種語言。結構化查詢語言(Structured Query Language)簡稱SQL,結構化查詢語言是一種資料庫查詢和程序設計語言,用於存取數據以及查詢、更新和管理關係資料庫系統。
  • hive sql 優化心得
    = b.col1) where a.col1 > 20and b.col2 > 40大部分人可能認為應該通過將 a.col1 > 20 and b.col2 > 40 放到a表和b表裡做子查詢,減少數據量輸入,這樣做沒有任何問題,但是上面這種寫法,通過謂詞下推優化器可以實現在讀取a表和b表的同時將不符合條件的數據過濾掉
  • Python+SQL無敵組合,值得你擁有!
    在正式講解代碼之前,先來科普一下資料庫相關的知識。資料庫是以一定方式儲存在一起、能與多個用戶共享、具有儘可能小的冗餘度、與應用程式彼此獨立的數據集合。>SUM():df = pd.read_sql("SELECT AVG(close_p) FROM 滬深300指數日線行情;", con=engine)print(df)          avg0  3659.63762聚合函數也可以和WHERE語句結合進行篩選:
  • SQL常用語句總結
    Moratuwa大學生物信息學研究員Vijini Mallawaarachchi總結了常用的SQL語句用法,可供參考和溫習。本文總結了常用的SQL語句,尤其適合在面試前複習你的SQL知識。你可以嘗試文中的例子,溫習下你很久以前在資料庫系統課程上學到的知識。為了演示每個命令的用法,我們將使用一個樣例資料庫。
  • SQL 學習筆記
    去年轉做分析師後,在工作上要用 SQL 的場景變多了,利用春節假期,結構化的梳理了 SQL知識,在此分享給有緣人。