选读SQL经典实例笔记16_逻辑否定

news2025/1/15 21:06:11

 

1. 示例数据

1.1. student

insert into student values (1,'AARON',20)
insert into student values (2,'CHUCK',21)
insert into student values (3,'DOUG',20)
insert into student values (4,'MAGGIE',19)
insert into student values (5,'STEVE',22)
insert into student values (6,'JING',18)
insert into student values (7,'BRIAN',21)
insert into student values (8,'KAY',20)
insert into student values (9,'GILLIAN',20)
insert into student values (10,'CHAD',21)

1.2. courses

insert into courses values ('CS112','PHYSICS',4)
insert into courses values ('CS113','CALCULUS',4)
insert into courses values ('CS114','HISTORY',4)

1.3. professor

insert into professor values ('CHOI','SCIENCE',400,45)
insert into professor values ('GUNN','HISTORY',300,60)
insert into professor values ('MAYER','MATH',400,55)
insert into professor values ('POMEL','SCIENCE',500,65)
insert into professor values ('FEUER','MATH',400,40)

1.4. take

insert into take values (1,'CS112')
insert into take values (1,'CS113')
insert into take values (1,'CS114')
insert into take values (2,'CS112')
insert into take values (3,'CS112')
insert into take values (3,'CS114')
insert into take values (4,'CS112')
insert into take values (4,'CS113')
insert into take values (5,'CS113')
insert into take values (6,'CS113')
insert into take values (6,'CS114')

1.5. teach

insert into teach values ('CHOI','CS112')
insert into teach values ('CHOI','CS113')
insert into teach values ('CHOI','CS114')
insert into teach values ('POMEL','CS113')
insert into teach values ('MAYER','CS112')
insert into teach values ('MAYER','CS114')

2. 问题1:没有选修过CS112课程的学生

2.1. sql

select *
  from student
 where sno in ( select sno
                  from take
                 where cno != 'CS112' )

2.2. sql

select *
  from student
 where sno not in (select sno
                     from take
                    where cno = 'CS112')

2.3. 要记住真正的逻辑否定要求两个步骤,即为了找出‘哪些人不是’,就要先找出‘哪些人是’,然后再排除掉他们

2.4. PostgreSQL

2.5. MySQL

2.6. 使用CASE表达式和聚合函数MAX标识一个学生是否选修了CS112课程

2.6.1. sql

select s.sno,s.sname,s.age
  from student s left join take t
    on (s.sno = t.sno)
 group by s.sno,s.sname,s.age
having max(case when t.cno = 'CS112'
                then 1 else 0 end) = 0

2.7. Oracle

2.7.1. group by解决方案

select s.sno,s.sname,s.age
   from student s, take t
  where s.sno = t.sno (+)
  group by s.sno,s.sname,s.age
 having max(case when t.cno = 'CS112'
                 then 1 else 0 end) = 0

2.7.2. 窗口函数解决方案

select distinct sno,sname,age
   from (
 select s.sno,s.sname,s.age,
        max(case when t.cno = 'CS112'
                 then 1 else 0 end)
        over(partition by s.sno,s.sname,s.age) as takes_CS112
   from student s, take t
  where s.sno = t.sno (+)
        ) x
  where takes_CS112 = 0

2.8. DB2

2.9. SQL Server

2.10. 使用CASE表达式和窗口函数MAX OVER

2.10.1. sql

select distinct sno,sname,age
  from (
select s.sno,s.sname,s.age,
       max(case when t.cno = 'CS112'
                then 1 else 0 end)
       over(partition by s.sno,s.sname,s.age) as takes_CS112
  from student s, take t
    on (s.sno = t.sno)
       ) x
 where takes_CS112 = 0

2.11. 外连接到TAKE表是为了确保把那些没有选修任何课程的学生也能被筛选出来

2.12. 调用MAX函数找出最大的CASE表达式返回值

3. 问题2:只选修了CS112和CS114中的一门,而不是两门都选的学生

3.1. sql

select *
  from student
 where sno in ( select sno
                  from take
                 where cno != 'CS112'
                   and cno != 'CS114' )

3.2. sql

select *
  from student s, take t
 where s.sno = t.sno
   and t.cno in ( 'CS112', 'CS114' )
   and s.sno not in ( select a.sno
                      from take a, take b
                     where a.sno = b.sno
                       and a.cno = 'CS112'
                       and b.cno = 'CS114' )

3.3. 使用自连接找出同时选修了CS112和CS114的学生

3.4. 使用子查询从选修了CS112或CS114的学生中把同时选了两门的学生剔除掉

3.5. DB2

3.6. Oracle

3.7. SQL Server

3.8. CASE表达式和窗口函数SUM OVER

3.8.1. sql

select distinct sno,sname,age
  from (
select s.sno,s.sname,s.age,
       sum(case when t.cno in ('CS112','CS114') then 1 else 0 end)
       over (partition by s.sno,s.sname,s.age) as takes_either_or
  from student s, take t
 where s.sno = t.sno
       )x
 where takes_either_or = 1

3.9. PostgreSQL

3.10. MySQL

3.11. CASE表达式和聚合函数SUM

3.11.1. sql

select s.sno,s.sname,s.age
  from student s, take t
 where s.sno = t.sno
 group by s.sno,s.sname,s.age
having sum(case when t.cno in ('CS112','CS114')
                then 1 else 0 end) = 1

3.12. 内连接STUDENT表和TAKE表,这样就排除了那些没有选修任何课程的学生

3.13. 使用CASE表达式标记一个学生是否选修了这两门课程中的一门

3.14. 函数SUM会把每个学生对应的1都累加起来

4. 问题3:选修了CS112,而且没有选修其他课程的学生

4.1. sql

select s.*
  from student s, take t
 where s.sno = t.sno
   and t.cno = 'CS112'

4.2. sql

select s.*
  from student s, take t
 where s.sno = t.sno
   and s.sno not in ( select sno
                        from take
                       where cno != 'CS112' )

4.3. 子查询负责找出至少选修了一门课,但又没有选修CS112的所有学生

4.4. 外层查询负责找出选修了一门课程(任意课程),并且不在上述子查询的返回结果的学生

4.5. STUDENT表和TAKE表之间的连接操作过滤掉没有选修任何课程的学生

4.6. PostgreSQL

4.7. MySQL

4.8. 使用聚合函数COUNT确保下列查询返回的学生只选修了一门课程

4.8.1. sql

select s.*
  from student s,
       take t1,
       (
select sno
   from take
 group by sno
having count(*) = 1
       ) t2
 where s.sno  = t1.sno
   and t1.sno = t2.sno
   and t1.cno = 'CS112'

4.8.2. 使用内嵌视图T2找出只选修了一门课程的学生

4.8.3. 连接内嵌视图T2到TAKE表,并且筛选出选修CS112课程的学生

4.8.4. 在内嵌视图T2和TAKE表连接查询的基础上再次连接STUDENT表,找出匹配的学生

4.9. DB2

4.10. Oracle

4.11. SQL Server

4.12. 使用窗口函数COUNT OVER

4.12.1. sql

select sno,sname,age
  from (
select s.sno,s.sname,s.age,t.cno,
       count(t.cno) over (
         partition by s.sno,s.sname,s.age
       ) as cnt
  from student s, take t
 where s.sno = t.sno
       ) x
 where cnt = 1
   and cno = 'CS112'

4.12.2. 窗口函数解决方案处理方式上稍有不同(更有效率)

4.12.3. 内嵌视图X返回了每一个学生、他们选修的课程以及他们选修了几门课程

4.12.4. 获得了每个学生选修的课程和课程数目之后,最后只要保留CNT等于1并且CNO等于CS112的行即可

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

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

相关文章

Java内存溢出的排查工具和方法

JVM内存溢出事故回顾 JVM内存溢出的排查方法个工具介绍 事故回顾 • 9:58收到报警,资讯延时1小时。 • 10:10排查出接口全部超时,超时时间2s。 • 去运维那边执行jstat发现元空间沾满了,疯狂fgc。 • 执行jmap -dump 并下载。 • 使用MAT分…

VLAN原理+配置

目录 一, 以太网二层交换机 二,三层架构: 三,VLAN配置思路 1.创建vlan 2.接口划入vlan 3.trunk干道 4.vlan间路由器 5.DHCP池塘配置 四,华为VLAN部分的接口模式讲解: 五,华为VLAN部分的…

【雕爷学编程】MicroPython动手做(30)——物联网之Blynk 2

知识点:什么是掌控板? 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED…

阿里云出品—高分计算机好书推荐榜

1、云原生架构白皮书 云原生是一种构建和运行应用程序的方法,它能实现构建应用简便快捷,部署应用轻松自如,越来越多公司和个人选择使用云原生技术。《云原生架构白皮书》作为业界首本全方位构建云原生架构规划与实践全景图的白皮书&#xff…

【牛客】统计字符

⭐️ 题目描述 🌟 OJ链接:HJ40 统计字符 ps: 判断字符可以直接使用头文件自带的函数。 函数作用iscntrl判断是否为控制字符isspace判断是否为空白字符(空格、换页’\f’、换行’\n’、回车’\r’、制表符’\t)isdigi…

「应用实时监控 ARMS 」斩获「根因分析技术」先进级认证

阿里云云原生可观测 ARMS 率先斩获「根因分析技术」先进级认证 7 月 25 日,由中国信通院发起的“2023 可信云-系统稳定性”首批评估结果在可信云大会现场公布,应用实时监控服务 ARMS 斩获《可观测性标准体系要求 - 根因分析技术分级能力要求》“先进级”…

Pytorch深度学习之余弦退火学习率设置

1. 什么是余弦退火学习率? 余弦退火学习速率调度是改进深度神经网络学习过程的常用方法。当深度神经网络在大型数据集上训练时,它尤其有用,因为在大型数据集中,学习过程可能会陷入局部极小值。在训练过程中,学习率以不…

OpenMMLab【超级视客营】——把类别信息加入可视化结果中(MMSegmentation的第二个PR)

文章目录 1. 任务说明1.0 新手指引1.1 任务目标1.2 提交格式 2. 实施2.1 可视化的形式2.2 拉分支和提交PR2.2.1 拉分支2.2.2 提交PR 2.3 MMSegmentation中关于可视化的内容2.3.1 文档说明2.3.2 相关PR(确定要修改的文件)2.3.3 提交时的代码测试 2.4 发现…

java实现5种不同的验证码图片,包括中文、算式等,并返回前端

导入以下依赖 <!--图片验证码--><dependency><groupId>com.github.whvcse</groupId><artifactId>easy-captcha</artifactId><version>1.6.2</version></dependency> 编写controller package com.anXin.user.controlle…

Tessy 4.3.18

Tessy 4.3.18 windows 2692407267qq.com&#xff0c;更多内容请见http://user.qzone.qq.com/2692407267/

【无标题】uniapp引入萤石云 真机无法运行 踩坑集合

Uniapp 接入萤石云 踩坑 1.先用了 UIKit Javascript 就是在 pc端 那套流程 npm install ezuikit-jsimport EZUIKit from ezuikit-js;这套流程貌似只适用于pc端&#xff0c;我在接入uniapp的时候没看官网 以为都是一套流程&#xff0c;然后就在uniapp中也来了这一套&#xff0…

vue+neo4j(neo4j desktop安装和使用)

vueneo4j&#xff08;neo4j desktop安装和使用&#xff09; 本文目录 vueneo4j&#xff08;neo4j desktop安装和使用&#xff09;官网下载安装基本使用创建项目新增数据库连接数据库 使用cypher构建简单知识图谱创建节点创建关系删除节点及关系查询节点和关系 数据导出为json文…

分布式锁(Redis分布式锁)

Redis分布式锁原理及应用 前言一、基本原理1.1 什么是分布式锁1.2 分布式锁满足的条件1.3 常见的分布式锁 二、Redis分布式锁的实现核心思路2.1 实现分布式锁时需要实现的两个基本方法2.2 核心思路 三、实现分布式锁版本四、Redis分布式锁误删情况说明4.1 逻辑说明4.2 解决方案…

FreeRTOS(4):软件定时器、中断管理

目录 一、延时函数 延时函数分类 vTaskDelay 与 HAL_Delay 的区别 二、软件定时器 什么是定时器&#xff1f; 软件定时器优缺点 软件定时器原理 软件定时器相关配置 单次定时器和周期定时器 1. 创建软件定时器 2. 开启软件定时器 3. 停止软件定时器 4. 复位软件定时…

【剑指 Offer 27】二叉树的镜像

题目&#xff1a; 请完成一个函数&#xff0c;输入一个二叉树&#xff0c;该函数输出它的镜像。 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 输入输出样例 思考1&#xff1a; 二叉树的镜像&#xff0c;就是交换二叉树的每个节点的左右结点 所…

应用在多媒体手机中的低功率立体声编解码器

多媒体手机一般是指可以录制或播放视频的手机。多媒体的定义是多种媒体的综合&#xff0c;一般是图像、文字、声音等多种结合&#xff0c;所以多媒体手机是可以处理和使用图像文字声音相结合的移动设备。目前流行的多媒体概念&#xff0c;主要是指文字、图形、图像、声音等多种…

【数据结构】图文并茂,通过逻辑图带你轻松拿捏链表,实现各种接口功能(2)

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;我们接着之前讲过的顺序表来继续介绍初阶数据结构的内容&#xff0c;今天给大家带来的是有关链表的基本知识和各种接口功能的实现的第二部分。 好了&#xff0c;废话不…

Gitignore忽略文件

默认情况下&#xff0c;Git会监视我们项目中的所有内容&#xff0c;但是有些内容比如mode_modules中的内容&#xff0c;我们不希望他被Git所管理。 我们可以在我们项目目录中添加一个 .gitignore 文件来设置那些需要git忽略的文件。

Burpxss自动化测试工具validator配置和使用教程

一、配置教程 下载Phantomjs&#xff1a; http://phantomjs.org/download.html 下载xss.js https://github.com/nVisium/xssValidator 将xss.js和phantomjs.exe放在一起 利用phantomjs运行xss.js C:\xss>phantomjs.exe xss.js Bapp store里搜索xss validator,然后安装它 安…

基于jeecg-boot的flowable流程提供一种动态设置发起人部门负责人的方式

更多功能看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbacheng/nbcio-boot 前端代码&#xff1a;https://gitee.com/nbacheng/nbcio-vue.git 在线演示&#xff08;包括H5&#xff09; &#xff1a; http://122.227.135.243:9888 这里给大家提供一种…