讀SQL進階教程筆記09_HAVING上

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

1. HAVING子句的用法 1.1. 學習SQL時最大的阻礙就是我們已經習慣了的面向過程語言的思考方式(排序、迴圈、條件分支、賦值等) 1.2. 只有習慣了面向集合的思考方式,才能真正地學好它 1.3. 幫助我們順利地忘掉面向過程語言的思考方式並理解SQL面向集合特性的最為有效的方法 1.4. H ...


1. HAVING子句的用法

1.1. 學習SQL時最大的阻礙就是我們已經習慣了的面向過程語言的思考方式(排序、迴圈、條件分支、賦值等)

1.2. 只有習慣了面向集合的思考方式,才能真正地學好它

1.3. 幫助我們順利地忘掉面向過程語言的思考方式並理解SQL面向集合特性的最為有效的方法

1.4. HAVING子句的處理對象是集合而不是記錄

1.4.1. 如果一個實體對應著一行數據→那麼就是元素,所以使用WHERE子句

1.4.2. 如果一個實體對應著多行數據→那麼就是集合,所以使用HAVING子句

1.5. HAVING子句可以通過聚合函數(特別是極值函數)針對集合指定各種條件

1.5.1.

1.5.2. 如果通過CASE表達式生成特征函數,那麼無論多麼複雜的條件都可以描述

2. 點名

2.1. 示例

2.1.1.

2.1.1.1. -- 用謂詞表達全稱量化命題

    SELECT team_id, member
      FROM Teams T1
     WHERE NOT EXISTS
            (SELECT *
              FROM Teams T2
              WHERE T1.team_id = T2.team_id
                AND status <>’待命’);
2.1.1.1.1. “所有隊員都處於待命狀態”=“不存在不處於待命狀態的隊員”
2.1.1.1.2. 查詢性能很好
2.1.1.1.3. 結果中能體現出隊員信息

2.1.1.2. -- 用集合表達全稱量化命題(1)

    SELECT team_id
      FROM Teams
     GROUP BY team_id
    HAVING COUNT(*) = SUM(CASE WHEN status =’待命’
                              THEN 1
                              ELSE 0 END);
2.1.1.2.1. 代碼很簡潔
2.1.1.2.2. 使用的是特征函數的方法

2.1.1.3. -- 用集合表達全稱量化命題(2)

    SELECT team_id
      FROM Teams
     GROUP BY team_id
    HAVING MAX(status) =’待命’
      AND MIN(status) =’待命’;
2.1.1.3.1. 性能更好
2.1.1.3.1.1. 極值函數可以使用參數欄位的索引
2.1.1.3.2. 如果元素最大值和最小值相等,那麼這個集合中肯定只有一種值

2.1.1.4. -- 列表顯示各個隊伍是否所有隊員都在待命

    SELECT team_id,
          CASE WHEN MAX(status) =’待命’AND MIN(status) =’待命’
                THEN ’全都在待命’
                ELSE’隊長!人手不夠’END AS status
      FROM Teams
     GROUP BY team_id;
2.1.1.4.1. 條件移到SELECT子句後,查詢可能就不會被資料庫優化了

3. 單重集合

3.1. 示例

3.1.1.

3.1.1.1. -- 選中材料存在重覆的生產地

    SELECT center
      FROM Materials
     GROUP BY center
    HAVING COUNT(material) <> COUNT(DISTINCT material);
3.1.1.1.1.
 SELECT center,
          CASE WHEN COUNT(material) <> COUNT(DISTINCT material) THEN’存在重覆’
              ELSE’不存在重覆’END AS status
      FROM Materials
     GROUP BY center;

3.1.1.2. --存在重覆的集合:使用EXISTS

    SELECT center, material
      FROM Materials M1
     WHERE EXISTS
            (SELECT *
              FROM Materials M2
              WHERE M1.center = M2.center
                AND M1.receive_date <> M2.receive_date
                AND M1.material = M2.material);

3.2. 在數學中,通過GROUP BY生成的子集有一個對應的名字,叫作劃分(partition)

3.2.1. 集合論和群論中的重要概念,指的是將某個集合按照某種規則進行分割後得到的子集

3.2.2. 這些子集相互之間沒有重覆的元素,而且它們的並集就是原來的集合

4. 尋找缺失的編號:升級版

4.1. 示例

4.1.1. -- 如果有查詢結果,說明存在缺失的編號

    SELECT’存在缺失的編號’AS gap
      FROM SeqTbl
    HAVING COUNT(*) <> MAX(seq);

4.1.1.1. 有一個前提條件,即數列的起始值必須是1

4.1.2. -- 如果有查詢結果,說明存在缺失的編號:只調查數列的連續性

    SELECT’存在缺失的編號’  AS gap
      FROM SeqTbl
    HAVING COUNT(*) <> MAX(seq) - MIN(seq) + 1 ;

4.1.3. -- 不論是否存在缺失的編號都返回一行結果

    SELECT CASE WHEN COUNT(*) = 0
                THEN ’表為空’
                WHEN COUNT(*) <> MAX(seq) - MIN(seq) + 1
                THEN ’存在缺失的編號’
                ELSE’連續’END AS gap
      FROM SeqTbl;

4.1.4. -- 查找最小的缺失編號:表中沒有1時返回1

    SELECT CASE WHEN COUNT(*) = 0 OR MIN(seq) > 1  -- 最小值不是1時→返回1
              THEN 1
                ELSE (SELECT MIN(seq +1)           -- 最小值是1時→返回最小的缺失編號
                        FROM SeqTbl S1
                      WHERE NOT EXISTS
                          (SELECT *
                              FROM SeqTbl S2
                            WHERE S2.seq = S1.seq + 1))  END
        FROM SeqTbl;

5. 為集合設置詳細的條件

5.1. 示例

5.1.1.

5.1.1.1. 查詢出75%以上的學生分數都在80分以上的班級

5.1.1.1.1.
SELECT class
      FROM TestResults
  GROUP BY class
    HAVING COUNT(*) * 0.75
          <= SUM(CASE WHEN score >= 80
                      THEN 1
                      ELSE 0 END) ;

5.1.1.2. 查詢出分數在50分以上的男生的人數比分數在50分以上的女生的人數多的班級

5.1.1.2.1.
SELECT class
      FROM TestResults
  GROUP BY class
    HAVING SUM(CASE WHEN score >= 50 AND sex =’男’
                    THEN 1
                    ELSE 0 END)
        > SUM(CASE WHEN score >= 50 AND sex =’女’
                    THEN 1
                    ELSE 0 END) ;

5.1.1.3. 查詢出女生平均分比男生平均分高的班級

5.1.1.3.1. -- 比較男生和女生平均分的SQL語句(1):對空集使用AVG後返回0
      SELECT class
        FROM TestResults
    GROUP BY class
      HAVING AVG(CASE WHEN sex =’男’
                      THEN score
                      ELSE 0 END)
          < AVG(CASE WHEN sex =’女’
                      THEN score
                      ELSE 0 END) ;
5.1.1.3.2. -- 比較男生和女生平均分的SQL語句(2):對空集求平均值後返回NULL
      SELECT class
        FROM TestResults
    GROUP BY class
      HAVING AVG(CASE WHEN sex =’男’
                      THEN score
                      ELSE NULL END)
          < AVG(CASE WHEN sex =’女’
                      THEN score
                      ELSE NULL END) ;
5.1.1.3.2.1. 根據標準SQL的定義,對空集使用AVG函數時,結果會返回NULL

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

-Advertisement-
Play Games
更多相關文章
  • 經常會聽到開發者提起單元測試的話題,那麼今天我就帶大伙一起來看看大名鼎鼎的谷歌 C++ 測試框架 GoogleTest。這是系列文章的第二篇。 ...
  • 切片 ​ Go語言切片是一種建立在數組類型之上的抽象,它構建在數組之上並且提供更強大的能力和便捷。解決了數組長度不可變等缺陷 聲明切片 ​ 切片的數據結構非常小,只有三個欄位:指向底層數組的指針,切片長度,切片容量。切片長度是指切片的真實長度,切片容量是指切片可擴展的最大長度,一般來講切片長度要小於 ...
  • 這節講述網路通訊服務端的實現,其開發思想、原則與客戶端的類似,即組合封裝、線程運行時類,面向介面編程等等。源碼面前,了無秘密,我直接以類代碼給大家展示,包含SNetServer類、SNetServerRunning類、INetServerHandler等類。 ...
  • 數組 ​ 數組是具有相同唯一類型的一組已編號且長度固定的數據項序列(這是一種同構的數據結構);這種類型可以是任意的原始類型例如整形、字元串或者自定義類型(結構體、介面)。數組長度也是數組類型的一部分,所以[5]int和[10]int是屬於不同類型的。 :star::在其他語言中數組大多是引用類型,但 ...
  • 前言 一、人物簡介 第一位閃亮登場,有請今後會一直教我們C語言的老師 —— 自在。 第二位上場的是和我們一起學習的小白程式猿 —— 逍遙。 二、構成和表示方式 關係運算符的作用是判斷符號兩邊大小的關係 C語言中的關係運算符主要有六個,如下表所示 | 運算符 | 名稱 | 示例 | 描述 | | : ...
  • 大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是利用i.MXRT1xxx系列ROM集成的DCD功能可輕鬆配置指定外設。 關於 i.MXRT1xxx 系列晶元 BootROM 中集成的 DCD 功能這個話題,痞子衡早就想寫了,但是一直沒有動筆,畢竟這個話題比較生澀,單獨講會比較枯燥。最 ...
  • 在安裝Mac電腦應用程式的時候,經常會遇到“xxx.app已損壞,打不開。您應該將它移到廢紙簍“或”打不開的xxx.app,因為它來自身份不明的開發者”,如圖: 遇到上述情況是不是真的要移動到廢紙簍呢?下麵小編就為您帶來Mac應用程式無法打開提示不明開發者或文件損壞的處理方法,解答Mac應用程式無法 ...
  • 作者:袁首京 原創文章,轉載時請保留此聲明,並給出原文連接。 技術人員多數又呆板又花心不長久。我知道你可能已經厭倦了 Docker,但是系統還沒有複雜到需要高攀 K8S 的地步。那我建議您,有空的話可以約一下 Podman。 Podman 使用起來是足夠簡單的,直接把它當做改了名字的 Docker ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...