说一下子查询,子查询的意义就是使用一个查询语句做为另一个查询语句的条件,一般使用exists和in来引导子查询
exists子查询
exists 放在 where 之后使用,可以看成查询数据所满足的一个条件,只是这个条件的值比较特殊(true或false),当子查询返回
数据时则结果为true,没有数据时结果为false
使用exists子查询时,一般使用到了外表中的字段作为子查询的条件
exists对外表的每一条记录进行遍历,然后根据外表中依赖的条件判断子查询中是否可以返回数据
实例:
解释 | 只要techer表中存在数据,子查询就会有数据,返回true,子查询一直成立,没有实际意义 |
sql |
|
结果 |
解释 | 查询学生名字和老师名字相同,并且老师名字为 cc 的数据 |
sql | |
结果 |
not exists和exists的结果集正好相反
使用子查询时,要处理好子查询中所依赖的外部表中的字段和子查询表中字段对应的条件关系
in子查询
in用于条件查询,相当于or , in后边的子查询语句只能返回一列值
实例:
解释 | 查询student中name和teacher表中name相同的数据 |
sql | 相当于
|
结果 |
not in和in的结果集相反
exists和in的比较
查询student表中name值和teacher表中name相同的数据
SELECT s.id sid, s.name sname FROM student s
WHERE EXISTS (SELECT * FROM teacher t WHERE s.name = t.name)
exists子查询是遍历外表然后根据条件去内表中查询并判断是否有数据返回,主要用到的是子查询中表的索引进行的查询,外表只需要过滤即可,所以影响效率的关键在内表及teacher表
SELECT s.id sid, s.name sname FROM student s WHERE s.name in (SELECT name from teacher)
in后边的子查询相当于使用or将条件进行拼接,所以真正查询时主要操作的还是外表,及影响效率的关键在外表及student表