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

 

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 studentwhere sno in ( select snofrom takewhere cno != 'CS112' )

2.2. sql

select *from studentwhere sno not in (select snofrom takewhere 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.agefrom student s left join take ton (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.agefrom student s, take twhere s.sno = t.sno (+)group by s.sno,s.sname,s.agehaving max(case when t.cno = 'CS112'then 1 else 0 end) = 0

2.7.2. 窗口函数解决方案

select distinct sno,sname,agefrom (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_CS112from student s, take twhere s.sno = t.sno (+)) xwhere takes_CS112 = 0

2.8. DB2

2.9. SQL Server

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

2.10.1. sql

select distinct sno,sname,agefrom (
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_CS112from student s, take ton (s.sno = t.sno)) xwhere takes_CS112 = 0

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

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

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

3.1. sql

select *from studentwhere sno in ( select snofrom takewhere cno != 'CS112'and cno != 'CS114' )

3.2. sql

select *from student s, take twhere s.sno = t.snoand t.cno in ( 'CS112', 'CS114' )and s.sno not in ( select a.snofrom take a, take bwhere a.sno = b.snoand 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,agefrom (
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_orfrom student s, take twhere s.sno = t.sno)xwhere takes_either_or = 1

3.9. PostgreSQL

3.10. MySQL

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

3.11.1. sql

select s.sno,s.sname,s.agefrom student s, take twhere s.sno = t.snogroup 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 twhere s.sno = t.snoand t.cno = 'CS112'

4.2. sql

select s.*from student s, take twhere s.sno = t.snoand s.sno not in ( select snofrom takewhere 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 snofrom takegroup by sno
having count(*) = 1) t2where s.sno  = t1.snoand t1.sno = t2.snoand 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,agefrom (
select s.sno,s.sname,s.age,t.cno,count(t.cno) over (partition by s.sno,s.sname,s.age) as cntfrom student s, take twhere s.sno = t.sno) xwhere cnt = 1and cno = 'CS112'

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

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

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

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

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

相关文章

伯俊ERP和金蝶云星空单据接口对接

伯俊ERP和金蝶云星空单据接口对接 对接源平台:金蝶云星空 金蝶K/3Cloud在总结百万家客户管理最佳实践的基础上,提供了标准的管理模式;通过标准的业务架构:多会计准则、多币别、多地点、多组织、多税制应用框架等,有效支持企业的运…

jenkins gitlab多分支构建发布

内容背景介绍 这个是新手教程,普及概念为主 公司现在还使用单分支发布测试环境和生产,多人协同开发同一个项目导致测试环境占用等待等情况 测试环境占用等待问题 测试环境代码直接合并到 master,容易导致误发布到生产的情况 避免多版本同时发布测试不完善的情况出现 中间件…

以CS32F031为例浅说国产32位MCU的内核处理器

芯片内核又称CPU内核,它是CPU中间的核心芯片,是CPU最重要的组成部分。由单晶硅制成,CPU所有的计算、接受/存储命令、处理数据都由核心执行。各种CPU核心都具有固定的逻辑结构,一级缓存、二级缓存、执行单元、指令级单元和总线接口…

django bootstrap html实现左右布局,带折叠按钮,左侧可折叠隐藏

一、实现的效果 在django项目中,需要使用bootstrap 实现一个左右分布的布局,左侧区域可以折叠隐藏起来,使得右侧的显示区域变大。(为了区分区域,左右加了配色,不好看的修改颜色即可) 点击折叠按钮,左侧区域隐藏,右侧区域铺满: 二、实现思路 1、使用col-md属性,让左…

改进的智能优化算法定性分析:收敛行为分析(Analysis of the convergence behavior )

目录 一、智能优化算法改进收敛行为分析运行结果 二、收敛性分析 三、GWO1在F1收敛性运行结果 四、改进灰狼算法GWO1 五、代码获取 一、智能优化算法改进收敛行为分析运行结果 本文以改进的灰狼算法 GWO1 为例,在 CEC2005 测试函数上进行定性分析实验。 F1:…

【前端知识】React 基础巩固(三十六)——RTK中的异步操作

React 基础巩固(三十六)——RTK中的异步操作 一、RTK中使用异步操作 引入RTK中的createAsyncThunk,在extraReducers中监听执行状态 import { createSlice, createAsyncThunk } from "reduxjs/toolkit"; import axios from "axios";export cons…

代理模式——对象的间接访问

1、简介 1.1、概述 由于某些原因,客户端不想或不能直接访问某个对象,此时可以通过一个被称为“代理”的第三者来实现间接访问,该方案对应的设计模式被称为代理模式。 代理模式是一种应用很广泛的结构型设计模式,而且变化很多。…

Elasticsearch 全文检索 分词检索-Elasticsearch文章四

文章目录 官方文档地址refercence文档全文搜索体系match简单查询match 多词/分词单字段分词match多个词的逻辑控制match的匹配精度match_pharse_prefix分词前缀方式match_bool_prefixmulti_match多字段匹配 query string类型Interval类型DSL查询之Term详解聚合查询之Bucket聚合…

图论-简明导读

计算机图论是计算机科学中的一个重要分支,它主要研究图的性质和结构,以及如何在计算机上有效地存储、处理和操作这些图。本文将总结计算机图论的核心知识点。 一、基本概念 计算机图论中的基本概念包括图、节点、边等。图是由节点和边构成的数据结构&am…

P3373 【模板】线段树 2

题目 思路 作为线段树模板题&#xff0c;这题主要考查了对lazytag以及先乘后加的使用&#xff0c; 线段树详解 因为是模板&#xff0c;所以这里证明略 代码 #include<bits/stdc.h> using namespace std; #define int long long const int maxn1e55; int n,m,p; int a[…

汽车后视镜反射率测定仪

汽车后视镜位于汽车头部的左右两侧&#xff0c;顶部以及汽车内部的前方。汽车后视镜反映汽车正后方视野、两侧视野和汽车前端区域视野&#xff0c;以便驾驶员可以间接看清楚这些位置的情况&#xff0c;它起着“第二只眼睛”的作用&#xff0c;扩大了驾驶者的视野范围&#xff0…

华为数通HCIA-ARP(地址解析协议)详细解析

地址解析协议 (ARP) ARP &#xff08;Address Resolution Protocol&#xff09;地址解析协议&#xff1a; 根据已知的IP地址解析获得其对应的MAC地址。 ARP&#xff08;Address Resolution Protocol&#xff0c;地址解析协议&#xff09;是根据IP地址获取数据链路层地址的一个…

【Ubuntu 18.04 搭建 DHCP 服务】

参考Ubuntu官方文档&#xff1a;https://ubuntu.com/server/docs/how-to-install-and-configure-isc-dhcp-server dhcpd.conf 手册页 配置&#xff1a;https://maas.io/docs/about-dhcp 实验环境规划 Ubuntu 18.04&#xff08;172.16.65.128/24&#xff09;dhcp服务端Ubuntu…

微信小程序使用editor富文本编辑器 以及回显 全屏弹窗的模式

<!--富文本接收的位置--><view class"white-box"><view class"title"><view class"yellow-fence"></view><view class"v1">教研记录</view></view><view class"add-btn"…

从零开始学python(十二)如何成为一名优秀的爬虫工程师

前言 回顾之前讲述了python语法编程 必修入门基础和网络编程&#xff0c;多线程/多进程/协程等方面的内容&#xff0c;后续讲到了数据库编程篇MySQL&#xff0c;Redis&#xff0c;MongoDB篇&#xff0c;和机器学习&#xff0c;全栈开发&#xff0c;数据分析前面没看的也不用往…

SonarQube入门 - 搭建本地环境

一、SonarQube是什么&#xff1f; SonarQube是一种自我管理的自动代码审查工具&#xff0c;可以系统地帮助您交付干净的代码。作为我们Sonar 解决方案的核心元素 &#xff0c;SonarQube 集成到您现有的工作流程中并检测代码中的问题&#xff0c;以帮助您对项目执行持续的代码检…

Meta-Transformer 多模态学习的统一框架

Meta-Transformer是一个用于多模态学习的新框架&#xff0c;用来处理和关联来自多种模态的信息&#xff0c;如自然语言、图像、点云、音频、视频、时间序列和表格数据&#xff0c;虽然各种数据之间存在固有的差距&#xff0c;但是Meta-Transformer利用冻结编码器从共享标记空间…

Linux lvs负载均衡

LVS 介绍&#xff1a; Linux Virtual Server&#xff08;LVS&#xff09;是一个基于Linux内核的开源软件项目&#xff0c;用于构建高性能、高可用性的服务器群集。LVS通过将客户端请求分发到一组后端服务器上的不同节点来实现负载均衡&#xff0c;从而提高系统的可扩展性和可…

01-1 搭建 pytorch 虚拟环境

pytorch 管网&#xff1a;PyTorch 一 进入 Anaconda 二 创建虚拟环境 conda create -n pytorch python3.9注意要注意断 VPN切换镜像&#xff1a; 移除原来的镜像 # 查看当前配置 conda config --show channels conda config --show-sources# 移除之前的镜像 conda config --…

量化:numpy基础

文章目录 ndarray创建array创建顺序数组改变数据类型nan筛选元素去重重塑 ndarray numpy最重要的一个特点是其N维数组对象ndarry&#xff0c;它是一系列同类型数据的集合 创建array ndarry的创建方式如下&#xff1a; numpy.array(object, dtype None, copy True, order …