SQL語法(DQL):SELECT 多表查詢之子查詢

1、子查詢

  • 定義:如果某一個SQL語句A包含了一個查詢Select語句B,稱B叫做子查詢,稱A叫做主查詢,A帶有子查詢語句
  • 目的:提高代碼復用性,間接提高代碼開發效率
  • 分類:
    • 條件子查詢:將子查詢結果作為主查詢條件:發生在過濾中:where、having
    • -- 條件子查詢
      -- 查詢的條件依賴于另外一個查詢語句的結果,可以用于select、delete、update中
      where  col in/= (select ……)
      # 注意:= 匹配 一行一列,in 匹配 多行一列
    • 數據源子查詢:將子查詢結果作為主查詢數據來源:發生數據來源中:from

    • -- 數據源子查詢
      -- 詢的數據來自于另外一個查詢語句的結果,主要用于select語句中
      from (select ……) t
      # 注意:數據源子查詢必須給定別名
    • 字段子查詢:將子查詢結果作為主查詢中一列的值:結果作為字段:select

    • -- 字段子查詢
      -- 查詢的字段來自于另外一個查詢語句的結果,主要用于select語句中,結果必須一行一列
      with 別名1 as (select1
      ), 別名2 as (select2
      )
      ……
      select ……

2、條件子查詢

  • 功能:用于在一條SQL語句中,通過一個子查詢來實現條件過濾

  • 場景:一般用在where子句中, 支持select、update、delete,過濾條件依賴于一條select語句的結果

  • 語法

  • -- 用于查詢數據
    select …… from where …… (select ……)
    -- 用于更新數據
    update ……  where …… (select ……)
    -- 用于刪除數據
    delete from …… where …… (select ……)
  • 示例1:

  • -- 查詢所有成績小于60分的學生信息# 使用join
    SELECTstudent.* 
    FROMstudentINNER JOIN ( SELECT s_id, MAX( s_score ) max FROM score GROUP BY s_id HAVING max < 60 ) m ON student.s_id = m.s_id# 使用子查詢
    SELECTstudent.* 
    FROMstudent
    WHEREstudent.s_id IN( SELECT s_id FROM score GROUP BY s_id HAVING MAX( s_score ) < 60 ) 
  • 示例2:

  • # 查詢沒學過“張三”老師課的學生的學號、姓名# 內層:先查詢出“張三”老師的教師ID
    SELECT t_id 
    FROM teacher 
    WHERE t_name = '張三'
    ;# 中層:再查詢出“張三”老師教過的課程ID
    SELECT c_id 
    FROM course 
    WHERE t_id IN ( SELECT t_id FROM teacher WHERE t_name = '張三')
    ;# 外層:查詢出學過“張三”老師教過的課的學生ID
    SELECTs_id 
    FROMscore 
    WHEREc_id IN ( SELECT c_id FROM course WHERE t_id IN ( SELECT t_id FROM teacher WHERE t_name = '張三' ) ) 
    ;# 最終:再使用關鍵詞 NOT IN 查詢出沒學過“張三”老師課的學生的學號、姓名
    SELECTst.s_id,st.s_name 
    FROMstudent st 
    WHEREst.s_id NOT IN (
    SELECTs_id 
    FROMscore 
    WHEREc_id IN ( SELECT c_id FROM course WHERE t_id IN ( SELECT t_id FROM teacher WHERE t_name = '張三' ) ) )
    

3、數據源子查詢

  • 功能:用于在一條SQL語句中,通過一個子查詢來構造查詢的數據內容

  • 場景:一般用在select語句中,常用于繼續對上一步的結果繼續進行處理

  • 語法:

  • select …… from (select ……)
  • 示例:

  • -- 查詢學生平均成績并按照平均成績進行排名
    SELECTt.*
    FROM(
    SELECTstu.s_name,AVG( sc.s_score ) avgscore
    FROMstudent stuJOIN score sc ON stu.s_id = sc.s_id
    GROUP BYsc.s_id
    order by avgscore desc) t
    ;
  • 注意:數據源子查詢一定要給子查詢取個別名

4、字段子查詢

  • 功能:用于select通過子查詢生成一列的數據

  • 場景:一般用在select后面,不常用

  • 語法

  • select ……, (select …… ) as col from ……
  • 示例:

  • -- 查詢所有學生的ID對應的平均成績以及班級的平均成績# 先分別查詢 所有學生的ID對應的平均成績 以及 班級的平均成績
    select s_id,avg(s_score),
    from score
    group by s_id
    ;select avg(s_score) as a_score 
    from score
    ;# 合并
    select s_id,avg(s_score),(select avg(s_score) from score ) as a_score
    from score
    group by s_id
    ;

5、子查詢的CTE表達式

  • 問題:一旦子查詢嵌套的結構多了,整體代碼開發的邏輯容易混亂,代碼可讀性不強,怎么解決?

  • 解決:CTE【Common Table Expresssion】表達式,通用/公共表表達式

  • 功能:可以將每一步SQL的結果臨時構建一個表名,再繼續下一步對上一步的表名進行處理

  • 場景一般用于數據源子查詢中

  • 語法:

  • -- 單層
    WITH tmp_tb_name AS (SELECT ……
    )
    SELECT …… FROM tmp_tb_name-- 多層
    WITH tmp_tb_name1 AS (SELECT ……), tmp_tb_name2 AS (SELECT …… FROM tmp_tb_name1), tmp_tb_name3 AS (SELECT …… FROM tmp_tb_name2)
    SELECT …… FROM tmp_tb_name3
  • 示例:

  • -- 查詢不同老師所教不同課程平均分從高到低顯示-- 普通寫法
    SELECTteacher.t_name,course.c_name,t.avgscore 
    FROMcourseJOIN ( SELECT c_id, AVG( s_score ) avgscore FROM score GROUP BY c_id ) t ON course.c_id = t.c_idJOIN teacher ON course.t_id = teacher.t_id 
    ORDER BYt.avgscore DESC-- CTE寫法
    WITH t1 AS (SELECT c_id, AVG( s_score ) avgscore FROM score GROUP BY c_id
    )
    SELECTteacher.t_name,course.c_name,t1.avgscore
    FROMcourseJOIN t1 ON course.c_id = t1.c_idJOIN teacher ON course.t_id = teacher.t_id
    ORDER BYt1.avgscore DESC;
    

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

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

相關文章

開發指南042-產生待辦

整個平臺待辦是統一處理的&#xff0c;各業務微服務需要產生待辦時調用系統API <dependency><groupId>org.qlm</groupId><artifactId>qlm-api</artifactId><version>1.0-SNAPSHOT</version> </dependency> Autowired privat…

Nature Renderer 2022(植被渲染工具插件)

渲染大量詳細的植被。 自然渲染器通過替換Unity的默認地形細節和樹系統來提高植被渲染的質量。一切都適用于現有數據:使用相同的草地、植被和樹木,并保留現有地形。我們只是升級您的渲染器。 Unity驗證的解決方案 Nature Renderer受到25000多名開發人員的信任,是Unity驗證的…

Llama-2 vs. Llama-3:利用微型基準測試(井字游戲)評估大模型

編者按&#xff1a; 如何更好地評估和比較不同版本的大語言模型&#xff1f;傳統的學術基準測試固然重要&#xff0c;但往往難以全面反映模型在實際應用場景中的表現。在此背景下&#xff0c;本文作者別出心裁&#xff0c;通過讓 Llama-2 和 Llama-3 模型進行井字游戲對決&…

【JavaScript腳本宇宙】無處不在的JavaScript庫:解析音視頻處理與實時通信技術

JavaScript庫大揭秘&#xff1a;音視頻、互動體驗與實時通信 前言 在當今互聯網時代&#xff0c;JavaScript已經成為前端開發中不可或缺的一部分。隨著Web技術的不斷發展&#xff0c;出現了許多優秀的JavaScript庫&#xff0c;為開發者提供了豐富的工具和資源。本文將介紹幾個…

STM32智能機器人手臂控制系統教程

目錄 引言環境準備智能機器人手臂控制系統基礎代碼實現&#xff1a;實現智能機器人手臂控制系統 4.1 數據采集模塊 4.2 數據處理與控制算法 4.3 通信與網絡系統實現 4.4 用戶界面與數據可視化應用場景&#xff1a;機器人手臂管理與優化問題解決方案與優化收尾與總結 1. 引言 …

Linux系統中磁盤管理LVM與掛載

Linux系統中磁盤管理LVM與掛載 本文以屬于Linux系統基本概念&#xff0c;如果以查找教程教程&#xff0c;解決問題為主&#xff0c;只需要查看本文后半部分。如需要系統性學習請查看本文前半部分。 本文操作極容易導致主機無法自動重啟&#xff0c;請慎重操作。操作前務必要進…

火熱夏季:浦語*書生InternLM大模型實戰闖關-入門島之Linux基礎知識

一、ssh鏈接與端口映射并運行hello_wold.py 1.創建開發機 InternStudio創建開發機 2.進入開發機 3.Ssh鏈接開發機 powerShell終端ssh鏈接開發機。 4.創建一個hello_world.py文件web demo 5.運行web demo 6.端口映射 7.本地瀏覽器打開web 二、 VSCODE 遠程連接開發機并創建一個…

【最強八股文 -- 計算機網絡】【快速版】TCP 與 UDP 頭部格式

目標端口和源端口: 應該把報文發給哪個進程包長度: UDP 首部的長度跟數據的長度之和校驗和: 為了提供可靠的 UDP 首部和數據而設計&#xff0c;接收方使用檢驗和來檢查該報文段中是否出現差錯 源端口號和目的端口號: 用于多路復用/分解來自或送到上層應用的數據。告訴主機報文段…

[機器學習]-人工智能對程序員的深遠影響——案例分析

機器學習和人工智能對未來程序員的深遠影響 目錄 機器學習和人工智能對未來程序員的深遠影響1. **自動化編碼任務**1.1 代碼生成1.2 自動調試1.3 測試自動化 2. **提升開發效率**2.1 智能建議2.2 項目管理 3. **改變編程范式**3.1 數據驅動開發 4. **職業發展的新機遇**4.1 AI工…

數字統計

import java.util.Scanner;// 注意類名必須為 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的區別// 注意 while 處理多個 caseint a in.nextInt();i…

基于深度學習的點云平滑

基于深度學習的點云平滑是一種利用深度學習模型處理和優化三維點云數據以消除噪聲并提升平滑度的方法。該技術在自動駕駛、機器人導航、3D重建和計算機圖形學等領域有著廣泛應用。以下是關于這一領域的系統介紹&#xff1a; 1. 任務和目標 點云平滑的主要任務是從帶有噪聲和粗…

【計算機畢業設計】基于Springboot的足球青訓俱樂部管理系統【源碼+lw+部署文檔】

包含論文源碼的壓縮包較大&#xff0c;請私信或者加我的綠色小軟件獲取 免責聲明&#xff1a;資料部分來源于合法的互聯網渠道收集和整理&#xff0c;部分自己學習積累成果&#xff0c;供大家學習參考與交流。收取的費用僅用于收集和整理資料耗費時間的酬勞。 本人尊重原創作者…

Day66 代碼隨想錄打卡|回溯算法篇---分割回文串

題目&#xff08;leecode T131&#xff09;&#xff1a; 給你一個字符串 s&#xff0c;請你將 s 分割成一些子串&#xff0c;使每個子串都是 回文串。返回 s 所有可能的分割方案。 方法&#xff1a;本題是一個分割回文串的問題&#xff0c;是回溯算法的另一類問題。 針對一個字…

前端面試題日常練-day82 【面試題】

題目 希望這些選擇題能夠幫助您進行前端面試的準備&#xff0c;答案在文末 在Sass中&#xff0c;以下哪個功能用于創建一個混合器&#xff08;Mixin&#xff09;&#xff1f; a) include b) loop c) function d) component Sass中的嵌套規則可以幫助實現以下哪個目的&#xf…

英偉達今年在華銷售額預計將達120億美元、MiniMax創始人:三年后才會出現“殺手級”AI應用

ChatGPT狂飆160天&#xff0c;世界已經不是之前的樣子。 更多資源歡迎關注 1、英偉達今年在華銷售額預計將達120億美元 芯片咨詢公司SemiAnalysis報告預估&#xff0c;今年英偉達有望在中國銷售價值約120億美元的人工智能芯片。黃仁勛曾表示&#xff0c;希望借助新的芯片使得…

【算法】十進制轉換為二進制

目的&#xff1a;將十進制轉換為二進制 思路&#xff1a; 首先我們手算的情況是通過求余數算出進制數&#xff0c;同樣代碼也是通過做除法和求余數的方式&#xff0c;除法是得出下一次的被除數&#xff0c;而求余數是得到進制數 代碼&#xff1a; #include<stdio.h>/…

python基礎語法筆記(有C語言基礎之后)

input()用于輸入&#xff0c;其有返回值&#xff08;即用戶輸入的值&#xff09;&#xff0c;默認返回字符串。括號里可放提示語句 一行代碼若想分為多行來寫&#xff0c;需要在每一行的末尾加上“\” 單個“/”表示數學中的除法&#xff0c;不會取整。“//”才會向下取整。 …

Qt觸發paintEvent事件

常見情況下&#xff0c;paintEvent會在以下幾種情況下被觸發&#xff1a; 窗口初始化和顯示&#xff1a; 當窗口首次被創建、顯示或者窗口被覆蓋、最小化后再恢復時&#xff0c;paintEvent會被觸發以繪制窗口的內容。 部件大小或位置變化&#xff1a; 如果窗口或部件的大小或位…

【D3.js in Action 3 精譯】1.3 D3 視角下的數據可視化最佳實踐(上)

當前內容所在位置 第一部分 D3.js 基礎知識 第一章 D3.js 簡介 1.1 何為 D3.js&#xff1f;1.2 D3 生態系統——入門須知 1.2.1 HTML 與 DOM1.2.2 SVG - 可縮放矢量圖形1.2.3 Canvas 與 WebGL1.2.4 CSS1.2.5 JavaScript1.2.6 Node 與 JavaScript 框架1.2.7 Observable 記事本 1…

Redis 運維面試題

為了做好大家面試路上的助攻手&#xff0c;對于 Redis 這塊心里還沒底的同學&#xff0c;特整理 40 道Redis常見面試題&#xff0c;讓你面試不慌&#xff0c;爭取 Offer 拿到手軟&#xff01; 1、什么是 Redis&#xff1f; Redis 是完全開源免費的&#xff0c;遵守 BSD 協議&am…