11、mysql数据表中数据的查询(3)

说一下子查询,子查询的意义就是使用一个查询语句做为另一个查询语句的条件,一般使用exists和in来引导子查询

exists子查询

exists 放在 where 之后使用,可以看成查询数据所满足的一个条件,只是这个条件的值比较特殊(true或false),当子查询返回

数据时则结果为true,没有数据时结果为false

使用exists子查询时,一般使用到了外表中的字段作为子查询的条件

exists对外表的每一条记录进行遍历,然后根据外表中依赖的条件判断子查询中是否可以返回数据

实例:

解释只要techer表中存在数据,子查询就会有数据,返回true,子查询一直成立,没有实际意义
sql
SELECT s.id sid, s.name sname FROM student s WHERE EXISTS (SELECT * FROM teacher t)

 

结果

 

解释查询学生名字和老师名字相同,并且老师名字为 cc 的数据
sql
SELECT s.id sid, s.name sname FROM student s

WHERE EXISTS (SELECT * FROM teacher t WHERE s.name = t.name AND t.name = 'cc')
结果

 

not exists和exists的结果集正好相反

使用子查询时,要处理好子查询中所依赖的外部表中的字段和子查询表中字段对应的条件关系

in子查询

in用于条件查询,相当于or , in后边的子查询语句只能返回一列值

实例:

解释查询student中name和teacher表中name相同的数据
sql
SELECT s.id sid, s.name sname FROM student s WHERE  s.name in (SELECT name from teacher)

相当于 


SELECT s.id sid, s.name sname FROM student s WHERE  s.name = name1 or s.name = name2 …

 

结果

 

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表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值