子查询

子语句的位置分类:

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)

《完》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值