数据科学探路者:MySQL知识整理7.3—连接查询
四、子查询
什么是子查询?
当一个查询是另一个查询的条件时,称之为子查询。子查询可以使用几个简单命令构造功能强大的复合命令。子查询最常用于SELECT-SQL命令的WHERE子句中。子查询是一个 SELECT 语句,它嵌套在一个 SELECT、SELECT...INTO 语句、INSERT...INTO 语句、DELETE 语句、或 UPDATE 语句或嵌套在另一子查询中。
语法:select ....from 表1 where 列1 > (子查询)
外面的查询成为父查询,圆括号嵌入的查询成为称为子查询。SQL Server 执行时,先执行子查询部分,求出子查询部分的值,再执行整个父查询,返回最后的结果。
查看多表的数据也可使用表连接,表连接(join on...),表连接都可用子查询替换,但有的子查询不能用表连接替换,子查询比较灵活,方便,形式多样,适合于作为查询的筛选条件。
1.any,some和all关键字的子查询
在使用子查询语句的过程中经常使用ANY
、SOME
、ALL
(另外还有一个IN
)关键字作为筛选条件,any和some关键字是同义词。
/*any、some和all关键字*/use test_db;create table tb1(num1 int not null);create table tb2(num2 int not null);insert into tb1 values(1),(3),(5),(7);insert into tb2 values(2),(4),(6),(8);select num1 from tb1 where num1 > any(select num2 from tb2);select num1 from tb1 where num1 > all(select num2 from tb2);
2.EXISTS关键字子查询
子查询EXISTS是用来指定一个子查询,检测行的存在使用子查询EXISTS 关键字引入一个子查询时,就相当于进行一次存在测试。外部查询的WHERE 子句测试子查询返回的行是否存在。子查询实际上不产生任何数据;它只返回 TRUE 或 FALSE 值。要注意:在子查询中使用仍然返回结果集,通过使用EXISTS仍取值为 TRUE
通过对子查询EXISTS的解释,大家可以发现子查询IN与子查询EXISTS的区别了吗?注意,EXISTS子查询实际上不产生任何数据;它只返回 TRUE 或 FALSE 值。
这样就不存在我们之前说“子查询IN适合外结果集大,子查询结果集小的情况。
select * from fruits where exists(select sname from suppliers where sid=102);
http://3.IN关键字子查询
使用IN关键字,进行子查询时,内层查询语句返回一个数据列,这个数据列中的值,将供外层查询语句进行比较操作
select cid from orders where onum in(select onum from orderitems where fid='c0');
4.带比较运算符的子查询
子查询还可以使用其他的比较运算符,如:< , <= , > , >= , = , !=等
select sid,sname from fruits where sid = (select s1.sid from suppliers as s1 where s1.scity='上海');