SQL練習(6/81)

目錄

1.尋找連續值

方法一:使用自連接(Self-Join)

方法二:使用窗口函數(Window Functions)

2.尋找有重復的值

?GROUP BY子句

HAVING子句

常用聚合函數:

3.找不存在某屬性的值

not in

not exist

性能比較

使用場景


1.尋找連續值

方法一:使用自連接(Self-Join)

select distinct l1.num as ConsecutiveNums
from logs l1
join logs l2 on l1.id = l2.id - 1 and l1.num = l2.num
join logs l3 on l2.id = l3.id - 1 and l2.num = l3.num
  1. 自連接(Self-Join)

    • 自連接是指將同一張表連接到自身。通過為同一張表賦予不同的別名(如l1l2l3),可以將表中的行與其他行進行比較。

    • 在這個例子中,l1l2l3分別代表logs表中的不同行,通過id的偏移量來確定它們之間的順序關系。

  2. 連接條件(Join Conditions)

    • l1.id = l2.id - 1:表示l2idl1id大1,即l2l1的下一行。

    • l1.num = l2.num:表示l1l2num值相同。

    • l2.id = l3.id - 1:表示l3idl2id大1,即l3l2的下一行。

    • l2.num = l3.num:表示l2l3num值相同。

    • 通過這些條件,確保了l1l2l3是連續的三行,并且它們的num值相同。

  3. DISTINCT關鍵字

    • DISTINCT用于去除結果中的重復行,確保輸出的ConsecutiveNums是唯一的。

方法二:使用窗口函數(Window Functions)

select distinct num as ConsecutiveNums
from (select num,LAG(num,1) over(order by id ASC) as pre1,LAG(num,2) over(order by id ASC) as pre2,LEAD(num,1) over(order by id ASC) as post1,LEAD(num,2) over(order by id ASC) as post2from logs
) AS subquery
where (pre2 = pre1 and pre1 = num)or (pre1 = num and num = post1)or (num = post1 and post1 = post2)
  1. 窗口函數(Window Functions)

    • 窗口函數允許在結果集中對每一行進行計算,同時考慮其他行的值。LAGLEAD是兩種常用的窗口函數。

    • LAG(num,1) over(order by id ASC) as pre1:獲取當前行的前一行的num值。

    • LAG(num,2) over(order by id ASC) as pre2:獲取當前行的前兩行的num值。

    • LEAD(num,1) over(order by id ASC) as post1:獲取當前行的下一行的num值。

    • LEAD(num,2) over(order by id ASC) as post2:獲取當前行的下兩行的num值。

  2. 子查詢(Subquery)

    • 子查詢用于生成一個臨時表(subquery),其中包含了原始表中的num值以及通過窗口函數計算出的前后行的num值。

  3. WHERE子句

    • WHERE子句用于篩選出滿足連續三次相同數字的行:

      • (pre2 = pre1 and pre1 = num):當前行的num值與其前兩行的num值相同。

      • (pre1 = num and num = post1):當前行的num值與其前一行和下一行的num值相同。

      • (num = post1 and post1 = post2):當前行的num值與其下一行和下兩行的num值相同。

  4. DISTINCT關鍵字

    • DISTINCT用于去除結果中的重復行,確保輸出的ConsecutiveNums是唯一的。

180. 連續出現的數字 - 力扣(LeetCode)



2.尋找有重復的值

SELECT DISTINCT email AS Email
FROM Person
GROUP BY email
HAVING COUNT(email) > 1;
?GROUP BY子句
  • GROUP BY email

    • GROUP BY用于將結果集按一個或多個列分組。這里按email列分組,將具有相同email值的行歸為一組。

    • 分組后,每個email值只會出現一次,便于后續的聚合操作。

HAVING子句
  • HAVING COUNT(email) > 1

    • HAVING用于對分組后的結果進行篩選,類似于WHERE子句,但HAVING用于篩選分組后的聚合結果。

    • COUNT(email):計算每個分組中的行數,即每個email值出現的次數。

    • HAVING COUNT(email) > 1:篩選出出現次數大于1的email值,即找出重復的email

常用聚合函數:
  1. COUNT:計算某個列中非NULL值的數量,或使用COUNT(*)計算表中的總行數。

  2. SUM:計算數值列的總和,僅適用于數值類型的列。

  3. AVG:計算數值列的平均值,僅適用于數值類型的列。

  4. MAX:找出某個列中的最大值,適用于數值列或字符串列。

  5. MIN:找出某個列中的最小值,適用于數值列或字符串列。

  6. COUNT(DISTINCT):計算某個列中唯一值的數量,通過DISTINCT去除重復值后計數。

  7. SUM(DISTINCT):計算某個列中唯一值的總和,通過DISTINCT去除重復值后求和。

  8. AVG(DISTINCT):計算某個列中唯一值的平均值,通過DISTINCT去除重復值后求平均。

  9. GROUP_CONCAT:將同一組中的值連接成一個字符串,可通過SEPARATOR指定分隔符。

  10. STDDEV:計算數值列的標準差,用于衡量數據的離散程度。

  11. VAR:計算數值列的方差,用于衡量數據的離散程度。

  12. BIT_AND:計算一組值的按位與,用于位運算。

  13. BIT_OR:計算一組值的按位或,用于位運算。

  14. BIT_XOR:計算一組值的按位異或,用于位運算。

3.找不存在某屬性的值

not in

select name as Customers
from Customers
where Customers.id not in (select customerId from Orders
)
  • 定義

    • NOT IN 用于檢查某個值是否不在一個子查詢或值列表中。

  • 語法

    SELECT column_name
    FROM table_name
    WHERE column_name NOT IN (subquery | value_list);
  • 特點

    • 子查詢NOT IN 后面可以跟一個子查詢,返回一個值列表。

    • 值列表:也可以直接跟一個具體的值列表。

    • 性能:在某些情況下,NOT IN 的性能可能不如 NOT EXISTS,尤其是在子查詢返回大量數據時。

    • 空值處理:如果子查詢返回的列表中包含 NULLNOT IN 會返回空結果集,因為 NULL 與任何值的比較結果都是 UNKNOWN

not exist

SELECT name AS Customers
FROM Customers c
WHERE NOT EXISTS (SELECT 1FROM Orders oWHERE o.customerId = c.id
);
  • 定義

    • NOT EXISTS 用于檢查某個子查詢是否不返回任何行。

  • 語法

    SELECT column_name
    FROM table_name
    WHERE NOT EXISTS (subquery);
  • 特點

    • 子查詢NOT EXISTS 后面必須跟一個子查詢。

    • 性能:通常比 NOT IN 更高效,尤其是在處理大量數據時。NOT EXISTS 會在找到第一個匹配的行時停止進一步檢查,而 NOT IN 會檢查整個子查詢結果。

    • 空值處理NOT EXISTS 不受 NULL 值的影響,因為它只關心子查詢是否返回行,而不是具體的值。

性能比較

  • NOT IN

    • 適用于子查詢返回的值列表較小的情況。

    • 如果子查詢返回大量數據,性能可能會下降。

    • NULL 值敏感,可能導致意外結果。

  • NOT EXISTS

    • 通常更高效,尤其是在處理大量數據時。

    • 不受 NULL 值的影響。

    • 邏輯上更清晰,尤其是在涉及多表連接時。

使用場景

  • NOT IN

    • 適用于簡單的值列表檢查。

    • 適用于子查詢返回的值列表較小的情況。

  • NOT EXISTS

    • 適用于復雜的子查詢,尤其是涉及多表連接的情況。

    • 適用于需要高效處理大量數據的情況。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/83311.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83311.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/83311.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【流程控制結構】

流程控制結構 流程控制結構1、順序結構2、選擇結構if基本選擇結構if else語法多重if語法嵌套if語法switch選擇結構 3、循環結構循環結構while循環結構程序調試for循環跳轉語句區別 流程控制結構 1、順序結構 流程圖 優先級 2、選擇結構 if基本選擇結構 單if 語法 if&…

【機器人】復現 UniGoal 具身導航 | 通用零樣本目標導航 CVPR 2025

UniGoal的提出了一個通用的零樣本目標導航框架,能夠統一處理多種類型的導航任務。 支持 對象類別導航、實例圖像目標導航和文本目標導航,而無需針對特定任務進行訓練或微調。 本文分享UniGoal復現和模型推理的過程~ 查找沙發,模…

python + flask 做一個圖床

1. 起因, 目的: 對這個網站:https://img.vdoerig.com/ , 我也想實現這種效果。做一個簡單的圖床,后面,可以結合到其他項目中。 2. 先看效果 實際效果。 3. 過程: Grok 聊天: https://img.vdoerig.co…

Java生產環境設限參數教學

哈哈,這個問題問得好!咱們用開餐廳的比喻來理解生產環境的四大必須設限參數,保證你聽完再也不會忘!(搓手手) 1. 堆內存上限:-Xmx(廚房的最大容量) 問題:想象…

電腦出故障驅動裝不上?試試驅動人生的遠程服務支持

在日常工作或學習中,驅動問題時常成為電腦用戶的一大困擾。尤其是在更換硬件、重裝系統、驅動沖突等情況下,許多用戶往往手足無措,不知道從何下手。而“驅動人生”作為國內領先的驅動管理工具,一直以高效、便捷、智能著稱。現在&a…

JS手寫代碼篇---手寫 instanceof 方法

2、手寫 instanceof 方法 instancecof用于檢測一個對象是否是某個構造函數的實例。它通常用于檢查對象的類型,尤其是在處理繼承關系時。 eg: const arr [1,2,3,4,5]console.log(arr instanceof Array); // trueconsole.log(arr instanceof Object); // true那這是…

使用exceljs將excel文件轉化為html預覽最佳實踐(完整源碼)

前言 在企業應用中,我們時常會遇到需要上傳并展示 Excel 文件的需求,以實現文件內容的在線預覽。經過一番探索與嘗試,筆者最終借助 exceljs 這一庫成功實現了該功能。本文將以 Vue 3 為例,演示如何實現該功能,代碼示例…

PMP-第十二章 項目采購管理

項目采購管理核心概念 項目采購管理包括從項目團隊外部采購或獲取所需產品、服務或成果的各個過程項目組織既可以是買方(甲方) ,也可以是賣方(乙 方)項目采購管理過程圍繞協議來進行,協議是買賣雙方之間具…

maven和npm區別是什么

這是一個很容易搞糊涂新手的問題,反正我剛開始從課堂的知識轉向項目網站開發時,被這些問題弄得暈頭轉向,摸不著頭腦,學的糊里糊涂,所以,寫了這么久代碼,也總結一下,為后來者傳授下經…

Leetcode76覆蓋最小子串

覆蓋最小子串 代碼來自b站左程云 class Solution {public String minWindow(String str, String tar) {char[] s str.toCharArray();char[] t tar.toCharArray();int[] cnt new int[256];for (char cha : t) { cnt[cha]--;}int len Integer.MAX_VALUE;int debt t.length…

Linux du 命令終極指南:從基礎到精通

文章目錄 Linux du 命令終極指南:從基礎到精通du 命令簡介常用參數詳解常見用法示例查看當前目錄總大小查看當前目錄及其子目錄占用空間只顯示當前目錄總占用空間查看目錄下每個文件和子目錄的大小查看某目錄深度為 1 的大小分布查看某目錄并排除日志文件查看多個目…

sychronized原理(嚼碎了喂版)

先說一下心得吧,我們知道硬軟不分家,在學習底層原理的時候我們不需要死扣到底,沒必要把硬件方面全吃透,點到為止,學到能夠幫助理解代碼即可,我們的目標是寫出高性能的代碼,而不是創造出硬軟一體…

Ngrok 配置:實現 Uniapp 前后端項目內網穿透

文章目錄 一、下載并安裝 ngrok二、配置 ngrok Authtoken三、啟動本地 uniapp 項目四、使用 ngrok 暴露本地服務五、通過公網 URL 訪問項目六、后端API項目的穿透問題排查 (uni-app 后端 API 示例)交互流程圖示 七、ngrok Web 界面 (本地監控)八、停止 ngrok總結 ngrok 是一款…

k8s灰度發布

基于 Traefik 的加權灰度發布-騰訊云開發者社區-騰訊云 Traefik | Traefik | v1.7 Releases traefik/traefik GitHub 從上面連接下載后上傳到harbor虛擬機 vagrant upload /C/Users/HP280/Downloads/traefik 下載配置文件 wget -c http://raw.githubusercontent.com/conta…

win10-django項目與mysql的基本增刪改查

以下都是在win10系統下,django項目的orm框架對本地mysql的表的操作 models.py----->即表對應的類所在的位置 在表里新增數據 1.引入表對應的在models.py中的類class 2.在views.py中使用函數:類名.objects.create(字段名值,字段名"值"。。。…

`ParameterizedType` 和 `TypeVariable` 的區別

在 Java 的泛型系統中,ParameterizedType 和 TypeVariable 是兩個不同的類型表示,它們都屬于 java.lang.reflect.Type 接口的子接口。兩者都在反射(Reflection)中用于描述泛型信息,但用途和含義不同。 🌟 一…

PR-2021

推薦深藍學院的《深度神經網絡加速:cuDNN 與 TensorRT》,課程面向就業,細致講解CUDA運算的理論支撐與實踐,學完可以系統化掌握CUDA基礎編程知識以及TensorRT實戰,并且能夠利用GPU開發高性能、高并發的軟件系統&#xf…

unity使用ZXing.Net生成二維碼

下載鏈接 https://github.com/micjahn/ZXing.Net 放到Plugins下即可使用

Ubuntu 編譯SRS和ZLMediaKit用于視頻推拉流

SRS實現視頻的rtmp webrtc推流 ZLMediaKit編譯生成MediaServer實現rtsp推流 SRS指定某個固定網卡,修改程序后重新編譯 打開SRS-4.0.0/trunk/src/app/srs_app_rtc_server.cpp,在 232 行后面添加: ZLMediaKit編譯后文件存放在ZLMediakit/rele…

如何備考GRE?

1.引言 GRE和雅思不太相同,首先GRE是美國人的考試,思維方式和很多細節和英系雅思不一樣。所以底層邏輯上我覺得有點區別。 難度方面,我感覺GRE不容易考低分,但考高分較難。雅思就不一樣了不僅上限難突破,下限還容易6…