网站地图    收藏   

主页 > 后端 > mysql数据库 >

MySql数据查询的逻辑蕴含条件问题 - mysql数据库栏

来源:自学PHP网    时间:2015-04-16 10:51 作者: 阅读:

[导读] MySql数据查询的逻辑蕴含条件问题SQL语言中没有蕴含逻辑运算。但是,可以利用谓词演算将一个逻辑蕴含的谓词等价转换为:p-q equiv;┐por;q 我们通过一个具体的题目来分析:题目:查询...

MySql数据查询的逻辑蕴含条件问题
 
SQL语言中没有蕴含逻辑运算。但是,可以利用谓词演算将一个逻辑蕴含的谓词等价转换为:p->q ≡┐p∨q.
 
我们通过一个具体的题目来分析:
 
题目:查询至少选修了学生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语句:
 
[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表中所有数据。
结果输出:
 

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论