首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

算法工程师-SQL进阶:温柔的陷阱-NULL

NULL 只是一个表示“没有值”的标记,而比较谓词只适用于值。因此,对并非值的 NULL 使用比较谓词本来就是没有意义的 。 因此,对 NULL 使用比较谓词后得到的结果总是 unknown。...按理说及格和不及格加起来应该是所有同学啊,现在为什么少一个呢,原来是表里存在一个score为null的学生。...原因是,上面的SQL中,子查询的结果中有有NULL存在,当使用谓词 not in 时,如果 in的对象中存在NULL,那其处理逻辑应该是这样的: age not in (value1,null) → age...这个为什么能正常呢?因为除count外的所有聚合函数都可以自动过滤掉NULL值。...简单总结一下: NULL 不是值,而是一种标记; 因为 NULL 不是值,所以不能对其使用谓词; 对NULL 使用谓词后的结果是 unknown; unknown 参与到逻辑运算时,SQL 的运行会和预想的不一样

85620

神奇的 SQL 之温柔的陷阱 → 三值逻辑 与 NULL !

图中蓝色部分是三值逻辑中独有的运算,这在二值逻辑中是没有的。其余的 SQL 谓词全部都能由这三个逻辑运算组合而来。从这个意义上讲,这个几个逻辑表可以说是 SQL 的母体(matrix)。     ...以下的式子都会被判为 unknown -- 以下的式子都会被判为 unknown = NULL > NULL < NULL NULL NULL = NULL     那么,为什么对 NULL 使用比较谓词后得到的结果永远不可能为真呢...为了得到正确的结果,我们需要使用 EXISTS 谓词 -- 正确的SQL 语句:马化腾和李彦宏将被查询到 SELECT * FROM t_student_B B WHERE NOT EXISTS (...同样地,我们再来一步一步地看看这段 SQL 是如何处理年龄为 NULL 的行的 -- 1....总结   1、NULL 用于表示缺失的值或遗漏的未知数据,不是某种具体类型的值,不能对其使用谓词   2、对 NULL 使用谓词后的结果是 unknown,unknown 参与到逻辑运算时,SQL 的运行会和预想的不一样

1.3K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    ​数据库原理及应用上机(实验四 SQL连接查询)

    ✨作者:命运之光 ✨专栏:数据库原理及应用上机实验 前言: 数据库原理及应用上机实验报告的一个简单整理后期还会不断完善 ✨一、实验目的和要求 1.掌握SQL Server查询分析器的使用方法,加深对...FROM Student WHERE Sdept='信息系'); 4 带谓词EXISTS的嵌套查询 【例60】 查询所有选修了编号为“1”课程的学生姓名(Sname)和所在系...由于一个学生只可能在一个系学习, 3 带谓词ANY或ALL的嵌套查询 查询非计算机系(CS)的不超过信息系所有学生的年龄的学生姓名(Sname)和年龄(Sage)。...在实验过程中,我们深入了解了 SQL 连接查询的类型(内连接、左连接、右连接和全连接),并学会了如何使用连接查询来处理多个表格之间的关系。...在实验过程中,我遇到了一些问题,如语法错误、表格字段名不匹配等等。通过反复尝试和查找相关资料,我最终解决了这些问题,并对 SQL 连接查询的使用有了更深入的理解和掌握。

    44910

    神奇的 SQL 之谓词 → 难理解的 EXISTS

    SQL 中的谓词有很多,如 =、>、 等,我们来看看 SQL 具体有哪些常用的谓词   比较谓词     创建表与初始化数据 -- 1、表创建并初始化数据 DROP TABLE IF EXISTS...age 18; SELECT * FROM tbl_student WHERE age <= 18;   LIKE     当我们想用 SQL 做一些简单的模糊查询时,都会用到 LIKE 谓词,...关于 “阶” ,有兴趣的可以区看我的另一篇博客:神奇的 SQL 之层级 → 为什么 GROUP BY 之后不能直接引用原表中的列     全称量化和存在量化       谓词逻辑中有量词(限量词、数量词...SQL 中的 EXISTS 谓词实现了谓词逻辑中的存在量词,然而遗憾的是, SQL 却并没有实现全称量词。...总结   1、SQL 中的谓词分两种:一阶谓词和二阶谓词(EXISTS),区别主要在于接收的参数不同,一阶谓词接收的是 行,而二阶谓词接收的是 行的集合;   2、SQL 中没有与全称量词相当的谓词,可以使用

    2K21

    神奇的 SQL 之性能优化 → 让 SQL 飞起来

    :神奇的 SQL 之谓词 → 难理解的 EXISTS   使用连接代替 IN     其实在平时工作当中,更多的是用连接代替 IN 来改善查询性能,而非 EXISTS,不是说连接更好,而是 EXISTS...,就能够减轻排序的负担 有效利用索引       WHERE 子句的条件里可以使用索引       HAVING 子句是针对聚合后生成的视图进行筛选的,但是很多时候聚合后的视图都没有继承原表的索引结构...使用索引   使用索引是最常用的 SQL 优化手段,这个大家都知道,怕就怕大家不知道:明明有索引,为什么查询还是这么慢(为什么索引没用上)   关于索引未用到的情况,可查看:神奇的 SQL 之擦肩而过...HAVING 子句和聚合操作是同时执行的,所以比起生成临时表后再执行 WHERE 子句,效率会更高一些,而且代码看起来也更简洁   需要对多个字段使用 IN 谓词时,将它们汇总到一处     SQL-92...这段代码中用到了两个子查询,我们可以进行列汇总优化,把逻辑写在一起 ?

    95720

    为什么 GROUP BY 之后不能直接引用原表中的列

    那为什么会有 ONLY_FULL_GROUP_BY 模式呢 ? 我们继续往下看 阶   阶(order)是用来区分集合或谓词的阶数的概念。谓词逻辑中,根据输入值的阶数对谓词进行分类。...= 或者 BETWEEEN 等输入值为一行的谓词叫作"一阶谓词",而像 EXISTS 这样输入值为行的集合的谓词叫作"二阶谓词"(HAVING 的输入值也是集合,但它不是谓词)。...简单点如下图   谈到了阶,就不得不谈下集合论;集合论是 SQL 语言的根基,因为它的这个特性,SQL 也被称为面向集合语言。只有从集合的角度来思考,才能明白 SQL 的强大威力。...a ≠ {a}   这两个层级的区别分别对应着 SQL 中的 WHERE 子句和 HAVING 子句的区别。...总结   1、SQL 严格区分层级,包括谓词逻辑中的层级(EXISTS),也包括集合论中的层级(GROUP BY);   2、有了层级区分,那么适用于个体上的属性就不适用于团体了,这也就是为什么聚合查询的

    1.7K10

    神奇的 SQL 之层级 → 为什么 GROUP BY 之后不能直接引用原表中的列

    那为什么会有 ONLY_FULL_GROUP_BY 模式呢 ? 我们继续往下看 阶   阶(order)是用来区分集合或谓词的阶数的概念。谓词逻辑中,根据输入值的阶数对谓词进行分类。...= 或者 BETWEEEN 等输入值为一行的谓词叫作"一阶谓词",而像 EXISTS 这样输入值为行的集合的谓词叫作"二阶谓词"(HAVING 的输入值也是集合,但它不是谓词)。...以此类推,三阶谓词=输入值为"集合的集合"的谓词,四阶谓词=输入值为"集合的集合的集合"的谓词,但是 SQL 里并不会出现三阶 以上的情况,所以不用太在意。简单点如下图 ?   ...a ≠ {a}   这两个层级的区别分别对应着 SQL 中的 WHERE 子句和 HAVING 子句的区别。...总结   1、SQL 严格区分层级,包括谓词逻辑中的层级(EXISTS),也包括集合论中的层级(GROUP BY);   2、有了层级区分,那么适用于个体上的属性就不适用于团体了,这也就是为什么聚合查询的

    2.2K20

    SQL命令 WHERE(一)

    指定字段 WHERE子句最简单的形式是指定一个比较字段和值的谓词,例如WHERE Age > 21。...在条件表达式中指定日期或时间时,可能由于SQL模式与日期或时间格式不匹配,或由于无效的日期或时间值而发生错误。 WHERE子句条件表达式必须使用与当前模式相对应的日期或时间格式。...它对应的数据类型为VARBINARY,默认MAXLEN为32749。 因此,动态SQL不能在WHERE子句比较中使用%List数据。...例如,WHERE %NOINDEX Age >= 1。 离群值的谓词条件 如果动态SQL查询中的WHERE子句选择了一个非空的离群值,可以通过将离群值文字括在双括号中来显著提高性能。...要最优地选择这个值,应该指定WHERE Home_State=(('MA'))。 在嵌入式SQL或视图定义中不应使用此语法。 在嵌入式SQL或视图定义中,总是使用离群值选择,不需要特殊编码。

    3K20

    数据库优化:SQL高性能优化指南,助你成就大神之路!

    A WHERE EXISTS (SELECT * FROM Class_B B WHERE A.id = B.id); 为啥使用 EXISTS 的 SQL 运行更快呢,有两个原因...子句,效率会更高,代码也更简洁 10、需要对多个字段使用 IN 谓词时,将它们汇总到一处 一个表的多个字段可能都使用了 IN 谓词,如下: SELECT id, state, city FROM...WHERE A1.id = A2.id); 这段代码用到了两个子查询,也就产生了两个中间表,可以像下面这样写 SELECT * FROM Addresses1 A1 WHERE id || state...15、 简单字符串表达式 模型字符串可以使用 _ 时, 尽可能避免使用 %, 假设某一列上为 char(5) 不推荐 SELECT first_name, last_name,...20、 使用 EXPLAIN 来查看 SQL 执行计划 上个点说了,可以使用 EXPLAIN 来分析 SQL 的执行情况,如怎么发现上文中的最左匹配原则不生效呢,执行 「EXPLAIN + SQL 语句

    86920

    GROUP BY 后 SELECT 列的限制:which is not functionally dependent on columns in GROUP BY clause

    谓词逻辑中,根据输入值的阶数对谓词进行分类。...= 或者 BETWEEEN 等输入值为一行的谓词叫作"一阶谓词",而像 EXISTS 这样输入值为行的集合的谓词叫作"二阶谓词"(HAVING 的输入值也是集合,但它不是谓词)。...简单点如下图   谈到了阶,就不得不谈下集合论;集合论是 SQL 语言的根基,因为它的这个特性,SQL 也被称为面向集合语言。只有从集合的角度来思考,才能明白 SQL 的强大威力。...a ≠ {a}   这两个层级的区别分别对应着 SQL 中的 WHERE 子句和 HAVING 子句的区别。...总结   1、SQL 严格区分层级,包括谓词逻辑中的层级(EXISTS),也包括集合论中的层级(GROUP BY);   2、有了层级区分,那么适用于个体上的属性就不适用于团体了,这也就是为什么聚合查询的

    3.2K50

    SQL性能优化基础|技术创作特训营第一期

    SQL 的书写规范在介绍一些技巧之前,有必要强调一下规范,这一点我发现工作中经常被人忽略,其实遵循好的规范可读性会好很多,应该遵循哪些规范呢1、 表明要有意义,且标准 SQL 中规定表名的第一个字符应该是字母...WHERE col_1 > 100 or col_1 的类型转换假设 col 是 char 类型,则推荐使用以下第二,三条 SQL 的写法,不推荐第一条 SQL 的写法× SELECT...10、需要对多个字段使用 IN 谓词时,将它们汇总到一处一个表的多个字段可能都使用了 IN 谓词,如下:SELECT id, state, city FROM Addresses1 A1 WHERE...这段代码用到了两个子查询,也就产生了两个中间表,可以像下面这样写SELECT * FROM Addresses1 A1 WHERE id || state || city IN (SELECT id...15、 简单字符串表达式模型字符串可以使用 _ 时, 尽可能避免使用 %, 假设某一列上为 char(5)不推荐SELECT first_name, last_name, homeroom_nbr

    38620

    数据库sql嵌套查询题_sql子查询嵌套优化

    一、嵌套查询概念 在sql语言中,一个select-from-where语句成为一个查询块,将一个查询块嵌套在另一个查询块的where子句或having短语的条件中的查询成为嵌套查询。...= , 例如:子查询是查询学生表中姓名为张三的学生所在的系,父查询是查询该系所有学生的姓名和学号。张三只能在一个系,所以子查询的结果是单个值,可以使用比较运算符连接。...带有in谓词的子查询 用在where子句中用来判断查询的属性是否在多个值的列表中。...而使用any(some)或all谓词时则必须同时使用比较运算符,或者说any或all是为了配合比较运算符而产生的。 2.4 带有exists谓词的子查询 exists直译就是存在,代表存在量词。...带有exists谓词的子查询不返回任何数据,只产生逻辑真值”true“或逻辑假值”false“。它只查找满足条件的那些记录。一旦找到第一个匹配的记录后,就马上停止查找。

    2.7K10

    SQL 进阶技巧(上)

    的一些进阶使用技巧 SQL 的优化方法 SQL 的书写规范 在介绍一些技巧之前,有必要强调一下规范,这一点我发现工作中经常被人忽略,其实遵循好的规范可读性会好很多,应该遵循哪些规范呢 1、 表名要有意义...(SELECT * FROM Class_B B WHERE A.id = B.id); 为啥使用 EXISTS 的 SQL 运行更快呢,有两个原因 可以`用到索引,如果连接列 (id)...SomeTable WHERE col_1 > 100 or col_1 < 100; 七、进行默认的类型转换 假设 col 是 char 类型,则推荐使用以下第二,三条 SQL 的写法,不推荐第一条...子句,效率会更高,代码也更简洁 10、需要对多个字段使用 IN 谓词时,将它们汇总到一处 一个表的多个字段可能都使用了 IN 谓词,如下: SELECT id, state, city FROM...WHERE A1.id = A2.id); 这段代码用到了两个子查询,也就产生了两个中间表,可以像下面这样写 SELECT * FROM Addresses1 A1 WHERE id || state

    1.1K20

    SQL进阶-9-谓词exists使用

    SQL进阶-9-EXISTS谓词的使用 支撑SQL和关系数据库的两个重要理论基础: 数学领域的集合论 现代逻辑学标准体系的谓词逻辑(predicate logic) 本文中重点介绍的是谓词exists的用法...(一般的谓词逻辑中没有unknown,但是SQL采用的是三值逻辑,因此具有三种值) exists属于二阶谓词,is、between等属于一阶谓词 ?...,exists实现的是存在量词 SQL中没有实现全称量词的函数或者谓词 但是全称量词和存在量词二者之前可以相互转换 所有的x都满足条件P:不存在不满足条件P的x 存在满足条件P的x:并非所有的x...SQL实现 -- 不推荐 select * from Tablename where col1 = 1 and col2 = 1 ... and col10 = 1; -- 当列属性多的时候这个方法不适用...,col10) is null; 小结 SQL谓词指的是返回值为真值的函数 EXISTS与其他谓词不同,接受的参数是集合;可以看做是一种高阶函数 SQL中没有实现全称量词相当的谓词,但是可以通过not

    1.1K20

    一个执行计划解析的小问题分析(r9笔记第37天)

    ; 对我来说拼成动态SQL也是分分钟,但是这种方式不推荐,还是推荐使用数据的结果集方式来匹配。 所以我可以根据id拼接成insert语句,或者直接使用外部表来关联。...一个简单的键值关联的语句,执行计划竟然如此的查,来看看瓶颈在哪里。 ?...可以从谓词信息看出,里面做了数据类型的转换,根据ID这个字段值数据类型应该是varchar2,是不需要转换为number类型的。...这个表的结构如下: ?...那么问题来了,是不是执行计划对于字段的校验存在疏漏呢,我们来简单测试几个小例子。 发现在常见的表关联中还是能够校验出来的。 ? 再来看看exists的方式是否也有问题。发现也是可以检测出来的。

    52760

    3.4 《数据库系统概论》之数据查询—SELECT(单表查询、连接查询、嵌套查询、集合查询、多表查询)

    */ FROM SC WHERE Cno= '2'); 子查询的限制: ·不能使用ORDER BY子句· 层层嵌套方式反映了 SQL语言的结构化 有些嵌套查询可以用连接运算替代 (2)不相关子查询...与ANY或ALL谓词配合使用 例:假设一个学生只可能在一个系学习,并且必须属于一个系,则在[例39]可以用= 代替IN: SELECT Sno,Sname,Sdept FROM Student WHERE...谓词 存在量词 ∃ 带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。...EXISTS谓词的子查询等价替换 用EXISTS/NOT EXISTS实现全称量词(难点) SQL语言中没有全称量词∀(For all) 可以把带有全称量词的谓词转换为等价的带有存在量词的谓词:.../NOT EXISTS实现逻辑蕴函(难点) SQL语言中没有蕴函(Implication)逻辑运算 可以利用谓词演算将逻辑蕴函谓词等价转换为: [例47]查询至少选修了学生201215122选修的全部课程的学生号码

    6.1K20
    领券