子语句的位置分类:
where型,exists型
from型
子语句的返回值分类:
但一值:标量子查询
一列:列子查询
一行:行子查询
表:表子查询(多行,多列)
标量子查询,子语句的结果为1个值
查询年龄最大的的所有学生。最大年龄是一个值,查询该值得所有人。
select id, name from student where age= > < !=(select max(age) from student);
select id, name from student where age=(select max(age) from student);
update student set age=10 where age = (select max(age) from student);
列子查询, 子语句的结果为1列值
any和all虽功能强大,但是比较绕,建议多用in和not in
some(集合) 同等于 any(集合)
select id, name from student where agein(select age from student where age=50);
select id, name from student where agenot in(select age from student where age=50);
select id, name from student where age= > < !=any(select age from student where age=50);//=any 同in all
select id, name from student where age!=all(select age from student where age=50);//!= all 同not in
select id, name from student where age!=any(select age from student where age=50);//不等于集合中的任意一个,不同于not in
行子查询,较少用,子语句的结果为1行值
查找和id=2那一行中id,name相等的所有元素。
select * from student where (id, name) = (select id, name from student where id=2 limit 1);
表子查询(from型)
from对象要求必须是一个表,所以需要对子语句的结果起个别名 as 语法。
select * from (select * from student where id=2)as tmp_table;
exists子查询
exists(subquery)
如果子查询查找结果有值,则返回True,否则返回false.如下例子,从另一张表中查找ID和本id相等时,讲数据查找出来。
select * from student where exists( select * fromTABLE2 where student.id=ID);
上面的这个例子最终的效果会和下面相同。但是上面的是双重循环查找,对于student中得每条数据,都要到TABLE2中去遍历一边,而下面这条语句需要把所有的id都保存下来,会占用内存。具体用哪个还是要具体问题具体分析。
select * from student where id in (select id from TABLE2);
综上所述,实际工作中可能用到比较多的有三种。
1)标量查询 2)in查询 3)表查询(from)
《完》