嵌套查询
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)。