MySQL学习笔记——嵌套查询

本文是关于MySQL嵌套查询的学习笔记,介绍了some、all、exists、unique等操作符的使用,以及from子句查询的概念和注意事项,强调了外层where语句与内层查询的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

嵌套查询

some
  表示在子查询中,至少存在一个,例如在上面的表中,我们男生中至少有一个比女生的年龄大的男生名字:
  select name from people where age > some (select age from people where sex='woman') and sex='man'
  结果是nick,lihua,tom。因为是至少一个,那么女生的年龄应该取最小值,即18,而三个男生的年龄均大于18,所以三个男生的信息都被查询出来
all
  与some相反,all的意思是比所有的都… 如果将上面的例子换成all,那么结果就只有nick一个了
,因为此时女生的年龄取最大值,即21,男生中年龄大于21的只有nick一个。
  some和all都支持<, >, <=, >=, =, <>

exists
  顾名思义,表示为存在的意思,和some,all的用法一样,都是在子查询的时候使用,表示子查询的结果是否为NULL。
unique
  与exists一样,对子查询进行判断,判断子查询中是否有重复的记录,如果没有,则返回true。
from子句查询
  select-from-where表达式返回的结果都是关系,因而可以被插入到另一个select-from-where中任何关系可以出现的地方。所以from子句查询就诞生了。也就是,在from中可以写正常的SQL语句,最重要的是需要对from子句查询出来的结果进行取别名,否则会报出

Every derived table must have its own alias

的错误,这句话的中文意思是“每个派生出来的表都必须有一个自己的别名”。
  所以,类似from子句查询的方式需要这样使用:

select * from (select * from tablename where id > 1) as res where id < 3;

  其次,重要的是,外层的where语句判定的属性一定要在内层的查询子句中存在,例如:

select * form (select id,name from people where age>20) as res where age > 21;

  此时就会出错Unknown column 'age' in 'where clause,因为外层的where语句的过滤条件是在内层查询出来的结果中进行执行的。但是如果将select子句中的属性换成*或者加上age属性,那么这个查询语句的意思就是查询出年龄大于20且大于21的id和姓名(内层值查询了id和name属性,所以外层的*对应的也就是id和name)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值