草庐IT

读SQL进阶教程笔记07_EXISTS谓词

躺柒 2023-04-09 原文

1. 特点

1.1. 将多行数据作为整体来表达高级的条件

1.2. 使用关联子查询时性能仍然非常好

1.3. EXISTS的参数不像是单一值

1.3.1. 参数是行数据的集合

2. 什么是谓词

2.1. 一种特殊的函数,返回值是真值

2.2. 返回值都是true、false或者unknown

2.2.1. 一般的谓词逻辑里没有unknown

2.2.2. SQL采用的是三值逻辑,因此具有三种真值

2.3. 谓词逻辑提供谓词是为了判断命题(可以理解成陈述句)的真假

2.3.1. 为命题分析提供了函数式的方法

2.4. 只有能让WHERE子句的返回值为真的命题,才能从表(命题的集合)中查询到

3. 谓词的阶

3.1. 阶(order)是用来区分集合或谓词的阶数的概念

3.2. 一阶谓词

3.2.1. =或者BETWEEEN等输入值为一行的谓词

3.3. 二阶谓词

3.3.1. EXISTS这样输入值为行的集合的谓词

3.3.2. 谓词也是函数的一种,因此我们也可以说EXISTS是高阶函数

3.4. 三阶谓词

3.4.1. 输入值为“集合的集合”的谓词

3.5. 四阶谓词

3.5.1. 输入值为“集合的集合的集合”的谓词

3.6. SQL里并不会出现三阶以上的情况

4. SELECT子句的列表

4.1. 通配符:SELECT *

4.2. 常量:SELECT ‘这里的内容任意’

4.3. 列名:SELECT col

5. 全称量化和存在量化

5.1. 形式语言没必要同时显式地支持EXISTS和FORALL两者

5.1.1. 因为全称量词和存在量词只要定义了一个,另一个就可以被推导出来

5.1.2. ∀ xPx = ¬ ∃ x¬P

5.1.3. 所有的x都满足条件P=不存在不满足条件P的x

5.1.4. ∃ xPx = ¬ ∀ x¬Px

5.1.5. 存在x满足条件P=并非所有的x都不满足条件P

5.2. SQL支持EXISTS,不支持FORALL

5.2.1. SQL中没有与全称量词相当的谓词,可以使用NOT EXISTS代替

5.3. 全称量词

5.3.1. 所有的x都满足条件P

5.4. 存在量词

5.4.1. 存在(至少一个)满足条件P的x

6. 查询表中“不”存在的数据

6.1. 示例

6.1.1.

6.1.1.1.

 SELECT DISTINCT M1.meeting, M2.person
      FROM Meetings M1 CROSS JOIN Meetings M2;

6.1.1.2. 所有人都参加了全部会议时

6.1.1.3. --求出缺席者的SQL语句(1):存在量化的应用

    SELECT DISTINCT M1.meeting, M2.person
      FROM Meetings M1 CROSS JOIN Meetings M2
     WHERE NOT EXISTS
          (SELECT *
              FROM Meetings M3
            WHERE M1.meeting = M3.meeting
              AND M2.person = M3.person);
6.1.1.3.1. ----求出缺席者的SQL语句(2):使用差集运算
    SELECT M1.meeting, M2.person
      FROM Meetings M1, Meetings M2
    EXCEPT
    SELECT meeting, person
      FROM Meetings;
6.1.1.3.2. NOT EXISTS直接具备了差集运算的功能

7. “肯定⇔双重否定”之间的转换

7.1. 示例

7.1.1.

7.1.2. 所有科目分数都在50分以上

7.1.2.1. 没有一个科目分数不满50分

7.1.3.

SELECT DISTINCT student_id
      FROM TestScores TS1
     WHERE NOT EXISTS                --不存在满足以下条件的行
            (SELECT *
              FROM TestScores TS2
              WHERE TS2.student_id = TS1.student_id
                AND TS2.score < 50);    --分数不满50分的科目

7.1.4. 某个学生的所有行数据中,如果科目是数学,则分数在80分以上;如果科目是语文,则分数在50分以上。

7.1.4.1.

SELECT DISTINCT student_id
      FROM TestScores TS1
     WHERE subject IN (’数学’, ’语文’)
      AND NOT EXISTS
            (SELECT *
              FROM TestScores TS2
              WHERE TS2.student_id = TS1.student_id
                AND 1 = CASE WHEN subject =’数学’AND score < 80 THEN 1
                            WHEN subject =’语文’AND score < 50 THEN 1
                            ELSE 0 END);
7.1.4.1.1.
SELECT student_id

      FROM TestScores TS1
     WHERE subject IN (’数学’, ’语文’)
      AND NOT EXISTS
            (SELECT *
              FROM TestScores TS2
              WHERE TS2.student_id = TS1.student_id
                AND 1 = CASE WHEN subject =’数学’AND score < 80 THEN 1
                            WHEN subject =’语文’AND score < 50 THEN 1
                            ELSE 0 END)
     GROUP BY student_id
    HAVING COUNT(*) = 2;   --必须两门科目都有分数
7.1.4.1.2. EXISTS和HAVING有一个地方很像,即都是以集合而不是个体为单位来操作数据

8. 集合VS谓词

8.1. 示例

8.1.1.

8.1.2. 查询出哪些项目已经完成到了工程1

8.1.2.1. --查询完成到了工程1的项目:面向集合的解法

    SELECT project_id
      FROM Projects
     GROUP BY project_id
    HAVING COUNT(*) = SUM(CASE WHEN step_nbr <= 1 AND status =’完成’THEN 1
                            WHEN step_nbr  > 1 AND status =’等待’THEN 1
                            ELSE 0 END);
8.1.2.1.1. --查询完成到了工程1的项目:谓词逻辑的解法
    SELECT *
      FROM Projects P1
     WHERE NOT EXISTS
          (SELECT status
            FROM Projects P2
            WHERE P1.project_id = P2. project_id      --以项目为单位进行条件判断
              AND status <> CASE WHEN step_nbr <= 1   --使用双重否定来表达全称量化命题
                              THEN ’完成’
                              ELSE ’等待’ END);
8.1.2.1.1.1. 性能好。只要有一行满足条件,查询就会终止
8.1.2.1.1.2. 结果里能包含的信息量更大

9. 对列进行量化

9.1. 示例::查询全是1的行

9.1.1. --“列方向”的全称量化:不优雅的解答

    SELECT *
      FROM ArrayTbl
     WHERE col1 = 1
      AND col2 = 1
          ·
          ·
          ·
      AND col10 = 1;

9.1.1.1. --“列方向”的全称量化:优雅的解答

    SELECT *
      FROM ArrayTbl
     WHERE 1 = ALL (col1, col2, col3, col4, col5, col6, col7, col8, col9, col10);

9.2. 示例:至少有一个9

9.2.1. --列方向的存在量化(1)

    SELECT *
      FROM ArrayTbl
     WHERE 9 = ANY (col1, col2, col3, col4, col5, col6, col7, col8, col9, col10);

9.2.1.1. --列方向的存在量化(2)

    SELECT *
      FROM ArrayTbl
     WHERE 9 IN (col1, col2, col3, col4, col5, col6, col7, col8, col9, col10);
9.2.1.1.1. 这种写法也是被允许的
9.2.1.1.2. 如果左边不是具体值而是NULL,这种写法就不行了

9.2.2. --查询全是NULL的行:错误的解法

    SELECT *
      FROM ArrayTbl
     WHERE NULL = ALL (col1, col2, col3, col4, col5, col6, col7, col8, col9, col10);

9.2.2.1. --查询全是NULL的行:正确的解法

    SELECT *
      FROM ArrayTbl
     WHERE COALESCE(col1, col2, col3, col4, col5, col6, col7, col8, col9, col10) IS NULL;

10. C.J. Date曾经这样调侃过:数据库这种叫法有点名不副实,它存储的与其说是数据,还不如说是命题

有关读SQL进阶教程笔记07_EXISTS谓词的更多相关文章

  1. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  2. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  3. 在VMware16虚拟机安装Ubuntu详细教程 - 2

    在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主

  4. hadoop安装之保姆级教程(二)之YARN的配置 - 2

    1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模

  5. Hive SQL 五大经典面试题 - 2

    目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类

  6. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  7. ruby - 你会如何在 Ruby 中表达成语 "with this object, if it exists, do this"? - 2

    在Ruby(尤其是Rails)中,您经常需要检查某物是否存在,然后对其执行操作,例如:if@objects.any?puts"Wehavetheseobjects:"@objects.each{|o|puts"hello:#{o}"end这是最短的,一切都很好,但是如果你有@objects.some_association.something.hit_database.process而不是@objects呢?我将不得不在if表达式中重复两次,如果我不知道实现细节并且方法调用很昂贵怎么办?显而易见的选择是创建一个变量,然后测试它,然后处理它,但是你必须想出一个变量名(呃),它也会在内存中

  8. sql - 在 Rails Console for PostgreSQL 的表中显示数据 - 2

    我找到了这样的东西:Rails:Howtolistdatabasetables/objectsusingtheRailsconsole?这一行没问题:ActiveRecord::Base.connection.tables并返回所有表但是ActiveRecord::Base.connection.table_structure("users")产生错误:ActiveRecord::Base.connection.table_structure("projects")我认为table_structure不是Postgres方法。如何列出Postgres数据库的Rails控制台中表中的所有

  9. ruby - 在 RUBY 上的 PADRINO 框架上使用 RSPEC 进行测试的教程 - 2

    我是Ruby新手,并被要求在我们的新项目中使用它。我们还被要求使用Padrino(Sinatra)作为后端/框架。我们被要求使用Rspec进行测试。我一直在寻找可以指导在Padrino上使用RspecforRuby的教程。我得到的主要是引用RoR。但是,我需要RubyonPadrino。请在任何入门/指南/引用/讨论等方面指导我。如有不妥之处请指正。可能是我没有针对我的问题搜索正确的词/短语组合。我正在使用Ruby1.9.3和Padrinov.0.10.6。注意:我还提到了SOquestion,但它没有帮助。 最佳答案 我没用过Pa

  10. ruby - 防止SQL注入(inject)/好的Ruby方法 - 2

    Ruby中防止SQL注入(inject)的好方法是什么? 最佳答案 直接使用ruby?使用准备好的语句:require'mysql'db=Mysql.new('localhost','user','password','database')statement=db.prepare"SELECT*FROMtableWHEREfield=?"statement.execute'value'statement.fetchstatement.close 关于ruby-防止SQL注入(inject

随机推荐