@Mayezi
2015-12-06T05:02:06.000000Z
字数 899
阅读 2122
MySQL 数据库
主要是SQL语句中exists/not exists的用法,今天实验课遇到一个exists,好久没用,最终还是解决了。
不废话,表如下:
此处输入代码
- student
| Sno | Sname | age | college |
|---|---|---|---|
| S00001 | 张三 | 20 | 计算机学院 |
| S00002 | 李四 | 19 | 通信学院 |
| S00003 | 王五 | 21 | 计算机学院 |
- course
| CourseId | CourseName | CourseBeforeId |
|---|---|---|
| C1 | 计算机导论 | Null |
| C2 | C语言 | C1 |
| c3 | 数据结构 | C2 |
- Choose
| Sno | CourseId | Score |
|---|---|---|
| S00001 | C1 | 95 |
| S00001 | C2 | 80 |
| S00001 | C3 | 84 |
| S00002 | C1 | 80 |
| S00002 | C2 | 85 |
| S00003 | C1 | 78 |
| S00003 | C3 | 70 |
题目:用SELECT的存在量词EXISTS,查询与”张三“在同一学院学习的学生信息
看到这个之后,多表连接查询
select * from studentwhere exists (select college from student where Sname='张三');
但结果呢

那么为什么不对呢,让我们来看看这条语句是怎样运行的
首先取Student表中的一个元组,然后在Student表中依次找Sname='张三',如果存在,则外层查询的where子句返回为真,则Student表中的该元组可以输出。然后依次遍历Student表中的其他元组。因为在Student表中"张三"这个人始终存在,所以where始终返回true,输出了三个学生的信息。
后来问同学,baidu了一下,于是看到了这样一篇
都是外表连接,于是想到自身表连接是否要为表区取别名呢。答案当然是肯定的,因为我是这样做出来的。 = =
SELECT * FROM student AS s1WHERE EXISTS(SELECT * FROM student AS s2 WHERE s1.college=(SELECT college FROM student WHERE Sname='张三'));
结果如下

好久没更新了,由于上周装双系统不知怎么把Win10的系统引导搞坏了,断断续续重装,现在才有时间。