【数据库】sql错题详解

news2025/3/26 11:23:24

1. 执行子查询
SELECT 供应商号
FROM 订购单
WHERE 职工号 IN ('E1', 'E3')
GROUP BY 供应商号
HAVING COUNT(DISTINCT 职工号) = 2
  • 筛选职工号为 E1 或 E3 的记录
    依据 WHERE 职工号 IN ('E1', 'E3') 这个条件,从 订购单 表中把职工号为 E1 或者 E3 的记录筛选出来。得到的结果如下:
    | E3 | S7 | OR67 | 2002/06/23 |
    | E1 | S4 | OR73 | 2002/07/28 |
    | E3 | S4 | OR79 | 2002/06/13 |
    | E3 | S3 | OR91 | 2002/07/13 |

  • 按 供应商号 分组
    运用 GROUP BY 供应商号 对筛选出来的结果进行分组,分组情况如下:

    • 供应商号 S3:包含记录 (E3, S3, OR91, 2002/07/13)
    • 供应商号 S4:包含记录 (E1, S4, OR73, 2002/07/28) 和 (E3, S4, OR79, 2002/06/13)
    • 供应商号 S7:包含记录 (E3, S7, OR67, 2002/06/23)
  • 使用 HAVING 子句筛选分组结果
    HAVING COUNT(DISTINCT 职工号) = 2 的作用是只保留分组中不同职工号数量为 2 的分组。

    • 对于供应商号 S3,其分组里只有职工号 E3,不同职工号数量为 1,不满足条件。
    • 对于供应商号 S4,分组中有职工号 E1 和 E3,不同职工号数量为 2,符合条件。
    • 对于供应商号 S7,分组里只有职工号 E3,不同职工号数量为 1,不符合条件。
      所以,子查询最终返回的 供应商号 是 S4
2. 执行主查询
SELECT *
FROM 供应商
WHERE 地址 = '北京'
  AND 供应商号 IN ('S4')
 
  • 筛选地址为北京的供应商
    根据 WHERE 地址 = '北京' 条件,从 供应商 表中筛选出地址为北京的供应商记录。结果如下:
    | 供应商号 | 供应商名 | 地址 |
    | S4 | 华通电子公司 | 北京 |
    | S7 | 爱华电子厂 | 北京 |

  • 筛选 供应商号 在子查询结果中的记录
    按照 AND 供应商号 IN ('S4') 条件,从上述筛选结果中进一步筛选出 供应商号 为 S4 的记录。最终结果如下:
    | 供应商号 | 供应商名 | 地址 |
    | S4 | 华通电子公司 | 北京 |

1. 子查询部分
SELECT 仓库号, AVG(工资) AS avg_salary
FROM 职工
GROUP BY 仓库号
  • GROUP BY 仓库号:按照 仓库号 对 职工 表中的记录进行分组。也就是说,会把在同一个仓库工作的职工记录分为一组。
  • SELECT 仓库号, AVG(工资) AS avg_salary:对于每一组,计算该组内职工工资的平均值,并将结果命名为 avg_salary,同时选择 仓库号 作为分组标识。例如,如果有两个仓库 WH1 和 WH2,那么会分别计算 WH1 仓库和 WH2 仓库中职工的平均工资。
 

这个子查询的结果是一个临时表,包含两列:仓库号 和该仓库对应的 avg_salary

2. JOIN ON 部分
JOIN (
    -- 子查询
    SELECT 仓库号, AVG(工资) AS avg_salary
    FROM 职工
    GROUP BY 仓库号
) s ON t.仓库号 = s.仓库号
 
  • JOINJOIN 是用于将两个或多个表连接起来的操作符。在这里,将 职工 表(用别名 t 表示)和子查询结果(用别名 s 表示)进行连接。
  • (...) s:子查询被当作一个临时表,使用别名 s 来引用它。
  • ON t.仓库号 = s.仓库号ON 关键字后面的条件指定了连接的规则。这里表示将 职工 表中的 仓库号 与子查询结果中的 仓库号 进行匹配,只有当两者相等时,对应的记录才会被连接在一起。例如,如果 职工 表中有一条记录的 仓库号 是 WH1,子查询结果中也有 WH1 对应的平均工资记录,那么这两条记录就会被连接起来。
3. 主查询和 WHERE 部分
SELECT t.*
FROM 职工 t
JOIN (
    SELECT 仓库号, AVG(工资) AS avg_salary
    FROM 职工
    GROUP BY 仓库号
) s ON t.仓库号 = s.仓库号
WHERE t.工资 < s.avg_salary;
 
  • SELECT t.*:选择 职工 表(别名 t)中的所有列。
  • WHERE t.工资 < s.avg_salaryWHERE 子句用于筛选满足条件的记录。这里表示只选择 职工 表中工资小于其所在仓库平均工资的记录。

示例说明

假设 职工 表数据如下:

 
仓库号职工号工资
WH1E12000
WH1E23000
WH2E34000
WH2E45000
 

子查询计算出的平均工资结果如下:

 
仓库号avg_salary
WH12500
WH24500
 

通过 JOIN ON 连接后,会将 职工 表和子查询结果进行匹配,得到:

 
仓库号职工号工资avg_salary
WH1E120002500
WH1E230002500
WH2E340004500
WH2E450004500
 

最后,通过 WHERE 子句筛选出工资小于平均工资的记录,即:

 
仓库号职工号工资avg_salary
WH1E120002500
WH2E340004500
 

这样就得到了工资低于所在仓库平均工资的职工信息。

FROM 职工:指定从  职工 表中获取数据。

 (7)检索学习全部课程的学生姓名

我们还是基于之前的示例数据来详细分析这个 SQL 语句每一步的执行结果。下面是涉及的三个表数据:

学生表 S
SNOSNAMEAGESEXSDEPT
S1张三20计算机系
S2李四21数学系
S3王五20计算机系
课程表 C
CNOCNAMECDEPTTNAME
C1数据库原理计算机系赵老师
C2高等数学数学系钱老师
C3编程语言计算机系孙老师
学生选课表 SC
SNOCNOGRADE
S1C185
S1C390
S2C278
S3C188
S3C292
S3C380

1. 最内层子查询(针对每个学生和课程组合)

最内层子查询为 SELECT * FROM SC sc WHERE sc.SNO = s.SNO AND sc.CNO = c.CNO,它会针对每个学生和每门课程的组合进行查询,判断该学生是否选修了这门课程。

对于学生 S1
  • 当课程为 C1 时,查询结果:
    | SNO | CNO | GRADE |
    | ---- | ---- | ---- |
    | S1 | C1 | 85 |
  • 当课程为 C2 时,由于 S1 未选修 C2,查询结果为空表。
  • 当课程为 C3 时,查询结果:
    | SNO | CNO | GRADE |
    | ---- | ---- | ---- |
    | S1 | C3 | 90 |
对于学生 S2
  • 当课程为 C1 时,由于 S2 未选修 C1,查询结果为空表。
  • 当课程为 C2 时,查询结果:
    | SNO | CNO | GRADE |
    | ---- | ---- | ---- |
    | S2 | C2 | 78 |
  • 当课程为 C3 时,由于 S2 未选修 C3,查询结果为空表。
对于学生 S3
  • 当课程为 C1 时,查询结果:
    | SNO | CNO | GRADE |
    | ---- | ---- | ---- |
    | S3 | C1 | 88 |
  • 当课程为 C2 时,查询结果:
    | SNO | CNO | GRADE |
    | ---- | ---- | ---- |
    | S3 | C2 | 92 |
  • 当课程为 C3 时,查询结果:
    | SNO | CNO | GRADE |
    | ---- | ---- | ---- |
    | S3 | C3 | 80 |

2. 中间层子查询(针对每个学生)

中间层子查询为 SELECT * FROM C c WHERE NOT EXISTS (SELECT * FROM SC sc WHERE sc.SNO = s.SNO AND sc.CNO = c.CNO),它会针对每个学生,找出该学生未选修的课程。

对于学生 S1

因为 S1 未选修 C2,所以查询结果:

 
CNOCNAMECDEPTTNAME
C2高等数学数学系钱老师
对于学生 S2

因为 S2 未选修 C1 和 C3,所以查询结果:

 
CNOCNAMECDEPTTNAME
C1数据库原理计算机系赵老师
C3编程语言计算机系孙老师
对于学生 S3

由于 S3 选修了所有课程,中间层子查询结果为空表。

3. 最外层查询

最外层查询为 SELECT SNAME FROM S s WHERE NOT EXISTS (SELECT * FROM C c WHERE NOT EXISTS (SELECT * FROM SC sc WHERE sc.SNO = s.SNO AND sc.CNO = c.CNO)),它会筛选出选修了所有课程的学生姓名。

 
  • 对于学生 S1 和 S2,中间层子查询有结果返回,NOT EXISTS 为 FALSE,不会被选中。
  • 对于学生 S3,中间层子查询结果为空表,NOT EXISTS 为 TRUE,会被选中。
 

最终的查询结果为:

 
SNAME
王五

(8)查询所学课程包含学生 S3 所学课程的学生学号

学生选课表 SC
SNOCNOGRADE
S1C185
S1C390
S2C278
S3C188
S3C292
S3C380

语句详解

  1. 最外层查询SELECT DISTINCT SNO FROM SC s1 WHERE... 从学生选课表 SC 中选择不同的学生学号 SNO,表 SC 使用别名 s1,并且后面跟着筛选条件。
  2. 中间层子查询SELECT 1 FROM SC s2 WHERE s2.SNO = 'S3' AND NOT EXISTS (...) 从学生选课表 SC(使用别名 s2)中筛选出学号为 S3 的记录,并且对于每一条这样的记录,再嵌套一个子查询进行进一步判断。
  3. 最内层子查询SELECT 1 FROM SC s3 WHERE s3.SNO = s1.SNO AND s3.CNO = s2.CNO 从学生选课表 SC(使用别名 s3)中查找是否存在满足学号等于外层 s1 的学号且课程号等于中间层 s2 的课程号的记录。如果存在,该子查询返回一行(值为 1),否则不返回行。
 

整体逻辑是:对于 SC 表中的每一个学生 s1,检查 S3 选修的每一门课程,看 s1 是否也选修了这门课程。如果 S3 选修的所有课程 s1 都选修了,那么 s1 就满足条件,会被选入最终结果。

每一步结果

  1. 初始化外层循环,遍历 SC 表中的每一个学生(以 s1 表示)

    • 当 s1.SNO = S1 时:
      • 中间层子查询SELECT 1 FROM SC s2 WHERE s2.SNO = 'S3',得到 S3 选修课程的记录:
        | SNO | CNO | GRADE |
        | ---- | ---- | ---- |
        | S3 | C1 | 88 |
        | S3 | C2 | 92 |
        | S3 | C3 | 80 |
      • 对于上述每一条记录进行最内层子查询
        • 当 s2.CNO = C1 时,SELECT 1 FROM SC s3 WHERE s3.SNO = 'S1' AND s3.CNO = 'C1',有记录,返回一行(值为 1)。
        • 当 s2.CNO = C2 时,SELECT 1 FROM SC s3 WHERE s3.SNO = 'S1' AND s3.CNO = 'C2',无记录,不返回行。
        • 当 s2.CNO = C3 时,SELECT 1 FROM SC s3 WHERE s3.SNO = 'S1' AND s3.CNO = 'C3',有记录,返回一行(值为 1)。
      • 因为存在 S3 选修的课程(C2)而 S1 未选修,所以中间层子查询的 NOT EXISTS 部分对于 S1 为 FALSES1 不满足最外层查询条件。
    • 当 s1.SNO = S2 时:
      • 中间层子查询SELECT 1 FROM SC s2 WHERE s2.SNO = 'S3',得到 S3 选修课程的记录(同上面 S3 的选修课程记录)。
      • 对于上述每一条记录进行最内层子查询
        • 当 s2.CNO = C1 时,SELECT 1 FROM SC s3 WHERE s3.SNO = 'S2' AND s3.CNO = 'C1',无记录,不返回行。
        • 当 s2.CNO = C2 时,SELECT 1 FROM SC s3 WHERE s3.SNO = 'S2' AND s3.CNO = 'C2',有记录,返回一行(值为 1)。
        • 当 s2.CNO = C3 时,SELECT 1 FROM SC s3 WHERE s3.SNO = 'S2' AND s3.CNO = 'C3',无记录,不返回行。
      • 因为存在 S3 选修的课程(C1 和 C3)而 S2 未选修,所以中间层子查询的 NOT EXISTS 部分对于 S2 为 FALSES2 不满足最外层查询条件。
    • 当 s1.SNO = S3 时:
      • 中间层子查询SELECT 1 FROM SC s2 WHERE s2.SNO = 'S3',得到 S3 选修课程的记录(同上面 S3 的选修课程记录)。
      • 对于上述每一条记录进行最内层子查询
        • 当 s2.CNO = C1 时,SELECT 1 FROM SC s3 WHERE s3.SNO = 'S3' AND s3.CNO = 'C1',有记录,返回一行(值为 1)。
        • 当 s2.CNO = C2 时,SELECT 1 FROM SC s3 WHERE s3.SNO = 'S3' AND s3.CNO = 'C2',有记录,返回一行(值为 1)。
        • 当 s2.CNO = C3 时,SELECT 1 FROM SC s3 WHERE s3.SNO = 'S3' AND s3.CNO = 'C3',有记录,返回一行(值为 1)。
      • 因为 S3 选修的所有课程 S3 自己都选修了,所以中间层子查询的 NOT EXISTS 部分对于 S3 为 TRUES3 满足最外层查询条件。
  2. 最终结果
    经过最外层的 DISTINCT 处理后,得到满足条件的学生学号:
    | S3 |

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2321943.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#重写treeView控件

1.先准备两张图片downdrop.png、downdrop_open.png放在项目Resources里 2.新建用户控件BaseTreeView控件 3.重写控件继承TreeView&#xff0c;记得删除AutoScaleMode这一行&#xff0c;否则会报错 public partial class BaseTreeView : TreeView {//这个属性貌似不起作用&…

ArcGIS 10.8.1之后发布栅格数据的MapServer 动态工作空间 替换数据源渲染问题

背景 经过测试&#xff0c;Server 10.8.1、11.0、11.1发布相关服务设置动态空间之后&#xff0c;前端都无法自动读取同名的clr色彩映射表文件进行渲染&#xff0c;服务都是由ArcGIS Pro进行发布。 原因 基于ArcMap发布的服务才支持&#xff0c;但是10.8.1之后不支持ArcMap发…

Java集合框架深度剖析:从数据结构到实战应用

引言 Java集合框架是Java开发中的核心组件之一&#xff0c;其设计目标是提供高性能、高复用性的数据容器。无论是数据处理、缓存设计还是高并发场景&#xff0c;集合框架都扮演着关键角色。本文将从List、Map、Set三大核心接口出发&#xff0c;深入剖析其主流实现类&#xff0…

涅槃上岸,入陕进军,复试全程流程开启!

复试决胜局&#xff0c;整装待发&#xff0c;上岸西电&#xff01; 线下复试注意事项、全流程、录取后西安旅游提前告知&#xff01; 过两天考研复试笔试、机试&#xff08;如果有&#xff09;、面试就要开始了&#xff0c;我们需要准备很多东西&#xff0c;学长从以下几个方面…

msyql--基本操作之运维篇

检查 root 用户的权限 查看该用户针对这个数据库的权限 -- 如果在终端连接mysql时需要 mysql -u root -p -- 查看用户权限 SELECT user, host FROM mysql.user WHERE user root;可以看的出来root有他的访问权限&#xff0c;如过没有localhost或者% 说明没有访问权限 添加…

es6 fetch

对比XHR &#x1f6e0;️ fetch 所有配置项 fetch(url, {// 核心配置 method: GET, // HTTP 方法: GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONSheaders: { // 请求头&#xff08;支持 Headers 对象或普通对象&#xff09;Content-Type: applicati…

智能汽车图像及视频处理方案,支持视频星轨拍摄能力

美摄科技作为智能汽车图像及视频处理领域的先行者&#xff0c;正以革新性的技术引领着行业的未来发展。美摄科技智能汽车图像及视频处理方案&#xff0c;一个集高效性、智能化、画质增强于一体的创新解决方案&#xff0c;旨在重塑智能汽车图像画质的新标准&#xff0c;并支持前…

C盘急救实录:从爆红到畅快

极速救援通道&#xff08;懒人专享&#xff09; 老规矩&#xff0c;先上王炸方案&#xff01;”小番茄C盘清理器”直达链接&#xff1a;https://cclean-cdn.xkbrowser.com/cleanmaster/FanQieClean_13046_st.exe 这个神器有三绝&#xff1a; 智能扫描引擎&#xff1a;能识别23…

UART转APB模块ModelSim仿真

一、简介 之前介绍过一个UART转AHB模块&#xff0c;这个代码的框架有个好处&#xff0c;就是FPGA内总线接口比较容易修改成其他总线接口。下图是UART转AHB模块中子模块uart_ahb_mst的框图&#xff0c;主要有三个状态机&#xff1a; &#xff08;1&#xff09; UART_RX_FSM将接收…

Cesium 自定义路径导航材质

cesium 自定义路径导航纹理图片随便更换&#xff0c;UI 提供设计图片即可达到效果&#xff1b; 打开小马的weix 关注下 搜索“技术链” 回复关键词《《路径》》获取原始代码&#xff1b; 拿到就能用轻松解决&#xff01;帮忙点个关注吧&#xff01;

【江协科技STM32】BKP备寄存器RTC实时时钟(学习笔记)

BKP备寄存器 BKP简介 BKP&#xff08;Backup Registers&#xff09;备份寄存器BKP可用于存储用户应用程序数据。当VDD&#xff08;2.0~3.6V&#xff09;电源被切断&#xff0c;他们仍然由VBAT&#xff08;1.8~3.6V&#xff09;维持供电。当系统在待机模式下被唤醒&#xff0…

卷积神经网络 - 参数学习

本文我们通过两个简化的例子&#xff0c;展示如何从前向传播、损失计算&#xff0c;到反向传播推导梯度&#xff0c;再到参数更新&#xff0c;完整地描述卷积层的参数学习过程。 一、例子一 我们构造一个非常简单的卷积神经网络&#xff0c;其结构仅包含一个卷积层和一个输出…

亮数据爬取API爬取亚马逊电商平台实战教程

前言 在当今数据驱动的商业环境中&#xff0c;企业需要快速、精准地获取互联网上的公开数据以支持市场分析、竞品调研和用户行为研究。然而&#xff0c;传统的手动网页爬取方式面临着诸多挑战&#xff1a;IP封锁、验证码干扰、网站结构频繁变更&#xff0c;以及高昂的运维成本…

[CLS] Token 在 ViT(Vision Transformer)中的作用与实现

[CLS] Token 在 ViT&#xff08;Vision Transformer&#xff09;中的作用与实现 1. 什么是 [CLS] Token&#xff1f; [CLS]&#xff08;classification token&#xff09;是Transformer模型中一个可学习的嵌入向量&#xff0c;最初在 BERT&#xff08;Bidirectional Encoder …

基于网启PXE服务器的批量定制系统平台

项目概述 1.需求 公司新购了一批服务器和台式机&#xff0c;需要为台式机和服务器安装系统&#xff0c;一部分需要安装国产OpenEuler&#xff0c;一部分要求安装CentOS 7.9&#xff0c;同时也要满足定制化需求&#xff0c;即按要求分区安装相应软件。 2.使用开源软件 &…

在本地Windows机器加载大模型并生成内容

本篇演示在本地机器下载和加载大模型并获取AI产生的内容。简单起见&#xff0c;使用的大模型是Qwen2.5-0.5B-Instruct&#xff0c;整个模型的所有文件不到1G。 Qwen2.5-0.5B-Instruct 是阿里巴巴云 QWen 团队基于 Transformer 架构开发的轻量级指令调优语言模型&#xff0c;专…

热门面试题第14天|Leetcode 513找树左下角的值 112 113 路径总和 105 106 从中序与后序遍历序列构造二叉树 (及其扩展形式)以一敌二

找树左下角的值 本题递归偏难&#xff0c;反而迭代简单属于模板题&#xff0c; 两种方法掌握一下 题目链接/文章讲解/视频讲解&#xff1a;https://programmercarl.com/0513.%E6%89%BE%E6%A0%91%E5%B7%A6%E4%B8%8B%E8%A7%92%E7%9A%84%E5%80%BC.html 我们来分析一下题目&#…

【计算机网络】-计算机网络期末复习题复习资料

一、计算机网络体系结构&#xff08;800字&#xff09; 1. OSI参考模型 七层结构&#xff1a;物理层→数据链路层→网络层→传输层→会话层→表示层→应用层 各层核心功能&#xff1a; 物理层&#xff1a;比特流传输&#xff08;如RJ45、光纤接口&#xff09; 数据链路层&…

批归一化(Batch Normalization)与层归一化(Layer Normalization)的区别与联系

文章目录 一、Batch normalization 理论与应用1. 理论解释2. 数值例子 二、Layer normalization 理论与应用1. 理论解释2. 数值例子 三、Layer Normalization 和 Batch Normalization 的区别四、《Transformers without Normalization》笔记 一、Batch normalization 理论与应用…

12届蓝桥杯—货物摆放

货物摆放 题目描述 小蓝有一个超大的仓库&#xff0c;可以摆放很多货物。 现在&#xff0c;小蓝有 nn 箱货物要摆放在仓库&#xff0c;每箱货物都是规则的正方体。小蓝规定了长、宽、高三个互相垂直的方向&#xff0c;每箱货物的边都必须严格平行于长、宽、高。 小蓝希望所…