[SQL] SQL 基礎知識梳理(三) - 聚合和排序

来源:http://www.cnblogs.com/liqingwen/archive/2016/10/09/5926689.html
-Advertisement-
Play Games

SQL 基礎知識梳理(三) - 聚合和排序 【博主】反骨仔 【原文】http://www.cnblogs.com/liqingwen/p/5926689.html 序 這是《SQL 基礎知識梳理(二) - 查詢基礎》的下篇。 目錄 對錶進行聚合查詢 對錶進行分組 為聚合結果指定條件 對查詢結果進行排 ...


SQL 基礎知識梳理(三) - 聚合和排序

【博主】反骨仔    【原文】http://www.cnblogs.com/liqingwen/p/5926689.html

 

 

  這是《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 執行結果正確。

 



【參考】《SQL ゼロからはじめるデータベース操作》

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 寫在前面的故事 首先,給看官們講個故事:最近遇到過一個客戶,系統上線三年變的越來越慢,直到前幾個月全面爆發,系統前端使用人員不斷抱怨,甚至已經達到了不能使用的程度。這個時候他們的IT主管也是決策者無法忍受這種情況,就召集下麵的運維開會,詢問情況。 領導:現在系統這麼慢,前端都無法使用了,到底什麼情況 ...
  • DECLARE @Price TABLE ( [SOLDTO] [nvarchar](80) NULL , [COUNTRY] [nvarchar](80) NULL , [SALESORG] [nvarchar](80) NULL , [COMPANYCODE] [nvarchar](80) NU ...
  • Hbase安裝模式介紹 單機模式 1> Hbase不使用HDFS,僅使用本地文件系統 2> ZooKeeper與Hbase運行在同一個JVM中 分散式模式– 偽分散式模式1> 所有進程運行在同一個節點上,不同進程運行在不同的JVM當中2> 比較適合實驗測試– 完全分散式模式1> 進程運行在多個伺服器 ...
  • Spark調度管理(讀書筆記) 轉載請註明出處: "http://www.cnblogs.com/BYRans/" Spark調度管理 本文主要介紹在單個任務內Spark的調度管理,Spark調度相關概念如下: Task(任務):單個分區數據及上的最小處理流程單元。 TaskSet(任務集):由一組 ...
  • 目錄: 圖形示例 圖形參數 符號、線條 顏色 文本屬性 尺寸與邊界 自定義標題 自定義坐標軸 圖例 文本標註 圖形組合 圖形示例 如下代碼描述病人對兩種藥物五個劑量水平上的響應情況 > mydata <- data.frame(dose=numeric(0),drugA=numeric(0),dru ...
  • 目錄: 文本輸出 圖形輸出 數據輸入 數據框輸出 文本導入 Excel導入 文本輸出 語法: sink(file = NULL, append = FALSE, type = c("output", "message"), split = FALSE) 示例代碼: setwd("E:\\R") si ...
  • 一個企業要想保持長遠的發展,在市場中成為一個強有力的生命個體,必然要註重企業組織之間的協調、合作關係,與環境協同進化,也就是所謂的企業生態系統。而企業信息化或數據化作為管理的重要支撐,是這生態系統中的關鍵一環。 ...
  • 一、一對一關係: 一、一對一關係: 定義:有兩個表,在第一個表中的某一行只與第二個表中的一行相關,同時第二個表中的某一行,也只與第一個表中的一行相關,我們稱這兩個表為一對一關係。 例如: 第一張表: ID 姓名 國籍 貢獻 1001 王大錘 中國 萬萬沒想到 1002 吉澤明步 日本 動作藝術片 1 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...