SQL Server從入門到項目實踐(超值版)讀書筆記 20

9.4 數據的嵌套查詢

所謂嵌套查詢,就是在一個查詢語句中,嵌套進另一個查詢語句,即,查詢語句中可以使用另一個查詢語句中得到的查詢結果,子查詢可以基于一張表或者多張表。子查詢中常用的操作符有ANY、SOME、ALL、IN、EXISTS等。

9.4.1 使用比較運算符的子查詢

子查詢中可以使用的比較運算符有“<”“<=”“=”“>=”和“!=”等。

為演示子查詢操作,下面創建員工部門信息(dept表),具體的表結構如下表:

dept表結構

字段名

字段說明

數據類型

主鍵

外鍵

非空

唯一

deptID

部門編號

int

deptName

部門名稱

varchar(50)

addr

部門地址

varchar(100)

在數據庫mydatabase中,創建部門信息表:

CREATE TABLE dept
(deptID INT PRIMARY KEY,deptName VARCHAR(50),addr VARCHAR(100)
)

創建好后,向表中錄入數據,如下表:

deptID

deptName

addr

1

行政部

行政樓101室

2

人事部

行政樓102室

3

銷售部

行政樓103室

4

財務部

行政樓104室

向數據表中添加數據記錄,具體SQL語句如下:

INSERT INTO dept
VALUES (1,'行政部','行政樓101室'),(2,'人事部','行政樓102室'),(3,'銷售部','行政樓103室'),(4,'財務部','行政樓104室')

例:在dept表中查詢工作地點addr等于“行政樓101室”的部門編碼deptID,然后在員工信息表employee中查詢所有該部門編碼的員工信息

SELECT * FROM employee WHERE deptcode=
(SELECT deptID FROM dept WHERE addr='行政樓101室')

例:在dept表中查詢addr等于“行政樓101室”的部門編號deptID,然后在employee中查詢所有非該部門的員工信息

SELECT * FROM employee WHERE deptcode !=
(SELECT deptID FROM dept WHERE addr='行政樓101室')

9.4.2 使用IN的子查詢

IN關鍵字主要用來判斷某個列是否在某個范圍內,在子查詢中,通常用在查詢結果的前面,用于判斷查詢結果中是否有符合條件的數據,語法如下:

SELECT col_name1,col_name2,...
FROM table_name1
WHERE col_name 
IN (SELECT col_nameX FROM table_name2 WHERE conditions)
💡提示:
關鍵字IN后面是一個子查詢,并且這個子查詢只能返回一列值,另外,這個返回值的數據類型必須與IN前面列的數據類型一致。

例:在employee中,查詢員工編號為“101”的員工所在的部門編碼,再根據該編碼,查詢其部門名稱:

SELECT deptName FROM dept
WHERE deptId IN
(SELECT deptcode FROM employee WHERE code='101')

這個例子說明,SQL在處理SELECT語句的時候,實際上執行了兩個操作過程,即先執行內層子查詢,再執行外層查詢,內層的結果作為外層的條件使用。

SELECT語句中可以使用NOT IN運算符,其作為與IN 正好相反。

例:與前一個例子類似,但是在SELECT語句中使用NOT IN運算符

9.4.3 使用ANY的子查詢

ANY關鍵字也是在子查詢中經常使用,它可以用于比較某一列的值是否全部都大于ANY后面的子查詢中查詢結果的最小值,或者小于ANY后面子查詢結果的最大值。

語法如下:

SELECT col_name1,col_name2,...
FROM table_name1
WHERE col_name operator ANY
(SELECT col_nameX FROM table_name2 WHERE conditions)

各參數說明:

  • operator:就是比較運算符的統稱,實際代碼中可以是“<”“<=”“=”“>=”和“!=”等。

例:查詢人事部員工工資大于銷售部員工工資的員工信息

SELECT * FROM employee
WHERE salary > ANY
(SELECT salary FROM employee 
WHERE deptcode = (SELECT deptid FROM dept WHERE deptName = '銷售部') )
AND deptcode=2

9.4.4 使用SOME的子查詢

SOME關鍵字的用法與ANY關鍵字用法類似,但是意義不同。

SOME通常用于比較滿足查詢結果中的任意值,而ANY要滿足所有值才可以。

語法如下:

SELECT col_name1,col_name2,...
FROM table_name1
WHERE col_name operator SOME 
(SELECT col_nameX FROM table_name2 WHERE conditions)

例:查詢行政部和人事部所有員工的信息

SELECT * FROM employee
WHERE deptname = SOME ('人事部' or '行政部')

很顯然,在表employee里,沒有字段[deptname],這個字段位于表“dept”中,所以需要使用子查詢,先從“dept”中找到對應'人事部'和'行政部'的部門編碼,再通過部門編碼去表“employee”中取數。

上面的代碼修改為:

SELECT * FROM employee
WHERE deptcode = SOME
(SELECT deptid FROM dept WHERE deptname = '人事部' OR  deptname = '行政部')
💡提示:
從結果可以發現,與IN關鍵字有完全相同的功能。
也就是說,在使用=SOME時,可以用IN替換
9.4.5 使用EXISTS的子查詢

EXISTS關鍵字代表“存在”,它應用于子查詢中,只要子查詢返回的結果為空,那么返回就是TRUE,此時外層查詢語句將被執行;否則就是FALSE,外層語句不執行。

通常情況下,EXSITS關鍵字用在WHERE子句中。

SELECT col_name1,col_name2,...
FROM table_name1
WHERE EXISTS (SELECT col_nameX FROM table_name2 WHERE conditions)

這里,當EXISTS后面的查詢語句有結果時,那么EXISTS前面的查詢就被執行,否則,不輸出任何數據。

例:如果表dept中存在deptid=1的部門,就把表employee所有的員工信息全部查詢出來

SELECT * FROM employee
WHERE EXISTS (SELECT 1 FROM dept WHERE deptid=1)

EXISTS關鍵字可以和條件表達式一起使用。

例:如果表dept中存在deptid=1的部門,就把表employee中salary大于3000元的記錄查詢出來

SELECT * FROM employee
WHERE salary > 3000
AND EXISTS (SELECT 1 FROM dept WHERE deptid=1)

NOT EXISTS與EXISTS使用方法相同,返回的結果相反。

例:如果表dept中不存在deptid=1的部門,就查詢表employee中的所有記錄

SELECT * FROM employee
WHERE NOT EXISTS (SELECT 1 FROM dept WHERE deptid=1)

因為表dept中存在,所以不查詢,返回結果為空。

📢注意:
EXISTS和NOT EXISTS的結果只取決于是否會返回行,而不取決于這些行的內容,所以這個子查詢輸入列表通常是無關緊要的。

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

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

相關文章

【MySQL\Oracle\PostgreSQL】遷移到openGauss數據出現的問題解決方案

【MySQL\Oracle\PostgreSQL】遷移到openGauss數據出現的問題解決方案 問題1&#xff1a;序列值不自動刷新問題 下面SQL只針對單庫操作以及每個序列只綁定一張表的情況 -- 自動生成的序列&#xff0c;設置序列值 with sequences as (select *from (select table_schema,table_…

【Maven】Maven命令大全手冊:28個核心指令使用場景

Maven命令大全手冊&#xff1a;28個核心指令使用場景 Maven命令大全手冊&#xff1a;28個核心指令深度解析一、構建生命周期核心命令1. mvn clean2. mvn compile3. mvn test4. mvn package5. mvn install6. mvn deploy二、依賴管理命令7. mvn dependency:tree8. mvn dependency…

大語言模型(LLM)按架構分類

大語言模型&#xff08;LLM&#xff09;按架構分類的深度解析 1. 僅編碼器架構&#xff08;Encoder-Only&#xff09; 原理 雙向注意力機制&#xff1a;通過Transformer編碼器同時捕捉上下文所有位置的依賴關系# 偽代碼示例&#xff1a;BERT的MLM任務 masked_input "Th…

MySQL(120)如何進行數據脫敏?

數據脫敏&#xff08;Data Masking&#xff09;是指通過某種方式對敏感數據進行變形&#xff0c;使其在使用過程中無法識別原始數據&#xff0c;從而保護數據隱私。數據脫敏通常應用在開發、測試和數據分析等場景中。下面我們詳細介紹如何在Java應用程序中進行數據脫敏&#xf…

使用 Dockerfile 構建基于 .NET9 的跨平臺基礎鏡像

官方基礎鏡像準備 微軟官方 dotnet sdk 基礎鏡像&#xff1a; docker pull mcr.microsoft.com/dotnet/sdk:9.0拉取 ubuntu 鏡像&#xff1a; docker pull ubuntu:24.04更多資源請參考&#xff1a; dotnet sdk images&#xff0c;https://mcr.microsoft.com/en-us/artifact/mar/…

C++ : 線程庫

C : 線程庫一、線程thread1.1 thread類1.1.1 thread對象構造函數1.1.2 thread類的成員函數1.1.3 線程函數的參數問題1.2 this_thread 命名空間域1.2.1 chrono二、mutex互斥量庫2.1 mutex的四種類型2.1.1 mutex 互斥鎖2.2.2 timed_mutex 時間鎖2.2.3 recursive_muetx 遞歸鎖2.2.…

idea的使用小技巧,個人向

idea的使用小技巧&#xff0c;個人向 一、前言二、過程1、顯示內存的使用情況2、去掉xml文件中的黃色背景3、顯示所有打開文件4、顯示工具欄到菜單下面5、使用JDK8 一、前言 每次重裝idea都需要重新設置一下&#xff0c;這里做個記錄。 這些技巧只是個人感覺的好用 演示用的…

debian及衍生發行版apt包管理常見操作

好的&#xff0c;這是 Debian 及其衍生版&#xff08;如 Ubuntu&#xff09;使用的 apt 包管理器的常用命令速查表。 一點說明&#xff1a;apt 是新一代的命令行工具&#xff0c;整合了 apt-get 和 apt-cache 的常用功能&#xff0c;并提供了更友好的交互體驗。本表主要使用現…

vue調用函數

好的&#xff0c;我們來講解如何在 Vue 模板中調用函數。您提供的代碼是一個非常棒的、很實用的例子。 在 Vue 模板中&#xff0c;你可以在兩個主要地方調用函數&#xff1a; 文本插值中&#xff1a;像 {{ formatDate(date) }} 這樣&#xff0c;函數的返回值會作為文本被渲染到…

前端常用構建工具介紹及對比

打包構建工具是現代軟件開發中必不可少的,它們幫助開發者自動化構建、打包、部署等流程,提升開發效率。不過,不同時期構建工具略有差異。 每個構建工具都有其擅長的領域,我們需要知道其優勢,才能在我們實際開發中選擇合適的構建工具進行構建處理。 1. Gulp Gulp 是一個…

Web后端開發-SpringBootWeb入門、Http協議、Tomcat

文章目錄Web后端開發簡介SpringBootWeb入門HTTP協議HTTP-概述HTTP-請求協議HTTP-響應協議HTTP-協議解析Web服務器-Tomcat簡介基本使用SpringBootWeb入門程序解析Web后端開發簡介 SpringBootWeb入門 package com.wuxuan.javaweb_wushuang.controller;import org.springframework…

物聯網通信技術全景剖析:從LoRa到5G的深度對比與選型指南

物聯網通信技術全景剖析&#xff1a;從LoRa到5G的深度對比與選型指南在萬物互聯時代&#xff0c;選擇合適的通信技術如同為設備構建“神經網絡”。本文將深入解析七大主流物聯網通信技術&#xff0c;助您在技術選型中精準決策。一、低功耗廣域網&#xff08;LPWAN&#xff09;技…

俄羅斯方塊AI深度解析:從算法原理到實現細節

俄羅斯方塊AI深度解析:從算法原理到實現細節 前言 俄羅斯方塊,這個誕生于1984年的經典游戲,至今仍然是人工智能研究領域的熱門課題。當簡單的幾何形狀在網格中不斷下落時,看似簡單的規則背后卻隱藏著復雜的策略決策問題。本文將深入剖析一個基于Python實現的俄羅斯方塊AI…

Spring Boot 框架創建一個簡單的后端接口,并介紹如何使用 Apifox 連接該接口

目錄 一、配置 二、使用 IntelliJ IDEA 創建 Spring Boot 項目 1.打開 IntelliJ IDEA&#xff0c;選擇 File > New > Project 2.在左側面板選擇 Spring Initializr&#xff0c;項目名稱設置為HelloWorldAPI 3.點擊 Create 完成項目創建 三、創建控制器類 四、運行項…

CICD[導航]、docker+gitlab+harbor+jenkins從安裝到部署

一、安裝 CICD[軟件安裝]&#xff1a;docker安裝gitlab-CSDN博客 CICD[軟件安裝]&#xff1a;ubuntu安裝jenkins-CSDN博客 CICD[軟件安裝]&#xff1a;ubuntu安裝私有鏡像倉庫-Harbor-CSDN博客 CICD[軟件安裝]&#xff1a;ubuntu24安裝Docker-CSDN博客 二、鏡像執行 CICD[…

深度學習圖像分類數據集—蘑菇識別分類

該數據集為圖像分類數據集&#xff0c;適用于ResNet、VGG等卷積神經網絡&#xff0c;SENet、CBAM等注意力機制相關算法&#xff0c;Vision Transformer等Transformer相關算法。 數據集信息介紹&#xff1a;蘑菇識別分類&#xff1a;[Agaricus, Amanita, Boletus, Cortinarius, …

iOS 多線程導致接口亂序?抓包還原 + 請求調度優化實戰

在一次性能優化過程中&#xff0c;我們將 iOS App 內多處請求改為并行處理&#xff0c;以提高頁面加載速度。但上線后卻收到部分用戶反饋&#xff1a;進入頁面后數據加載錯亂&#xff0c;有時展示前一次頁面內容&#xff0c;有時同一個接口請求重復返回不同內容。 日志僅顯示正…

PDFBox 在 Linux 報 “No glyph for U+535A (博)” —— 一次子集化踩坑與完整排查清單

PDFBox 在 Linux 報 “No glyph for U535A (博)” —— 一次子集化踩坑與完整排查清單關鍵詞&#xff1a;PDFBox、PDType0Font、子集嵌入&#xff08;subset embedding&#xff09;、SimHei、思源黑體、字體回退1. 背景業務場景 后端使用 Apache PDFBox 填充含 AcroForm 的中文…

網安系列【8】之暴力破解入門

文章目錄 引用資料一 什么是暴力破解&#xff1f;二 暴力破解的工作原理三 暴力破解的類型3.1 傳統暴力破解3.2 字典攻擊3.3 混合攻擊3.4 彩虹表攻擊 四 暴力破解實戰演示4.1 環境和工具4.2 破解操作 五 防御暴力破解的策略六 暴力破解的相關法律七 延伸學習總結 引用資料 Bur…

使用tensorflow的線性回歸的例子(四)

與經典線性回歸比較 import matplotlib.pyplot as plt %matplotlib inline import tensorflow as tf import numpy as np from sklearn.linear_model import LinearRegression #from sklearn.datasets.samples_generator import make_regression Xdata np.array([4.0, …