MySQL必知必會--分 組 數 據

来源:https://www.cnblogs.com/ygjzs/archive/2020/01/23/12230270.html
-Advertisement-
Play Games

數據分組 目前為止的所有計算都是在表的所有數據或匹配特定的 WHERE 子句的 數據上進行的。提示一下,下麵的例子返回供應商 1003 提供的產品數目 但如果要返回每個供應商提供的產品數目怎麼辦?或者返回只提供 單項產品的供應商所提供的產品,或返回提供10個以上產品的供應商怎 麽辦? 這就是分組顯身 ...


數據分組

目前為止的所有計算都是在表的所有數據或匹配特定的 WHERE 子句的
數據上進行的。提示一下,下麵的例子返回供應商 1003 提供的產品數目

但如果要返回每個供應商提供的產品數目怎麼辦?或者返回只提供
單項產品的供應商所提供的產品,或返回提供10個以上產品的供應商怎
麽辦?
這就是分組顯身手的時候了。分組允許把數據分為多個邏輯組,以
便能對每個組進行聚集計算

創建分組

分組是在 SELECT 語句的 GROUP BY 子句中建立的。理解分組的最好辦
法是看一個例子


上面的 SELECT 語句指定了兩個列, vend_id 包含產品供應商的ID,
num_prods 為計算欄位(用 COUNT(*) 函數建立)。 GROUP BY 子句指
示MySQL按 vend_id 排序並分組數據。這導致對每個 vend_id 而不是整個表
計算 num_prods 一次。從輸出中可以看到,供應商 1001 有 3 個產品,供應商
1002 有 2 個產品,供應商 1003 有 7 個產品,而供應商 1005 有 2 個產品

因為使用了 GROUP BY ,就不必指定要計算和估值的每個組了。系統
會自動完成。 GROUP BY 子句指示MySQL分組數據,然後對每個組而不是
整個結果集進行聚集

在具體使用 GROUP BY 子句前,需要知道一些重要的規定。

  • GROUP BY 子句可以包含任意數目的列。這使得能對分組進行嵌套,
    為數據分組提供更細緻的控制。
  • 如果在 GROUP BY 子句中嵌套了分組,數據將在最後規定的分組上
    進行彙總。換句話說,在建立分組時,指定的所有列都一起計算
    (所以不能從個別的列取回數據)。
  • GROUP BY 子句中列出的每個列都必須是檢索列或有效的表達式
    (但不能是聚集函數)。如果在 SELECT 中使用表達式,則必須在
    GROUP BY 子句中指定相同的表達式。不能使用別名。
  • 除聚集計算語句外, SELECT 語句中的每個列都必須在 GROUP BY 子
    句中給出。
  • 如果分組列中具有 NULL 值,則 NULL 將作為一個分組返回。如果列
    中有多行 NULL 值,它們將分為一組。
  • GROUP BY 子句必須出現在 WHERE 子句之後, ORDER BY 子句之前。

使用 ROLLUP 使用 WITH ROLLUP 關鍵字,可以得到每個分組以
及每個分組彙總級別(針對每個分組)的值,如下所示

過濾分組

除了能用 GROUP BY 分組數據外,MySQL還允許過濾分組,規定包括
哪些分組,排除哪些分組。例如,可能想要列出至少有兩個訂單的所有
顧客。為得出這種數據,必須基於完整的分組而不是個別的行進行過濾

HAVING 非常類似於 WHERE 。事實上,目前為止所
學過的所有類型的 WHERE 子句都可以用 HAVING 來替代。唯一的差別是
WHERE 過濾行,而 HAVING 過濾分組

HAVING 支持所有 WHERE 操作符 在第6章和第7章中,我們學習
了 WHERE 子句的條件(包括通配符條件和帶多個操作符的子
句)。所學過的有關 WHERE 的所有這些技術和選項都適用於
HAVING 。它們的句法是相同的,只是關鍵字有差別

這條 SELECT 語句的前3行類似於上面的語句。最後一行增加了
HAVING 子句,它過濾 COUNT(*) >=2 (兩個以上的訂單)的那些
分組。
正如所見,這裡 WHERE 子句不起作用,因為過濾是基於分組聚集值而
不是特定行值的

HAVING 和 WHERE 的差別 這裡有另一種理解方法, WHERE 在數據
分組前進行過濾, HAVING 在數據分組後進行過濾。這是一個重
要的區別, WHERE 排除的行不包括在分組中。這可能會改變計
算值,從而影響 HAVING 子句中基於這些值過濾掉的分組

那麼,有沒有在一條語句中同時使用 WHERE 和 HAVING 子句的需要呢?
事實上,確實有。假如想進一步過濾上面的語句,使它返回過去12個月
內具有兩個以上訂單的顧客。為達到這一點,可增加一條 WHERE 子句,過
濾出過去12個月內下過的訂單。然後再增加 HAVING 子句過濾出具有兩個
以上訂單的分組
為更好地理解,請看下麵的例子,它列出具有 2 個(含)以上、價格
為 10 (含)以上的產品的供應商

分組和排序

雖然 GROUP BY 和 ORDER BY 經常完成相同的工作,但它們是非常不同
的。表13-1彙總了它們之間的差別

表13-1中列出的第一項差別極為重要。我們經常發現用 GROUP BY 分
組的數據確實是以分組順序輸出的。但情況並不總是這樣,它並不是SQL
規範所要求的。此外,用戶也可能會要求以不同於分組的順序排序。僅
因為你以某種方式分組數據(獲得特定的分組聚集值),並不表示你需要
以相同的方式排序輸出。應該提供明確的 ORDER BY 子句,即使其效果等
同於 GROUP BY 子句也是如此

不要忘記 ORDER BY 一般在使用 GROUP BY 子句時,應該也給
出 ORDER BY 子句。這是保證數據正確排序的唯一方法。千萬
不要僅依賴 GROUP BY 排序數據

檢索總計訂單價格大於等於 50 的訂
單的訂單號和總計訂單價格

SELECT子句順序

下麵回顧一下 SELECT 語句中子句的順序。表13-2以在 SELECT 語句中
使用時必須遵循的次序,列出迄今為止所學過的子句

我們學習瞭如何用SQL聚集函數對數據進行彙總計算。
本章講授瞭如何使用 GROUP BY 子句對數據組進行這些彙總計算,返回每
個組的結果。我們看到瞭如何使用 HAVING 子句過濾特定的組,還知道了
ORDER BY 和 GROUP BY 之間以及 WHERE 和 HAVING 之間的差異。


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

-Advertisement-
Play Games
更多相關文章
  • 本隨筆中記載了博主在學習Python的變數與輸出時,不太熟悉的內容。 ...
  • 將自己定義的方法,變數存放在文件中,為一些腳本或者互動式的解釋器實例使用,這個文件稱為模塊。 細說的話,模塊可以分為四個通用類別: 1 使用python編寫的.py文件(自定義模塊) 2 已被編譯為共用庫或DLL的C或C++擴展 3 把一系列模塊組織到一起的文件夾(註:文件夾下有一個__init__ ...
  • MyBatis Generator(MBG)的使用 MBG可以根據數據表生成對應的model、xml映射文件、mapper介面,只是簡單的生成,還需要根據需求修改。 1、下載jar包 https://github.com/mybatis/generator/releases 解壓後有3個jar包,只 ...
  • AddControllers/AddMvc方法允許添加自定義ActionFilterAttribute進行過濾 文檔中這麼定義Filter: 可以創建自定義篩選器,用於處理橫切關註點。 橫切關註點的示例包括錯誤處理、緩存、配置、授權和日誌記錄。 篩選器可以避免複製代碼。 例如,錯誤處理異常篩選器可以 ...
  • Newtonsoft.Json與System.Text.Json區別 在 Newtonsoft.Json中可以使用例如 方式設置接收/序列化時間格式,但在.net core 3.1中System.Text.Json是沒有自帶方式進行轉換,這就需要自定義Converter實現時間轉換 "官方GitHu ...
  • 今天在Ubuntu伺服器上安裝supervisor,部署沒成功想卸載重來,sudo apt-get remove supervisor 後發現配置文件還在,便手動刪除了配置文件。再次安裝,提示配置文件不存在,WTF!配置文件不該你軟體給我創建嗎?我想。 查閱資料才知,還有 apt-get purge ...
  • (1)、開機進入系統前,按F8,進入Windows 10的高級啟動選項,選擇“修複電腦”。 (2)、選擇鍵盤輸入方法。 (3)、如果有管理員密碼,需要輸入;如果沒有設置密碼,直接“確定”即可。 (4)、進入系統恢覆選項後,選擇“Dell DataSafe 還原和緊急備份”。 (5)、選擇“選擇其他 ...
  • 子查詢 版本要求 MySQL 4.1引入了對子查詢的支持,所以要想使用 本章描述的SQL,必須使用MySQL 4.1或更高級的版本。 SELECT語句 是SQL的查詢。迄今為止我們所看到的所有 SELECT 語句 都是簡單查詢,即從單個資料庫表中檢索數據的單條語句。 查詢(query) 任何SQL語 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...