zoukankan      html  css  js  c++  java
  • Mysql数据库中的EXISTS和NOT EXISTS

    SQL语言中没有蕴含逻辑运算。但是,可以利用谓词演算将一个逻辑蕴含的谓词等价转换为:p->q ≡┐p∨q.

    我们通过一个具体的题目来分析:(具体的表和数据详见文章:Mysql数据库中的EXISTS和NOT EXISTS

    题目:查询至少选修了学生200215122选修的全部课程的学生号码。

    本查询可以用逻辑蕴含来表达:查询学号为x的学生,对所有的课程y,只要200215122学生选修了课程y,则x也选修了y。

    形式化表示如下:

    用p表示谓词“学生200215122选修了课程y”;用q表示谓词“学生x选修了课程y”.

    则上述查询为:(∀y)p->q

    该查询可以转换为如下等价形式:

    (∀y)p->q ≡ ┐(∃y(┐(p->q)))≡ ┐(∃y(┐(┐p∨q)))≡ ┐∃y(p∧┐q)

    它所表达的语义是这样的:不存在这样的课程y,学生200215122选修了y,而学生x没有选。

    对应的SQL语句:

    SELECT DISTINCT Sno
    FROM SC SCX
    WHERE NOT EXISTS 
    (SELECT * FROM SC SCY WHERE SCY.Sno='200215122' AND NOT EXISTS 
    	(SELECT * FROM SC SCZ WHERE SCZ.Sno=SCX.Sno AND SCZ.Cno=SCY.Cno)
    );
    

    首先对SCX中的第一条记录(200215121),SCY的第一条Sno='200215122'的记录进行判断,结果有数据返回,NOT EXISTS的值为假;

    然后对SCY的下一条Sno='2002151221'的记录进行判断,直到遍历完所有的SCY的Sno='200215122',NOT EXISTS的值始终为假,则中间层的WHERE的值为假,最外层的NOT EXISTS的值为真,所以第一条数据符合查询条件,存放到结果表中;

    然后对SCX中的下一条记录进行查询,直到遍历玩SCX表中所有数据。

    结果输出:


  • 相关阅读:
    递归求解的两道小练习
    unittest的前置后置,pytest的fixture和共享机制conftest.py
    pytest + allure
    Jmeter 录制 https协议是出现“您访问的不是安全链接”提示时
    Jmeter
    如何不做登录请求而获取cookie到Jmeter里
    Fiddler抓包后转成jmeter脚本
    Jmeter- 笔记12
    Jmeter- 笔记11
    Jmeter- 笔记10
  • 原文地址:https://www.cnblogs.com/riasky/p/3360952.html
Copyright © 2011-2022 走看看