sql——数据查询中的小例子

数据查询的一个小例子

说明

需要基本的数理逻辑知识和数据库知识

题目

(以学生-课程数据库为例)(例子选自《数据库系统概论》(第五版))

Student表

学号 Sno姓名 Sname性别 Ssex年龄 Sage所在系 Sdept
201215121李勇20CS
201215122刘晨19CS
201215123王敏18MA
201215125张立19IS

Course表

课程号 Cno课程名 Cname先行课 Cpno学分 Ccredit
1数据库54
2数学2
3信息系统14
4操作系统63
5数据结构74
6数据处理2
7PASCAL语言64

SC表

学号 Sno课程名 Cno成绩 Grade
201215121192
201215121285
201215121388
201215122290
201215122380

问:查询至少选修了学生201215122选修的90分以上(含90分)全部课程的学生名字?

解题思路

(1) 明确最终目标——学生姓名(Sname——位于Student表)
(2) 学生的分数位于SC表,该题不需要用到Course表
(3) 一种可行的思路是:该题只涉及两个表——SC和Student,SC用于记录选课记录,一个学生通常有多条选课记录,也就是说,Student表的记录实际问题中应该比SC表中少很多。因此我们可以对Student表一条一条浏览,判断该记录是不是符合题目条件的学生。
(4) 我们对该题进行“中文翻译”:对任意一个Student表的学生X,对SC任意一条选课记录Y,如果这门课学生201215122选了,并且学生20121512该门课的成绩大于等于90分,那么就有 学生X选了Y中的那门课。
(5) 数理逻辑表示:
∀ x ∈ S t u d e n t ,   ∀ y ∈ S C ,   ( p ∧ q ) → r p : 学 生 201215122 选 了 y . C n o q : 学 生 201215122 该 课 成 绩 y . G r a d e ≥ 90 r : x 选 了 该 门 课 y . C n o \forall x\in Student,~\forall y\in SC,~(p\wedge q)\to r\\ p:学生201215122选了 y.Cno \\q:学生201215122该课成绩 y.Grade\ge 90 \\r: x选了该门课y.Cno xStudent, ySC, (pq)rp:201215122y.Cnoq:201215122y.Grade90r:xy.Cno
注:(4)中的那么就有在数理逻辑中体现为 蕴含“ → \to
∀ x ∀ y ( ( p ∧ q ) → r ) \forall x\forall y((p\wedge q)\to r) xy((pq)r)
但是,在sql语句中并没有任意,只有存在,需要对我们的表达式进行改写
∀ x : ┐ ∃ y ┐ ( ┐ ( p ∧ q ) ∨ r ) ∀ x : ┐ ∃ y ( p ∧ q ∧ ┐ r ) \forall x:\urcorner\exist y\urcorner(\urcorner(p\wedge q)\vee r) \\ \forall x:\urcorner\exist y(p\wedge q\wedge\urcorner r) x:y((pq)r)x:y(pqr)

SELECT Sname
FROM Student X
WHERE NOT EXISTS(
SELECT *
FROM SC Y
WHERE Y.Sno=201215122 AND Y.Grade>=90 AND NOT EXISTS(
SELECT *
FROM SC Z
WHERE X.Sno=Z.Sno AND Z.Cno=Y.Cno
)
);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值