MySQL中exists的用法

主要是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,查询与”张三“在同一学院学习的学生信息

看到这个之后,多表连接查询

1
2
select * from student 
where exists (select college from student where Sname='张三');

但结果呢

运行结果

那么为什么不对呢,让我们来看看这条语句是怎样运行的

首先取Student表中的一个元组,然后在Student表中依次找Sname=’张三’,如果存在,则外层查询的where子句返回为真,则Student表中的该元组可以输出。然后依次遍历Student表中的其他元组。因为在Student表中”张三”这个人始终存在,所以where始终返回true,输出了三个学生的信息。

后来问同学,baidu了一下,于是看到了这样一篇

SQL语句中exists/not exists的用法分析

都是外表连接,于是想到自身表连接是否要为表区取别名呢。答案当然是肯定的,因为我是这样做出来的。 = =

1
2
3
SELECT * FROM student AS s1
WHERE EXISTS
(SELECT * FROM student AS s2 WHERE s1.college=(SELECT college FROM student WHERE Sname='张三'));

结果如下

运行结果

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

热评文章