数据库作业八—嵌套查询、EXISTS、集合查询、基于派生表的查询

2023-05-16

嵌套查询

接着上一篇说
带有EXISTS谓词的查询
EXISTS:存在
带有EXISTS 谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。
如果返回true,主查询会执行,返回false,主查询就不再执行。
因为带有EXISTS谓词的子查询不返回数据,指定列名没有多大意义,所以一般目标列表达式都用*代替
一旦找到第一个匹配的记录后(true),就马上停止查找。

先来个例子
查询所有选修了1号课程的学生的姓名

SELECT
Sname
FROM Student
WHERE EXISTS
     (SELECT *
     FROM SC
     WHERE Sno=Student.Sno AND Cno='1')

在这里插入图片描述

--与上边那个例子相反
SELECT Sname
FROM Student
WHERE NOT EXISTS
	(SELECT *
	FROM SC
	WHERE Sno=Student.Sno AND Cno= '1')

在这里插入图片描述
带有IN谓词,比较运算符,ANY|ALL谓词的子查询可以用带EXISTS谓词的子查询替换
例如:仍查询与 刘晨 在同系的学生的信息

--以前的写法
SELECT
Sno,Sname,Sdept
FROM Student
WHERE Sdept IN
           (SELECT Sdept
           FROM Student
           WHERE Sname = N'刘晨')

--使用EXISTS谓词的写法
SELECT
Sno,Sname,Sdept
FROM Student S1
WHERE EXISTS
      (SELECT *
      FROM Student S2
      WHERE S1.Sdept=S2.Sdept AND S2.Sname=N'刘晨')

SQL中没有全称量词,可以利用离散中的逻辑转化,将全称量词转换为存在量词
( ∀ x ) P ≡ ¬ ( ∃ x ( ¬ P ) ) (\forall x)P \equiv \neg (\exists x(\neg P)) (x)P¬(x(¬P))

来个例子:
1. 查询选修了全部课程的学生,可以转化一下,选修了全部课程的学生=没有课程是该学生没有选的

--使用EXISTS的写法
SELECT Sname
FROM Student
WHERE NOT EXISTS
      (SELECT *
      FROM Course
      WHERE NOT EXISTS
            (SELECT *
            FROM SC
            WHERE SC.Cno = Course.Cno
             AND Student.Sno=SC.Sno)
      )
      
 --不用EXISTS的写法
 --这种写法是我看到这个问题时的所想到的第一种方法
 --这个方法,我感觉,没有什么逻辑上的难度,
 --相比于使用EXISTS的写法,这种写法就显得臃肿
 SELECT Student.Sname,Student.Sno
 FROM Student
 WHERE Student.Sno=(
 					SELECT
 					SC.Sno
 					FROM SC
 					INNER JOIN Course ON SC.Cno=Course.Cno
 					GROUP BY Sno
 					HAVING COUNT(*)=(SELECT COUNT(*) FROM Course)
					)

在这里插入图片描述
能用EXISTS的时候,还是建议使用EXISTS,EXISTS的执行效率还是挺高的,并且可以对空值进行判断。

先将三张表的数据列出来
在这里插入图片描述
带有EXISTS关键词的执行过程
进入第一层:取Student表中的一个Sno值‘201215121’
进入第二层:取Course表中的一个Cno值‘1’
进入第三层:判断SC表中是否存在Sno=‘201215121’ 并且Cno=‘1’这样的元组,经过NOT EXISTS的取反,存在F,不存在就是T—— 结果F
返回第二层:取第二个Cno值‘2’
进入第三层:判断是否存在Sno=‘201215121’ 并且Cno=‘2’这样的元组,结果取反 —— 结果F

返回第二层:取最后一个Cno值‘7’
进入第三层:判断是否存在 Sno=‘201215121’ 并且Cno=‘7’这样的元组,结果取反 —— 结果F
得到第二层的结果是:F∨F∨F∨F∨F…∨F = F
返回第一层的结果:T(NOT EXISTS再次取反)
结果为T,所以将Sno='201215121’学生的学生姓名取出放入结果表中。
进入第一层:取第二个Sno值‘201215122’
再次重复以上的操作。

2. 使用EXISTS关键词实现逻辑蕴含
p → q ≡ ¬ p ∨ q p \rightarrow q \equiv \neg p \vee q pq¬pq
当年离散差点挂了,就不在这解释这是什么意思了。
例子:
查询至少选修了学号201215122选修的全部课程的学生学号

也就是查询学修的课程里包含学生201215122选修的课的学生学号

SELECT DISTINCT Sno
FROM SC SCX
WHERE NOT EXISTS
      (SELECT *
      FROM SC SCY
      WHERE SCY.Sno = '201215122' 
         AND NOT EXISTS
            (SELECT *
            FROM SC SCZ
            WHERE Sno = SCX.Sno
              AND Cno = SCY.Cno)
       )

在这里插入图片描述
执行过程
在这里的SCX,SCY,SCZ都是SC表。
1.从SCX中取第一个Sno 201215121
2.进入第二层从SCY中,取SCY中第一个Sno,WHERE后 SCY.Sno=‘201215122’这个条件直接干掉SCY中一堆Sno取值为201215121的情况,全为F,当Sno为201215122时
3.进入第三层,从SCZ中取第一个元组的Sno,Cno,并根据WHERE后的条件进行判断,存在满足条件Sno = SCX.Sn AND Cno = SCY.Cno的,为T,返回再经NOT EXISTS作用,最终返回F
4.最终第二层的结果为F,返回经NOT EXISTS作用,最终返回T,SCX的第一个元组的SNO放入结果集中。
5.在从SCX中取第二个元组的Sno,再重复上述2、3、4执行过程
最后获得最终结果

集合查询

并—UNION|UNION ALL
交—INTERSECT
差—EXCEPT

参与集合操作的表的列数,数据类型必须相同

例题:
查询CS系中学生年龄不大于19岁的学生

SELECT *
FROM Student
WHERE Sdept = 'CS'
UNION
SELECT *
FROM Student
WHERE Sage <= 19

在这里插入图片描述
UNION和UNION ALL都是讲查询结果合并起来,UNION会去掉重复的元组,而UNION ALL会保留重复的元组

查询CS系与年龄不大于19岁的学生的交集

SELECT *
FROM Student
WHERE Sdept = 'CS'
INTERSECT
SELECT *
FROM Student
WHERE Sage <= 19

在这里插入图片描述
查询CS系学生与年龄不大于19岁学生的差集

SELECT *
FROM Student
WHERE Sdept = 'CS'
EXCEPT
SELECT *
FROM Student
WHERE Sage <= 19

在这里插入图片描述

基于派生表的查询

将一个查询结果集作为另一个查询源,及出现在FROM子句中,必须要为派生表起个别名

查询每个学生超出他选修课平均成绩的课程号

SELECT SC.Sno,Cno
FROM SC,(SELECT Sno,AVG(Grade) as avg_grade
         FROM SC
         GROUP BY Sno)
         AS Avg_sc
WHERE SC.Sno = Avg_sc.Sno AND SC.Grade >= avg_grade

在这里插入图片描述

SELECT语句的一般形式

SELECT [ALL|DISTINCT]
<目标列表达式> [别名][,<目标列表达式> [别名]]...
FROM <表名或视图名> [别名]
     [,<表名或视图名> [别名]]...
     |(<SELECT语句>)[AS <别名>]
[WHERE<条件表达式>]
[GROUP BY <列名1>[HAVING <条件表达式>]]
[ORDER BY <列名2>[ASC|DESC]];

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据库作业八—嵌套查询、EXISTS、集合查询、基于派生表的查询 的相关文章

  • 超精简ubuntu的GPU配置(实测好用)

    一 安装英伟达 GPU 驱动 安装ubuntu后运行以下命令来升级内核版本 sudo apt get update sudo apt get upgrade 以下命令会将与你系统相兼容的驱动版本显示出来 sudo add apt repos
  • 在线升级R语言版本以及在RStudio容纳最新版本的R

    文章目录 1 升级R语言版本2 RStudio容纳最新版本的R3 参考资料 1 升级R语言版本 第一步 install packages 34 installr 34 安装 第二步 library installr 加载 第三步 updat
  • 傅里叶变换 ~ 什么是傅里叶变换?

    文章目录 1 什么是傅里叶变换 xff1f 2 为什么要进行傅里叶变换 xff1f 1 什么是傅里叶变换 xff1f 将时域的信号 xff0c 变换到频域的正弦信号 傅里叶变换是数字信号处理领域一种很重要的算法 要知道傅里叶变换算法的意义
  • 全国天气预报查询接口

    小编在此向大家介绍拥有105亿 43 调用量的产品 xff0c 该接口文档清晰 xff0c 对接方便 xff0c 还有服务很好 一 接口介绍 通过坐标区域 IP 地名 景点名称 电话区号或邮编等有效信息可查询天气情况 xff08 天气状况
  • 使用C++的CCF-CSP满分解决方案 202112-2 序列查询新解 含详细注释

    思路 最开始想挨个数计算fi和gi xff0c 这样只能拿70分 xff0c 想要拿全 xff0c 必须根据区间来划分 具体来说 xff0c 每次以r为单位移动 xff0c 每个区间长度为r xff0c 根据区间的左右值移动序列的下标 还是
  • UltraISO 帮你把U盘当光盘用

    UltraISO是款功能强大的光盘工具 xff0c 官方对其的概括是Handle CD and DVD Images with Ease xff0c 对我们就是要让处理CD和DVD镜像变得简单 现在这款软件的最新版本是UltraISO 9
  • Python基础语法一:Markdown的使用

    1 标题 在文字前加 xff08 个数可以使1 6个 xff0c 个数不同 xff0c 标题级别不同 xff09 用户管理 xff08 二级标题 xff09 三级标题 六级标题 2 代码块 xff08 代码引用 xff09 语法 xff1a
  • 《计算机科学》期刊投稿心得

    今日胃痛难忍 xff0c 无法静心 xff0c 遂分享一下投稿心得 这本期目前是北大核心 xff0c CCF B 上不上 xff0c 下不下的排名 xff0c 感叹一句 xff0c 中文核心太难中了 xff0c 越来越难中的感觉 2020年
  • IDEA MAVEN 项目 打包文件到指定目录

    像上一篇文章 xff0c 我们提到的 xff0c IDEA MAVEN struts项目中 xff0c 如果我们把 struts xml 文件放在 src 目录下 xff0c 编译的时候 xff0c 将无法打包到 WEB INF class
  • kali安装配置git

    kali安装配置git 安装图形界面 sudo apt install git cola 配置全局忽略 git config global core excludesfile root global gitignore vim root g
  • Freerdp2中sfreerdp在windows中运行

    了解 client Sample 下的freerdp c xff0c 有助于了解freerdp的结构 当然首先 xff0c 需要先在windows 中成功编译freerdp链接 然后可以看到Debug目录下会生成freerdp2 lib f
  • freerdp在windows中的编译(with openh264)

    我自己编译的node freerdp2模块在window 7中会莫名其妙的报一个错误 google上说跟windows的media foundation相关 xff0c 更莫名其妙的是 xff0c 重装系统后100 复现 但是看到最后一个报
  • 配置Linux网络,远程连接(NAT模式)

    配置Linux网络 xff0c 远程连接 xff08 NAT模式 xff09 1 打开vmware xff1a 编辑 gt 虚拟网络编辑器 xff0c 检查VMnet8中nat模式的子网IP NAT设置 xff0c 打开 NAT设置 xff
  • 根据Django Model动态生成sql的方法

    转自 xff1a http blog csdn net wenxuansoft article details 8039011 当定义好Django Model后 xff0c 一般可以在初始化调用Syncdb方法来自动在数据库里面生成相应的
  • jetty禁用http put和delete等方法的方式

    1 基于xml的配置方式 lt security constraint gt lt display name gt Example Security Constraint lt display name gt lt web resource
  • 《Qt5 C++ GUI Programming cook book 》笔记 1

    一 xff0c 前言 第一章 xff0c 使用QT Designer 和QT Quick Designer自定义设计用户界面 第二章 xff0c 通过增强的状态机框架和动画框架 xff0c 制作用户界面动画 第三章 xff0c 使用QT内建
  • 时间机器 Time Machine 三星T7 移动硬盘SSD解决方案

    Content 时间机器 Time Machine 三星T7 移动硬盘SSD解决方案1 简介2 硬盘分区3 时间机器4 文件格式5 Bug 时间机器 Time Machine 三星T7 移动硬盘SSD解决方案 1 简介 时间机器 xff08
  • SonarQube代码质量检查平台

    前言 xff1a code review xff1a 随着业务的发展 xff0c 系统越来越庞大 xff0c 原本简单稳定的功能 xff0c 可能在不断迭代后复杂度上升 xff0c 潜在的风险也随之暴露 xff0c 导致最终服务不稳定 xf
  • C++报错:The build tools for v141 (Platform Toolset = 'v141') cannot be found.

    问题内容 The build tools for v141 Platform Toolset 61 39 v141 39 cannot be found To build using the v141 build tools please
  • centos7+mysql5.7安装

    1 在官方网站下载linux版本的mysql xff0c 网址 xff1a https dev mysql com downloads mysql 2 解压文件并存放在 usr local mysql 5 7 20 路径下 xff08 1

随机推荐

  • Shell编程——位置参数变量

    介绍 当我们执行一个shell脚本时 xff0c 如果希望获取到命令行的参数信息 xff0c 就可以使用到位置参数变量 比如 xff1a myshell sh 100 200 这个就是一个执行shell的命令行 xff0c 可以在myshe
  • CentOS安装python2.7

    查版本 whereis python python2 7安装 1 下载 xff1a wget https www python org ftp python 2 7 11 Python 2 7 11 tar xz wget https ww
  • 单机版Ceph环境部署,Linux平台

    Ceph已经如火如荼 xff0c 很多公司都在使用Ceph作为自己的存储系统 日常学习不太可能安装一个Ceph集群 xff0c 因此本文介绍如何部署一个单节点的Ceph系统 另外 xff0c 本文安装的后端存储引擎是BlueStore xf
  • Ubuntu 升级 Python3.10

    参考文档 Upgrade Python to latest version 3 10 on Ubuntu Linux
  • 2022免费国内天气查询接口

    一个可以根据IP地址或者城市名称查询天气的免费接口 xff0c 支持国内3400 43 个城市天气 请求地址 GET https api itapi cn api tianqi 请求参数 参数名参数说明key用户请求密钥 xff0c 可在
  • PHP远程文件包含(RFI)并绕过远程URL包含限制

    文章来源 xff5c MS08067 公众号粉丝投稿 本文作者 xff1a VastSky xff08 Ms08067实验室粉丝 xff09 前言 本文我们讲如何绕过远程URL包含限制 在PHP开发环境php ini配置文里 allow u
  • 内网渗透 | 最全的内网凭据密码收集方法和技巧总结

    内网凭据密码收集指南 原创投稿作者 xff1a 深蓝实验室天威战队 前言 在攻防场景下 xff0c 红队人员拿下一台终端或服务器后 xff0c 第一步要做的往往就是信息收集 xff0c 为最大化利用权限 xff0c 扩大战果 xff0c 密
  • vi 命令

    最近面试有问常用操作 虽然修改用的还蛮多的 xff0c 但有的还确实不知道 xff01 在这里记录下 xff1a vi编辑器的三种模式 1 命令模式 xff08 command mode xff09 执行命令 在该模式中 xff0c 可以输
  • ubuntu下给code-server配置https

    下载mkcert wget wget https github com FiloSottile mkcert releases download v1 4 4 mkcert v1 4 4 linux amd64 将下载好的mkcert移动到
  • 【算法】选择排序法

    一 介绍 1 选择排序法是将序列分为两段 xff0c 有序前列和无序后列 xff0c 每次查找无序后列中最大元素 xff0c 将其插入到有序前列的最末尾处 xff0c 直至无序后列最后一个元素 xff0c 最终排序后的序列为降序序列 2 适
  • VMware WorkStation的三种网络连接方式

    版权声明 xff1a 对于本博客所有原创文章 xff0c 允许个人 教育和非商业目的使用 xff0c 但务必保证文章的完整性且不作任何修改地以超链接形式注明原始作者 出处及本声明 博客地址 xff1a http blog csdn net
  • lz4压缩格式-block

    概述 lz4属于lz77系列的压缩算法 xff0c lz77系列压缩算法将重复的字符串 xff08 也称为匹配 xff09 表示成 xff08 offset match length xff09 来对数据进行压缩 lz77算法只是一种思想
  • lz4算法实现

    概述 lz4算法是lz77算法的一种实现 xff0c 就是查找重复的字符串 xff0c 重复的字符串使用 距离 长度 来表示 比如abcdefgabcdefg xff0c 被压缩后就表示成了 xff1a abcdefg xff0c 1 7
  • 光传输-政企OTN技术总结

    政企高质量专线承载网 xff08 OTN xff09 维护承接 政企OTN xff1a 政企高质量专线承载网络 xff1b 目的是为了支持政企专线和云网融合业务的发展 xff0c 提高竞争力 政企OTN的特点 端到端 xff1a 用户接入设
  • Windows安装Anaconda,conda显示不是内部命令或者外部命令,路径加上反斜杠解决

    Windows安装Anaconda conda显示不是内部命令或者外部命令 提示 xff1a 这里可以添加系列文章的所有文章的目录 xff0c 目录需要自己手动添加 这个问题是故事的开始 xff0c 由于电脑是win10 1050ti的 x
  • debian6对罗技摄像头C270——音视频采集

    0 debian6对罗技C270无驱摄像头 带MIC 的支持 0 1视频 0 1 1设备节点 dev video0 0 1 2驱动框架 V2L或V4L2 0 2音频 0 2 0准备工具 gome volume control xff1a g
  • AAC编码

    AAC编码 本篇使用的FFMPEG需要按照WIN下编译FFMPEG 基本要求 fdk aac对PCM文件有参数要求 采样格式 必须是16位整数的PCM 采样率 支持的采样率有 xff08 Hz xff09 xff1a 8000 11025
  • 【超分辨率】Zoom to Learn, Learn to Zoom

    前几天陈启峰大佬在我司内部分享几篇关于图像增强的文章 其中就有这篇 这篇文章是超分辨率落地的一个比较重要的文章 xff0c 跟以往自己去做高 低分辨率数据集不同 xff0c 本文采取了单反直接去制作数据集 xff0c 在真实场景上效果非常好
  • 4-26获取请求体数据 只有post方式时有

    注意这里保险点就是action写全路径就不用管别的了 注意一个问题 html中表单的action 这里的action中只写了 demo08 注意要跟运行的编辑配置中对应 如果划线地方只有 http localhost 80 则action应
  • 数据库作业八—嵌套查询、EXISTS、集合查询、基于派生表的查询

    嵌套查询 接着上一篇说 带有EXISTS谓词的查询 EXISTS 存在 带有EXISTS 谓词的子查询不返回任何数据 xff0c 只产生逻辑真值 true 或逻辑假值 false 如果返回true xff0c 主查询会执行 xff0c 返回