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表中所有数据。

结果输出:

Mysql数据库中的EXISTS和NOT EXISTS的更多相关文章

  1. MySQL数据库中delimiter的作用概述

    以下的文章主要是向大家描述的是MySQL数据库中delimiter的作用是什么?我们一般都认为这个命令和存储过程关系不大,到底是不是这样的呢?以下的文章将会给你相关的知识,望你会有所收获. 其实就是告 ...

  2. 【转】mysql数据库中实现内连接、左连接、右连接

    [转]mysql数据库中实现内连接.左连接.右连接 内连接:把两个表中数据对应的数据查出来 外连接:以某个表为基础把对应数据查出来 首先创建数据库中的表,数据库代码如下: /* Navicat MyS ...

  3. python制作简单excel统计报表3之将mysql数据库中的数据导入excel模板并生成统计图

    python制作简单excel统计报表3之将mysql数据库中的数据导入excel模板并生成统计图 # coding=utf-8 from openpyxl import load_workbook ...

  4. PHP往mysql数据库中写入中文失败

    该类问题解决办法就是 在建立数据库连接之后,将该连接的编码方式改为中文. 代码如下: $linkID=@mysql_connect("localhost","root&q ...

  5. MySQL存储引擎的实际应用以及对MySQL数据库中各主要存储引擎的独特特点的描述

    MySQL存储引擎的实际应用以及对MySQL数据库中各主要存储引擎的独特特点的描述: 1.MySQL有多种存储引擎: MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB(Berk ...

  6. 从Mysql数据库中导入导出表结构

    1.从Mysql数据库中导入sql表 很简单,只需要一个命令即可搞定:[root@localhost ~]# mysql -uroot -piweb_xxx_mysql iweb < modif ...

  7. 从SQLSERVER/MYSQL数据库中随机取一条或者N条记录

    从SQLSERVER/MYSQL数据库中随机取一条或者N条记录 很多人都知道使用rand()函数但是怎麽使用可能不是每个人都知道 建立测试表 USE [sss] GO ,NAME ) DEFAULT ...

  8. 在mysql数据库中制作千万级测试表

    在mysql数据库中制作千万级测试表 前言: 最近准备深入的学一下mysql,包括各种引擎的特性.性能优化.分表分库等.为了方便测试性能.分表等工作,就需要先建立一张比较大的数据表.我这里准备先建一张 ...

  9. Oracle数据库中实现mysql数据库中auto-increment功能

    在Mysql数据库中,想要实现一条数据的自增一功能(即插入此数据时填写null即可,系统自动+1),可直接在所在列使用语句auto-increment. id int primary key auto ...

随机推荐

  1. 使用win8时删除自带的输入法的好方法

    无直接把那个语言都删了,再直接装输入法就行了.

  2. nide.js(二)文件I/O

    文件I/O fs模块的基本用法 node.js中提供一个名为fs的模块来支持I/O操作,fs模块的文件I/O是对标准POSIX函数的简单封装. 1.writeFile函数的基本用法 文件I/O,写入是 ...

  3. MySQL-python 1.2.3 for Windows and Python 2.7, 32bit and 64bit versions -(亲测可用)

    MySQL-python 1.2.3 for Windows and Python 2.7, 32bit and 64bit versions - See more at: http://www.co ...

  4. JSP基础——关于中文乱码问题

    乱码问题十分烦人,今天在写一个登陆的demo时,表单中需要提交的中文姓名,如下代码 <form action="success.jsp" name="success ...

  5. python3.5之mysql扩展

    最近在学习廖雪峰的python3的教程,这是官方http://www.liaoxuefeng.com/,建议大家想学习python的同学可以去看看,真的是在网上能找到的最好文本教程,没有之一 在廖老实 ...

  6. phpcms-v9 --- 如何通过{pc}标签获取全站文章内容?

    1.phpcms-v9默认情况下只能根据catid获取当前栏目及子栏目下的文章,但是有时候我们需要如何通过{pc}标签来获取全站文章内容的需求,应该怎么做呢? 第一步:在content_tag.cla ...

  7. virtualbox 虚拟机网络设置

    1.宿主机网卡设置 virtualbox 第一块网卡设置 virtualbox第二块网卡设置 2.虚拟机网络设置 找到以上设置中MAC地址对应的那个网卡: 配置网络: 重启网络,ok.

  8. java 执行linux命令

    原文地址: http://blog.csdn.net/xh16319/article/details/17302947 package scut.cs.cwh; import java.io.Inpu ...

  9. linux----命令替换

    0.命令替换.它的大概意思是.命令在脚本中只起一个站位符的作用:在命令运行时它会被命令自己的执行结果所替换. 1.使用格式: 1.$(command) 2.`command` 2.使用举例: 1.:打 ...

  10. ArcGIS Engine DEM拉伸渲染

    从符号库中取出渲染使用的色带对象IColorRamp(也可以自己定义色带内容) <pre name="code" class="csharp">IS ...