SQL查漏补缺

news2024/12/24 3:15:45

有这么一道题,先看题目,表的内容如下
在这里插入图片描述

显示GDP比非洲任何国家都要高的国家名称(一些国家的GDP值可能为NULL)。

错误的查询:

SELECT name FROM bbc
 WHERE gdp > ALL (SELECT gdp FROM bbc WHERE region = 'Africa')

正确的查询:

SELECT name FROM bbc
 WHERE gdp > (SELECT MAX(gdp) FROM bbc WHERE region = 'Africa')

or

SELECT name FROM bbc
 WHERE gdp > ALL (SELECT gdp FROM bbc WHERE region = 'Africa' AND gdp IS NOT NULL)

发现第一种查询的问题在哪儿了吗?注意题目中的一句话:GDP可能为NULL。这里有个知识点就是ALLMAX的区别。

ALL

ALL是SQL中的一种限定谓词,它可以和比较谓词一起使用,用来表达“与所有的xx都相等”,或“比所有的xx都大”的意思。请看以下两张表:
Class_B.table:
在这里插入图片描述
ClassA.table


接下来,我们查询“比B班住在东京的所有学生年龄都小的A班学生”的SQL语句:

SELECT * FROM Class_A WHERE age < ALL(SELECT age FROM CLassB WHERE city = '东京');

执行结果是:

nameagecity
拉里19埼玉

查询到的只有比山田年龄小的拉里,到这里都没有问题。但是如果山田年龄为NULL,就会有问题了。凭直觉来说,此时查询到的可能是比22岁的齐藤年龄小的拉里和伯杰。然而,这条SQL执行的结果是空。这是因为ALL谓词其实是多个以AND连接的逻辑表达式的省略写法,具体分析步骤如下:

1.执行子查询获取年龄列表
SELECT * FROM Class_A WHERE age < ALL(22,23,null);

2.将ALL谓词改写成AND
SELECT * FROM Class_A WHERE (age < 22) AND (age<23) AND(age < NULL);

3.对NULL使用“<”后,结果变为unknown

4.如果AND运算里包含unknown,则结果不为true
SELECT * FROM Class_A WHERE false 或 unknown;

回到一开始的题目,正因为存在gdp为null的数据,用ALL谓词是得不到结果的,除非使用极值函数max/min,或者在ALL语句中加入限定条件gdp is not null。

ALL 与 极值函数

用极值函数重写刚才的SQL:

SELECT * From Class_A Where age < (Select MIN(age) from Class_B Where city='东京');

执行结果:

nameagecity
拉里19埼玉
伯杰21千叶

即使山田的年龄为null,这段代码也能查询到拉里和伯杰,这是因为极值函数在统计时把为NULL的数据排除掉了。这样的话任何时候使用极值函数岂不是都是更安全的?也许有人会这么想。

然而,ALL谓词和极值函数表达的含义本就不同:

  • ALL: 他的年龄比在东京住的所有学生都要小
  • 极值函数:他的年龄比在东京住的年龄最小的学生都要小

在现实世界中,两者结果一致,意思相同。但是当表里存在NULL时它们时不等价的,还有一种情况下它们也是不等价的。

当谓词的深入为空集的情况。
Class_B表中没有住在东京的学生!

这时使用ALL会查询到A班的所有学生。然而使用极值函数则查询不到任何数据。这是因为极值函数在输入为空表时会返回NULL。因此使用极值函数的SQL语句会像下面这样执行:

1.极值函数返回NULL
SELECT * From Class_A Where age < NULL;

2.对NULL使用“<”后结果转为unknown
select * from Class_A where unkonwn;

实际上,当输入为空表时,除COUNT以外的聚合函数都会查询不到任何数据。

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

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

相关文章

C++ 11 pair

class pair 可将两个 value视为一个单元。C标准库内多处用到了这个 class 。尤其是容器 map、multimap、unordered_map和 unordered_multimap就是使用 pair 来管理其以 key/value pair形式存在的元素。任何函数如果需要返回两个 value&#xff0c;也需要用到 pair&#xff0c;例…

Windows使用Stable Diffusion时遇到的各种问题和知识点整理(更新中...)

Stable Diffusion安装完成后&#xff0c;在使用过程中会出现卡死、文件不存在等问题&#xff0c;在本文中将把遇到的问题陆续记录下来&#xff0c;有兴趣的朋友可以参考。 如果要了解如何安装sd&#xff0c;则参考本文《Windows安装Stable Diffusion WebUI及问题解决记录》。如…

九龙证券|盘前直接腰斩,银行巨头紧急“拔网线”!美股银行股又崩了?

见证历史了&#xff0c;又有一家银行巨子倒下&#xff1f; 美股银行股团体暴降 上一交易日暴降超60%的硅谷银行持续面对腥风血雨。盘前&#xff0c;硅谷银行跌幅超50%&#xff0c;随后&#xff0c;公司宣布盘前暂停交易&#xff0c;等待刊发消息。 而最新消息显现&#xff0c…

Spring Cloud Gateway 超时、CORS配置 | Spring Cloud 17

一、Http超时配置 Spring Cloud Gateway 可以为所有路由配置 Http 超时&#xff08;响应和连接&#xff09;&#xff0c;并为每个特定路由覆盖设置。 1.1 全局超时 配置全局 http 超时&#xff1a; connect-timeout必须以毫秒为单位指定。response-timeout必须指定为 java.…

[qiankun+nuxt]子应用请求本地文件报错404

前言 目前公司的前端架构是qiankunnuxt做的微前端项目 问题说明 在子应用中&#xff0c;前端需要模拟一些数据&#xff0c;方便后期演示调整而不需要重新打包 所以将一些数据存储到了本地的json文件中&#xff0c;但是获取时报了404的错误&#xff0c;找不到该文件。 页面报错…

Springboot是什么

目录 为什么会要用springboot 1、之前 2、现在 springboot优点 springboot四大核心 自动装配介绍 1、自动装配作用是什么 2、自动装配原理 springboot starter是什么 1、starter作用 2、比如&#xff1a;我们想搭建java web框架 3、starter原理 SpringBootApplica…

ROS小车研究笔记3/11/2023:多点导航及其源码实现

多点导航操作 打开导航launch文件 roslaunch turn_on_wheeltec_robot navigation.launch rviz 在rviz里&#xff0c;选择publish point在地图上点击标记目标点。在标记多个目标点后小车会按标记顺序依次在各个目标点中往返 多点导航对于话题MarkerArray。需要在rviz中使marke…

网页基本标签、图像标签、链接标签、块内元素和块元素、列表标签、表格标签

一、网页基本标签 标题标签 段落标签 未写段落标签前&#xff0c;文本没有按照想要的格式排列显示 写段落标签后&#xff1a; 每句都是一段&#xff0c;所以句与句距离比较宽 换行标签 同一段&#xff0c;只是把文字换行&#xff0c;所以比较紧凑 水平线标签 字体样式标签 …

【深度学习】神经网络和深度学习--卷积和池化的作用

深度学习通常指训练大型深度的神经网络的过程。 与传统的神经网络模型相比&#xff0c;深度学习模型在结构上与之非常相似&#xff1b;不同的是&#xff0c;深度学习模型的“深度”更大&#xff0c;“深度”的体现就是神经网络层数多&#xff0c;神经网络每一层的结点数多。 本…

# 关于Docker容器中时间时区问题的测试

关于Docker容器中时间时区问题的测试 文章目录关于Docker容器中时间时区问题的测试1 基础知识1.1 /etc/localtime1.2 /etc/timezone2 我在gitlab中遇到的问题与解决方法3 ubuntu官方镜像时区相关问题的测试3.0 官方原版测试3.1 不设置任何参数测试3.2 只设置TZ"Asia/Shang…

Spring Cloud Gateway 监控、多网关实例路由共享 | Spring Cloud 18

一、监控 Actuator是Spring Boot提供的用来对应用系统进行监控的功能模块&#xff0c;借助于Actuator开发者可以很方便地对应用系统某些监控指标进行查看、统计等。 Actuator的核心是端点Endpoint。 Endpoint可以让我们监视应用程序并与其交互。Spring Boot包含许多内置端点…

rapidcsv 写csv文件实例

csv实质是一个文本文件&#xff0c;可以使用rapidcsv写文件操作&#xff0c;如下实例&#xff1a; 第一行实质是从-1行开始&#xff0c;列是从0开始 #include "rapidcsv.h" #include <string> using namespace std; void CMFCApplication1Dlg::OnBnClickedBu…

【flask】URL和视图映射

目录 首页 传参 URL数据类型 get传参 首页 url与视图函数的映射是通过app.route()装饰器实现的。 只有一个斜杠代表的是根目录——首页。 传参 URL传参是通过<参数名称>的形式进行传递。URL中有几个参数&#xff0c;在视图函数中也要指定几个参数 from flask im…

WattOS:一个稳又快的轻量级 Linux 发行版

导读Linux 领域里的每个人不是听说过就是使用过某个轻量级的 Linux 发行版。大家都知道我们不断追求的是&#xff1a;占用内存少&#xff0c;配置资源要求低&#xff0c;包含一个轻量级的桌面环境&#xff08;或者窗口管理器&#xff09;&#xff0c;并且提供和其他发行版相似的…

从官网下载/处理 MNIST 数据集,并构造CNN网络训练

这里写自定义目录标题MNIST 网络 测试用1. 导入所需要的模块2. 下载 MNIST 数据集3. 读取 MNIST 数据集MNIST 网络 测试用 1. 导入所需要的模块 import sys sys.path.append(../../) from zfdplearn import fdutils, fdtorch_net, fddata import os import os.path as path i…

# 数据完整性算法在shell及python中的实践

数据完整性算法在shell及python中的实践 文章目录数据完整性算法在shell及python中的实践1 预备知识1.1 摘要算法1.2 报文&#xff08;数据&#xff09;完整性校验1.3 python byte类型字符串与普通字符串区别2 传统方法&#xff08;散列函数&#xff09;2.1 在shell中实践2.2 在…

python调试模块ipdb

1. 调试python ipdb是用来python中用以交互式debug的模块&#xff0c;可以直接利用pip安装; 其功能类似于pycharm中 python控制台&#xff0c; 而使用ipdb 的优点&#xff0c;便是直接在代码中调试&#xff0c; 避免了在python控制台&#xff0c;或者重新设置一些简单变量。…

Web前端开发--自用

第一章 1.1 时间&#xff1a;1980 人物&#xff1a;Tim Berners-Lee 地点&#xff1a;欧洲核子研究组织中最大的欧洲核子物理实验室 事件&#xff1a;与Robert Cailliau建立ENQUIRE系统 1984年&#xff0c;世界上第一个客户端浏览器&#xff08;World Wide Web&#xff09;和第…

软考高项——配置管理

配置管理配置管理配置管理6个主要活动配置项配置基线配置项的状态配置库配置库权限管理配置审计配置管理 配置管理的总线索包括&#xff1a; 1&#xff09;配置管理6个主要活动 2&#xff09;配置项 3&#xff09;配置基线 4&#xff09;配置项的状态 5&#xff09;配置库 6&a…

SAP SQVI快速报表的使用

SQVI快速报表 一、说明 对数据表进行查询通常使用SE16&#xff0c;但只限于单张表&#xff0c;对于多表联动的查询&#xff0c;则需要通过创建Query的方式&#xff0c;方法有多种&#xff0c;而SQVI是一种简洁快速的工具。SQVI全称是Quick Viewer&#xff0c;可以快速生成多表…