讀SQL進階教程筆記13_SQL中的分組和層級

来源:https://www.cnblogs.com/lying7/archive/2023/04/21/17338506.html
-Advertisement-
Play Games

1. 數據分組 1.1. SQL的語句中具有分組功能的是GROUP BY和PARTITION BY 1.1.1. 兩者都有數學的理論基礎 1.1.2. 都可以根據指定的列為表分組 1.1.3. 區別僅僅在於,GROUP BY在分組之後會把每個分組聚合成一行數據 1.1.4. GROUP BY的作用是 ...


1. 數據分組

1.1. SQL的語句中具有分組功能的是GROUP BY和PARTITION BY

1.1.1. 兩者都有數學的理論基礎

1.1.2. 都可以根據指定的列為表分組

1.1.3. 區別僅僅在於,GROUP BY在分組之後會把每個分組聚合成一行數據

1.1.4. GROUP BY的作用是將一個個元素劃分成若幹個子集

1.2. 示例

1.2.1.

 SELECT member, team, age ,

          RANK() OVER(PARTITION BY team ORDER BY age DESC) rn,
          DENSE_RANK() OVER(PARTITION BY team ORDER BY age DESC) dense_rn,
          ROW_NUMBER() OVER(PARTITION BY team ORDER BY age DESC) row_num
      FROM Members
     ORDER BY team, rn;

1.3. 分割後的子集

1.3.1. 它們全都是非空集合

1.3.1.1. 還有一種只包含NULL的集合

1.3.2. 所有子集的並集等於劃分之前的集合

1.3.3. 任何兩個子集之間都沒有交集

1.3.4. 滿足以上3個性質的各子集稱為“類”(partition)

1.4. 類的概念(即partition)

1.4.1. 群論中有很多非常有趣的類,比如“剩餘類”

1.4.1.1. 通過對3取餘給自然數集合N分類後

1.4.1.1.1. “模3剩餘類”

1.4.1.2. 模在SQL中也有實現,就是取模函數MOD

1.4.1.2.1. --對從1到10的整數以3為模求剩餘類
    SELECT MOD(num, 3) AS modulo,
          num
      FROM Natural
     ORDER BY modulo, num;

1.4.1.3. --從原來的表中抽出(大約)五分之一行的數據

    SELECT *
      FROM SomeTbl
     WHERE MOD(seq, 5) = 0;
    --表中沒有連續編號的列時,使用ROW_NUMBER函數就可以了
    SELECT *
      FROM (SELECT col,
                  ROW_NUMBER() OVER(ORDER BY col) AS seq
              FROM SomeTbl)
     WHERE MOD(seq, 5) = 0;

1.4.2. 正因為抽象,才有了廣泛的應用

1.4.2.1. 數學理論並不是脫離實際的游戲,它其實隱藏了大量能夠用於日常工作的技巧

2. 層級

2.1. SQL的世界其實是層級分明的等級社會

2.2. 使用GROUP BY聚合之後,我們就不能引用原表中除聚合鍵之外的列

2.2.1. 這隻是SQL中的一種邏輯,是為了嚴格區分層級

2.3. GROUP BY中的階與元素和集合的區別有關,因此屬於集合論中的階

2.3.1. 對於EXISTS來說,層級的差別與EXISTS謂詞及其參數有關,因此屬於謂詞邏輯中的階

2.3.2. 使用GROUP BY聚合之後,SQL的操作對象便由0階的“行”變為了1階的“行的集合”

2.4. 標準SQL規定

2.4.1. 在對錶進行聚合查詢的時候,只能在SELECT子句中寫下麵3種內容

2.4.2. 通過GROUP BY子句指定的聚合鍵

2.4.3. 聚合函數(SUM、AVG等)

2.4.4. 常量

2.5. 示例

2.5.1. --以組為單位進行聚合查詢

    SELECT team, AVG(age)
      FROM Teams
     GROUP BY team;

2.5.1.1. 年齡只是每個人的屬性,而不是小組的屬性

2.5.1.2. 小組指的是由多個人組成的集合

2.5.1.2.1. 小組的屬性只能是平均或者總和等統計性質的屬性

2.5.2. --以組為單位進行聚合查詢?

    SELECT team, AVG(age), age
      FROM Teams
     GROUP BY team;

2.5.2.1. 違反了標準SQL的規定,因此不具有可移植性

2.5.2.2. MySQL資料庫支持這樣的查詢語句

2.5.2.3. 強行將適用於個體的屬性套用於團體之上,純粹是一種分類錯誤

2.5.3. --錯誤

    SELECT team, AVG(age), member
      FROM Teams
     GROUP BY team;

2.5.3.1. --正確

    SELECT team, AVG(age), MAX(member)
      FROM Teams
     GROUP BY team;

2.5.4. --小組中年齡最大的成員

SELECT team, MAX(age),
          (SELECT MAX(member)
              FROM Teams T2
            WHERE T2.team = T1.team
              AND T2.age = MAX(T1.age)) AS oldest
      FROM Teams T1
     GROUP BY team;

2.5.4.1. 子查詢中的WHERE子句里使用了MAX(T1.age)這樣的聚合函數作為條件

2.5.4.2. 這裡對外層的表T1也進行了聚合,這樣一來我們就可以在SELECT子句中通過聚合函數來引用“age”列了

2.5.4.3. 不能反過來在子查詢中直接引用“age”列

2.6. 單元素集合也是集合

2.6.1. 單元素集合和空集一樣,主要是為了保持理論的完整性而定義的

2.6.2. 元素a和集合{a}之間存在著非常醒目的層級差別

2.6.2.1. 這兩個層級的區別分別對應著SQL中的WHERE子句和HAVING子句的區別

2.6.2.2. WHERE子句用於處理“行”這種0階的對象

2.6.2.3. HAVING子句用來處理“集合”這種1階的對象


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

-Advertisement-
Play Games
更多相關文章
  • 引子 最近不知怎麼的,自從學了WebAPI(為什麼是這個,而不是MVC,還不是因為MVC的Razor語法比較難學,生態不如現有的Vue等框架,webapi很好的結合了前端生態)以後,使用別人的組件一帆風順,但是不知其意,突然很想自己實現一個基於的JWT認證服務,來好好瞭解一下這個內容。 起步 自從S ...
  • 由於當前社會人力成本越來越昂貴,機器取代人力是大勢所趨,自動化的發展也隨之越來越快 。當製造公司需 要一雙手和一對 眼睛的時候卻不得不雇佣一個人的苦惱日益加重,而傳統的機器設計和電氣自動化的發展,解決一雙手的問題已經漸漸得到了緩解,現在就到了需要解決一雙眼睛的時候,機器視覺的出現和廣泛應用也隨著到來 ...
  • 概述 C#是微軟開發的一種流行的編程語言,廣泛用於開發桌面,Web和移動應用程式。在每個新版本中,C# 都會帶來令人興奮的功能和改進,使其更強大、更具表現力和更高效。C# 的最新版本是2022年發佈的 C#11,它引入了一系列新功能,例如abstract 和 virtual 引入到靜態方法中、泛型 ...
  • 分散式緩存是由多個應用伺服器共用的緩存,通常作為訪問它的應用伺服器的外部服務進行維護。 分散式緩存可以提高 ASP.NET Core 應用的性能和可伸縮性,尤其是當應用由雲服務或伺服器場托管時。 與其他將緩存數據存儲在單個應用伺服器上的緩存方案相比,分散式緩存具有多個優勢。 當分發緩存數據時,數據: ...
  • 前言 創建一個簡單的字元設備驅動程式。 ​ 本文命令的運行基本上都需要root許可權,使用root賬號,或者在命令前面加上sudo。 ​ 如果你使用ssh遠程連接的伺服器進行代碼編寫。那麼不要在root用戶下創建文件或者文件夾。這會導致你ssh連接vscode編寫代碼的許可權問題。可以在普通用戶創建好所 ...
  • 如何編寫 Windows Server 的日誌篩選器,你需要先瞭解以下概念: 1、Windows Event Log:Windows Event Log 是 Windows Server 操作系統提供的一種記錄系統事件的機制,它可以記錄操作系統、應用程式、安全、系統和其他類型的事件。 2、Event ...
  • VMware17安裝Ubuntu22.04.2-Desktop詳細記錄 1. 前置準備 VMware軟體,這裡用的VMware17 Ubuntu系統鏡像文件(.iso文件) 官網下載:Ubuntu系統下載 | Ubuntu I Tell You舊版站點:MSDN, 我告訴你 - 做一個安靜的工具站 ...
  • Vim的6種基本模式 1. 普通模式在普通模式中,用的編輯器命令,比如移動游標,刪除文本等等。這也是Vim啟動後的預設模式。這正好和許多新用戶期待的操作方式相反(大多數編輯器預設模式為插入模式)。 2. 插入模式在這個模式中,大多數按鍵都會向文本緩衝中插入文本。大多數新用戶希望文本編輯器編輯過程中一 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...