選讀SQL經典實例筆記22_2版增補

来源:https://www.cnblogs.com/lying7/archive/2023/08/11/17619180.html
-Advertisement-
Play Games

![](https://img2023.cnblogs.com/blog/3076680/202308/3076680-20230809235422409-1190410594.png) # 1. 2版DB版本 ## 1.1. DB2 11.5 ## 1.2. Oracle 19c ## 1.3.  ...


1. 2版DB版本

1.1. DB2 11.5

1.2. Oracle 19c

1.3. PostgreSQL 12

1.4. MySQL 8.0

1.5. SQL Server 2017

2. 子查詢

2.1. 如果想創建虛擬表,以便對其執行包含視窗函數或聚合函數的查詢,那麼最簡單的做法無疑是使用子查詢

2.2. 只需編寫一個查詢並將其放在括弧內,然後再編寫另一個使用它的查詢

2.3. 有些 RDBMS 要求給子查詢表指定別名,有些則不要求這樣做

2.3.1. Oracle 不要求

2.4. 示例

2.4.1. sql

select max(HeadCount) as HighestJobHeadCount from
(select job,count(empno) as HeadCount
from emp
group by job) head_count_tab

3. 通用表表達式

3.1. 為了剋服子查詢的一些局限性,引入了 CTE

3.1.1. 讓 SQL 支持遞歸

3.2. CTE 的可讀性更高

3.2.1. sql

with head_count_tab (job,HeadCount) as
(select job,count(empno)
from emp
group by job)
select max(HeadCount) as HighestJobHeadCount
from head_count_tab

3.3. 遞歸 CTE 來計算前 20 個斐波那契數

3.3.1. sql

with recursive workingTable (fibNum, NextNumber, index1)
as
(select 0,1,1
union all
select fibNum+nextNumber,fibNUm,index1+1
from anchor
where index1<20)
select fibNum from workingTable as fib

3.3.2. 關鍵字 RECURSIVE,它在 MySQL、Oracle 和 PostgreSQL 中必不可少,但在 SQL Server 和 DB2 中是可選的

3.3.3. index1 列旨在簡化在 WHERE 子句中指定返回行數的工作

3.3.4. WHERE 子句至關重要,如果沒有它,查詢將不會終止

4. 根據發音比較字元串

4.1. 匹配單詞

4.1.1. 匹配拼寫正確和拼寫錯誤的單詞

4.1.2. 匹配拼寫方式不同(比如英式拼寫和美式拼寫)的單詞

4.1.3. 匹配由不同字元串表示的單詞

4.1.3.1. 查找拼寫不同但發音相同的字元串

4.2. 函數 SOUNDEX 將字元串轉換為英語發音

4.2.1. SOUNDEX 會保留第一個字母,並將其他字母替換為數字

4.2.2. 發音相似的字母將被替換為相同的數字

4.3. SQL Server 函數 DIFFERENCE 會使用 SOUNDEX 對兩個字元串進行比較,並返回表示相似程度的數字 0~4

4.4. sql

a_name
----
1 Johnson
2 Jonson
3 Jonsen
4 Jensen
5 Johnsen
6 Shakespeare
7 Shakspear
8 Shaekspir
9 Shakespar

4.4.1.  sql

select an1.a_name as name1, an2.a_name as name2,
 SOUNDEX(an1.a_name) as Soundex_Name
 from author_names an1
 join author_names an2
 on (SOUNDEX(an1.a_name)=SOUNDEX(an2.a_name)
 and an1.a_name not like an2.a_name)

5. 查找與模式不匹配的文本

5.1. sql

select emp_id, text
  from employee_comment
EMP_ID     TEXT
---------- ------------------------------------------------------------
7369       126 Varnum, Edmore MI 48829, 989 313-5351
7499       1105 McConnell Court
           Cedar Lake MI 48812
           Home: 989-387-4321
           Cell: (237) 438-3333

5.2. 列出其中電話號碼格式不正確的行

5.3. sql

select emp_id, text
from employee_comment
where regexp_like(text, '[0-9]{3}[-. ][0-9]{3}[-. ][0-9]{4}')
  and regexp_like(
         regexp_replace(text,
            '[0-9]{3}([-. ])[0-9]{3}\1[0-9]{4}',''),
         '[0-9]{3}[-. ][0-9]{3}[-. ][0-9]{4}')
    EMP_ID TEXT
---------- ------------------------------------------------------------
  7369     126 Varnum, Edmore MI 48829, 989 313-5351
  7844     989-387.5359
  9999     906-387-1698, 313-535.8886

6. 使用絕對中位差找出異常值

6.1. 值存在疑問的原因

6.1.1. 數據收集方式有問題

6.1.1.1. 記錄值的儀錶存在誤差

6.1.2. 數據輸入錯誤導致的

6.1.3. 數據生成時環境出現異常

6.1.3.1. 意味著數據點是正確的,但應謹慎根據數據得出任何結論

6.2. 檢測異常數據的常用方法

6.2.1. 計算數據的標準偏差,並將超過 3 倍標準偏差(或其他類似距離)的數據點視為異常數據

6.2.2. 如果數據不符合正態分佈,則這種方法可能錯誤地識別異常數據,而當數據分佈不對稱,或者如果你遠離平均值,數據就不像正態分佈那樣變得稀疏時更是如此

6.3. 偏差是中值與各個值的絕對差

6.4. 絕對中位差是偏差的中值

6.5. Oracle

6.5.1. sql

with
Deviation (Deviation)
  as
(select abs(sal-median(sal))
from emp),
MAD (MAD) as
(select median(Deviation)
from Deviation )
select abs(sal-median)/MAD, sal, ename, job
FROM MAD join emp

6.6. SQL Server

6.6.1. sql

with median (median)
as
(select distinct percentile_cont(0.5) within group(order by sal)
        over()
from emp),
Deviation (Deviation)
  as
(Select abs(sal-median)
from emp join median on 1=1),
MAD (MAD) as
(select DISTINCT PERCENTILE_CONT(0.5) within group(order by deviation) over()
from Deviation )
select abs(sal-median)/MAD, sal, ename, job
from MAD join emp on 1=1

6.7. DB2

6.8. PostgreSQL

6.9. PERCENTILE_CONT 被視為聚合函數,而不是視窗函數

6.9.1. sql

with median (median)
as
(select percentile_cont(0.5) within group(order by sal)
from emp),
devtab (deviation)
  as
(select abs(sal-median)
from emp join median),
MedAbsDeviation (MAD) as
(select percentile_cont (0.5) within group(order by deviation)
from devtab)
select abs(sal-median)/MAD, sal, ename, job
FROM MedAbsDeviation join emp

6.10. MySQL

6.10.1. sql

with rank_tab (sal, rank_sal) as (
select sal, cume_dist() over (order by sal)
from emp),
inter as
(
select sal, rank_sal from rank_tab
where rank_sal>=0.5
union
select sal, rank_sal from rank_tab
where rank_sal<=0.5
)
,
medianSal (medianSal) as
(
select (max(sal)+min(sal))/2
from inter),
deviationSal (Sal,deviationSal) as
(select Sal,abs(sal-medianSal)
from emp join medianSal
on 1=1
)
,
distDevSal (sal,deviationSal,distDeviationSal) as
(
select sal,deviationSal,cume_dist() over (order by deviationSal)
from deviationSal
),
DevInter (DevInter, sal) as
(
select min(deviationSal), sal
from distDevSal
where distDeviationSal >= 0.5
union
select max(DeviationSal), sal
from distDevSal
where distDeviationSal <= 0.5
),
MAD (MedianAbsoluteDeviance) as
(
select abs(emp.sal-(min(devInter)+max(devInter))/2)
from emp join DevInter on 1=1
)
select emp.sal,MedianAbsoluteDeviance,
(emp.sal-deviationSal)/MedianAbsoluteDeviance
from (emp join MAD on 1=1)
         join deviationSal on emp.sal=deviationSal.sal

6.10.2. 沒有提供函數 MEDIAN 或 PERCENTILE_CONT

6.10.3. 需要在 CTE 中使用兩個子查詢

6.11. 計算中值,然後計算這個中值與各個值的絕對偏差的中值,即絕對中位差

6.12. 使用查詢來找出每個值相對於中值的偏差與絕對中位差的比值

6.13. 可以像使用標準偏差那樣使用這些比值了

6.13.1. 如果一個值相對於中值的偏差是絕對中位差的 3 倍以上,就可以認為它是異常值

6.14. 優點

6.14.1. 即便數據不呈正態分佈,它依然有效

6.14.2. 即便數據分佈不平衡,絕對中位差給出的答案依然合理

7. 使用本福特法則查找反常數據

7.1. 檢測不像異常值那樣顯而易見的反常數據的一種方式是查看數字位的出現頻率,這種頻率通常符合本福特法則

7.2. 本福特法則最常用於檢測數據造假

7.2.1. 在數據集中人為地添加偽造的數字

7.2.2. 用於檢測不符合預期規律的數據

7.3. 本福特法則

7.3.1. 計算數字位的期望分佈

7.3.2. 將其與實際分佈進行比較

7.4. sql

with
FirstDigits (FirstDigit)
as
(select left(cast(SAL as CHAR),1) as FirstDigit
        from emp),
TotalCount (Total)
as
 (select count(*)
  from emp),
ExpectedBenford (Digit,Expected)
as
  (select ID,(log10(ID + 1) - log10(ID)) as expected
    from t10
    where ID < 10)
select count(FirstDigit),Digit,
coalesce(count(*)/Total,0) as ActualProportion,Expected
From FirstDigits
     Join TotalCount
     Right Join ExpectedBenford
     on FirstDigits.FirstDigit=ExpectedBenford.Digit
group by Digit
order by Digit

7.5. 最終的結果集包含 4 列數據,分別是第一位的預測頻率、第一位的實際頻率、本福特法則預測的前幾位的頻率,以及前幾位的實際頻率

8. SQL 不像專用包 SAS、統計編程語言 R 和 Python 統計庫那樣提供了完備的統計工具

9. SQL Server

9.1. PIVOT操作符

9.1.1. sql

DEPT_10    DEPT_20    DEPT_30    DEPT_40
------- ---------- ---------- ----------
      3          5          6          0

9.1.2. sql

select [10] as dept_10,
       [20] as dept_20,
       [30] as dept_30,
       [40] as dept_40
  from (select deptno, empno from emp) driver
 pivot (
    count(driver.empno)
    for driver.deptno in ( [10],[20],[30],[40] )
 ) as empPivot

9.1.2.1. 不使用CASE表達式或額外的連接操作

9.2. UNPIVOT操作符

9.2.1. sql

ACCOUNTING   RESEARCH      SALES OPERATIONS
---------- ---------- ---------- ----------
         3          5          6          0

9.2.2. sql

DNAME                 CNT
-------------- ----------
ACCOUNTING              3
RESEARCH                5
SALES                   6
OPERATIONS              0

9.2.3.  sql

select DNAME, CNT
   from (
     select [ACCOUNTING] as ACCOUNTING,
            [SALES]      as SALES,
            [RESEARCH]   as RESEARCH,
            [OPERATIONS] as OPERATIONS
       from (
               select d.dname, e.empno
                 from emp e,dept d
                where e.deptno=d.deptno
            ) driver
      pivot (
        count(driver.empno)
        for driver.dname in ([ACCOUNTING],[SALES],[RESEARCH],[OPERATIONS])
      ) as empPivot
 ) new_driver
 unpivot (cnt for dname in (ACCOUNTING,SALES,RESEARCH,OPERATIONS)
 ) as un_pivot

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

-Advertisement-
Play Games
更多相關文章
  • 公司有一個控制台應用程式,在關閉控制台應用程式視窗前,想處理一下業務邏輯。還有比如誤操作關閉了,或者像消息隊列啟動了發送消息提醒,那關閉了視窗代表控制台應用銷毀了,也需要發送消息通知。那這個時候添加關閉視窗事件就派上用場了。 ...
  • 通過深入理解和掌握NET Core MVC2.x從中學習到實用的技術和解決方案,提升自己在NET Core MVC2.x開發中的技能 ...
  • 博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ...
  • # WSL獲得Ubuntu系統 ## 一、WSL介紹 ![uTools_1691654842978](https://img2023.cnblogs.com/blog/3178390/202308/3178390-20230810191800229-1878153067.png) ## 二、WSL部 ...
  • 屏蔽驅動列印信息 root許可權:echo "1 4 1 7" > /proc/sys/kernel/printk sudo sh -c "sudo echo "1 4 1 7" > /proc/sys/kernel/printk 實現觸摸屏校驗 第一次進入Linux系統時,會出現觸摸校驗提示,按提示 ...
  • 平時在運維的時候,有時候SSH無法使用的情況下就需要備用telnet遠程,本文就簡單分享如何安裝配置telnet遠程 一、獲取安裝包 安裝包需要準備telnet\telnet-server\xintet,都是非常成熟的軟體,可線上直接安裝。 線上安裝: yum install telnet teln ...
  • ## 首先 - 聲明:這是轉載,我只是做一個記錄,以下內容可解決問題(本人已嘗試並已解決),當然也可以去轉載出處查看大佬的原回答: >[Win10系統, administrator賬戶被微軟賬戶強行綁定,怎麼破? - 海爾森肯威的回答 - 知乎](https://www.zhihu.com/ques ...
  • 博客推行版本更新,成果積累制度,已經寫過的博客還會再次更新,不斷地琢磨,高質量高數量都是要追求的,工匠精神是學習必不可少的精神。因此,大家有何建議歡迎在評論區踴躍發言,你們的支持是我最大的動力,你們敢投,我就敢肝 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...