讀SQL進階教程筆記07_EXISTS謂詞

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

1. 特點 1.1. 將多行數據作為整體來表達高級的條件 1.2. 使用關聯子查詢時性能仍然非常好 1.3. EXISTS的參數不像是單一值 1.3.1. 參數是行數據的集合 2. 什麼是謂詞 2.1. 一種特殊的函數,返回值是真值 2.2. 返回值都是true、false或者unknown 2.2 ...


1. 特點

1.1. 將多行數據作為整體來表達高級的條件

1.2. 使用關聯子查詢時性能仍然非常好

1.3. EXISTS的參數不像是單一值

1.3.1. 參數是行數據的集合

2. 什麼是謂詞

2.1. 一種特殊的函數,返回值是真值

2.2. 返回值都是true、false或者unknown

2.2.1. 一般的謂詞邏輯里沒有unknown

2.2.2. SQL採用的是三值邏輯,因此具有三種真值

2.3. 謂詞邏輯提供謂詞是為了判斷命題(可以理解成陳述句)的真假

2.3.1. 為命題分析提供了函數式的方法

2.4. 只有能讓WHERE子句的返回值為真的命題,才能從表(命題的集合)中查詢到

3. 謂詞的階

3.1. 階(order)是用來區分集合或謂詞的階數的概念

3.2. 一階謂詞

3.2.1. =或者BETWEEEN等輸入值為一行的謂詞

3.3. 二階謂詞

3.3.1. EXISTS這樣輸入值為行的集合的謂詞

3.3.2. 謂詞也是函數的一種,因此我們也可以說EXISTS是高階函數

3.4. 三階謂詞

3.4.1. 輸入值為“集合的集合”的謂詞

3.5. 四階謂詞

3.5.1. 輸入值為“集合的集合的集合”的謂詞

3.6. SQL里並不會出現三階以上的情況

4. SELECT子句的列表

4.1. 通配符:SELECT *

4.2. 常量:SELECT ‘這裡的內容任意’

4.3. 列名:SELECT col

5. 全稱量化和存在量化

5.1. 形式語言沒必要同時顯式地支持EXISTS和FORALL兩者

5.1.1. 因為全稱量詞和存在量詞只要定義了一個,另一個就可以被推導出來

5.1.2. ∀ xPx = ¬ ∃ x¬P

5.1.3. 所有的x都滿足條件P=不存在不滿足條件P的x

5.1.4. ∃ xPx = ¬ ∀ x¬Px

5.1.5. 存在x滿足條件P=並非所有的x都不滿足條件P

5.2. SQL支持EXISTS,不支持FORALL

5.2.1. SQL中沒有與全稱量詞相當的謂詞,可以使用NOT EXISTS代替

5.3. 全稱量詞

5.3.1. 所有的x都滿足條件P

5.4. 存在量詞

5.4.1. 存在(至少一個)滿足條件P的x

6. 查詢表中“不”存在的數據

6.1. 示例

6.1.1.

6.1.1.1.

 SELECT DISTINCT M1.meeting, M2.person
      FROM Meetings M1 CROSS JOIN Meetings M2;

6.1.1.2. 所有人都參加了全部會議時

6.1.1.3. --求出缺席者的SQL語句(1):存在量化的應用

    SELECT DISTINCT M1.meeting, M2.person
      FROM Meetings M1 CROSS JOIN Meetings M2
     WHERE NOT EXISTS
          (SELECT *
              FROM Meetings M3
            WHERE M1.meeting = M3.meeting
              AND M2.person = M3.person);
6.1.1.3.1. ----求出缺席者的SQL語句(2):使用差集運算
    SELECT M1.meeting, M2.person
      FROM Meetings M1, Meetings M2
    EXCEPT
    SELECT meeting, person
      FROM Meetings;
6.1.1.3.2. NOT EXISTS直接具備了差集運算的功能

7. “肯定⇔雙重否定”之間的轉換

7.1. 示例

7.1.1.

7.1.2. 所有科目分數都在50分以上

7.1.2.1. 沒有一個科目分數不滿50分

7.1.3.

SELECT DISTINCT student_id
      FROM TestScores TS1
     WHERE NOT EXISTS                --不存在滿足以下條件的行
            (SELECT *
              FROM TestScores TS2
              WHERE TS2.student_id = TS1.student_id
                AND TS2.score < 50);    --分數不滿50分的科目

7.1.4. 某個學生的所有行數據中,如果科目是數學,則分數在80分以上;如果科目是語文,則分數在50分以上。

7.1.4.1.

SELECT DISTINCT student_id
      FROM TestScores TS1
     WHERE subject IN (’數學’, ’語文’)
      AND NOT EXISTS
            (SELECT *
              FROM TestScores TS2
              WHERE TS2.student_id = TS1.student_id
                AND 1 = CASE WHEN subject =’數學’AND score < 80 THEN 1
                            WHEN subject =’語文’AND score < 50 THEN 1
                            ELSE 0 END);
7.1.4.1.1.
SELECT student_id

      FROM TestScores TS1
     WHERE subject IN (’數學’, ’語文’)
      AND NOT EXISTS
            (SELECT *
              FROM TestScores TS2
              WHERE TS2.student_id = TS1.student_id
                AND 1 = CASE WHEN subject =’數學’AND score < 80 THEN 1
                            WHEN subject =’語文’AND score < 50 THEN 1
                            ELSE 0 END)
     GROUP BY student_id
    HAVING COUNT(*) = 2;   --必須兩門科目都有分數
7.1.4.1.2. EXISTS和HAVING有一個地方很像,即都是以集合而不是個體為單位來操作數據

8. 集合VS謂詞

8.1. 示例

8.1.1.

8.1.2. 查詢出哪些項目已經完成到了工程1

8.1.2.1. --查詢完成到了工程1的項目:面向集合的解法

    SELECT project_id
      FROM Projects
     GROUP BY project_id
    HAVING COUNT(*) = SUM(CASE WHEN step_nbr <= 1 AND status =’完成’THEN 1
                            WHEN step_nbr  > 1 AND status =’等待’THEN 1
                            ELSE 0 END);
8.1.2.1.1. --查詢完成到了工程1的項目:謂詞邏輯的解法
    SELECT *
      FROM Projects P1
     WHERE NOT EXISTS
          (SELECT status
            FROM Projects P2
            WHERE P1.project_id = P2. project_id      --以項目為單位進行條件判斷
              AND status <> CASE WHEN step_nbr <= 1   --使用雙重否定來表達全稱量化命題
                              THEN ’完成’
                              ELSE ’等待’ END);
8.1.2.1.1.1. 性能好。只要有一行滿足條件,查詢就會終止
8.1.2.1.1.2. 結果里能包含的信息量更大

9. 對列進行量化

9.1. 示例::查詢全是1的行

9.1.1. --“列方向”的全稱量化:不優雅的解答

    SELECT *
      FROM ArrayTbl
     WHERE col1 = 1
      AND col2 = 1
          ·
          ·
          ·
      AND col10 = 1;

9.1.1.1. --“列方向”的全稱量化:優雅的解答

    SELECT *
      FROM ArrayTbl
     WHERE 1 = ALL (col1, col2, col3, col4, col5, col6, col7, col8, col9, col10);

9.2. 示例:至少有一個9

9.2.1. --列方向的存在量化(1)

    SELECT *
      FROM ArrayTbl
     WHERE 9 = ANY (col1, col2, col3, col4, col5, col6, col7, col8, col9, col10);

9.2.1.1. --列方向的存在量化(2)

    SELECT *
      FROM ArrayTbl
     WHERE 9 IN (col1, col2, col3, col4, col5, col6, col7, col8, col9, col10);
9.2.1.1.1. 這種寫法也是被允許的
9.2.1.1.2. 如果左邊不是具體值而是NULL,這種寫法就不行了

9.2.2. --查詢全是NULL的行:錯誤的解法

    SELECT *
      FROM ArrayTbl
     WHERE NULL = ALL (col1, col2, col3, col4, col5, col6, col7, col8, col9, col10);

9.2.2.1. --查詢全是NULL的行:正確的解法

    SELECT *
      FROM ArrayTbl
     WHERE COALESCE(col1, col2, col3, col4, col5, col6, col7, col8, col9, col10) IS NULL;

10. C.J. Date曾經這樣調侃過:資料庫這種叫法有點名不副實,它存儲的與其說是數據,還不如說是命題


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

-Advertisement-
Play Games
更多相關文章
  • 一 》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》 下載nacos https://github.com/alibaba/nacos nacos-server-2.0.3.zip Windows 版 解壓後,資料庫新建nacos庫,將 X:\nacos\ ...
  • 本文主要介紹在 Tomcat 集群中如何進行 Session 複製,文中所使用到的軟體版本:Centos 7.9.2009、Java 1.8.0_321、Tomcat 8.5.87。 1、快速配置 取消 conf/server.xml 文件中的以下註釋來啟用集群: <Cluster classNam ...
  • 作者最近嘗試寫了一些Rust代碼,本文主要講述了對Rust的看法和Rust與C++的一些區別。 背景 S2在推進團隊代碼規範時,先後學習了盤古編程規範,CPP core guidelines,進而瞭解到clang-tidy,以及Google Chrome 在安全方面的探索。 C++是一個威力非常強大 ...
  • 本文從概念上介紹 Java 虛擬機記憶體的各個區域,講解這些區域的作用、服務對象以及其中可能產生的問題。 Java 虛擬機在執行 Java 程式的過程中會把它所管理的記憶體劃分為若幹個不同的數據區域。這些區域有各自的用途,以及創建和銷毀的時間,有些區域隨著虛擬機進程的啟動而一直存在,有些區域則是依賴用戶 ...
  • 簡單記錄一下對AOP的認識,正文為3個部分 一、AOP由來 二、用DispatchProxy動態代理實現AOP 三、通過特性標記,處理多種不同執行前、執行後的邏輯編排 一、AOP 由來 IUserHelper userHelper = new CommonUserHelper(); // commo ...
  • 案例現象 這天收到監控平臺發來的告警,說有台機器程式崩潰了 因為以前也有過相關的錯誤,根據經驗,用 dmesg命令看下內核信息 發現有點不對勁,報錯信息的時間跟告警時間不一致,正常來講報錯時間應該跟告警時間一致 使用 date 命令查看一下當前系統時間 然後我們查看一下系統日誌 由上面的輸出可以看到 ...
  • Neovim 風評很好,我機器上其實早裝了它來替代 vim。只不過這兩年用 vscode 較多,冷落了它,除了偶爾改改配置文件,很少用。難得大過年的有點兒空,就來倒騰它一下子,最終效果如下。 基礎配置 從 0.5 版開始,Neovim 允許使用 Lua 代替 VimL 作為配置語言,所以這裡也直接從 ...
  • win10計劃任務程式庫可以實現按照規則頻率執行腳本的功能。現在將設置方法記錄如下: 創建任務步驟 1、右鍵點擊我的電腦,選擇管理,依次點擊:系統工具-》任務計劃程式-》任務計劃程式庫。 2、點擊最右側操作中的創建基本任務,打開下麵的彈窗。 3、創建任務的基本信息,下一步選擇任務執行的頻率和開始時間 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...