MySQL子查询
什么是子查询
子查询是指一个查询语句嵌套在另一个查询语句的内部,将select语句的结果作为另外一个查询语句的条件。子查询的操作符有any(some)、all、in、exists。子查询可以添加到select、update和delete语句中。子查询的作为条件可以使用比较运算符。
体验子查询
create tabletb1 (
numtinyint not null
);
create tabletb2 (
numtinyint not null
);
insert intotb1values(1), (3), (5), (6), (7), (8);
insert intotb2values(2), (4), (5), (6), (7);
ANY、SOME子查询
any和some效果是一样的,表示只要满足子条件的任意一条记录即可。
查询要求:查询出tb1中大于tb2中任意一个值的记录。
select*fromtb1wheretb1.num>any(selecttb2.numfromtb2);

解析SQL:tb1.num>any(selecttb2.numfromtb2)any表示只要tb1的值大于tb2的任意一条记录的num就满足条件。
ALL子查询
all和any以及some不同,any和some只要满足一条记录就可以,all是要和表的所有数据比较,都要满足才可以。
查询要求:查询出tb1中大于tb2所有值得记录。
select*fromtb1wheretb1.num>all(selecttb2.numfromtb2);

解析SQL:tb1.num>all(selecttb2.numfromtb2)all关键字表示tb1.num的值要大于all中查询出来的tb2的所有记录的值,只有8可以满足条件。
EXISTS子查询
exists关键字后面的参数是一条任意完整的子查询,系统对子查询运算如果返回行,那么就只需外层的运算,如果没有就不执行。
查询要求:如果tb2的num有大于10的,就查询tb1的所有记录
select*fromtb1whereexists(selecttb2.numfromtb2wheretb2.num=10);

解析SQL:exists后面的sql语句返回空结果,表示没有大于10的记录,结果是false。所有前面的语句就不执行。
exists表示子查询返回值就执行,如果是相反就使用not exists。
IN子查询
in子查询的内层值返回一列值,这个数据列的值提供给外层做比较。
查询要求:查询在tb1和tb2中都存在的值
select*fromtb1wheretb1.numin(selecttb2.numfromtb2);

SQL解析:tb2的num数据查询出来后,tb1的num会比较是否在tb2的结果中。
3472

被折叠的 条评论
为什么被折叠?



