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.mzph.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…