嵌套查询:相关子查询和非相关子查询

嵌套查询

一个select…From…Where查询语句块可以嵌套在另一个select…From…Where查询块的Where子句中,称为嵌套查询。
外层查询称为父查询,主查询。内层查询称为子查询,从查询。
子查询可以嵌套多层,子查询查询到的结果又成为父查询的条件。
关于子查询注意:

  • 子查询中不能有order by分组语句。(因为子查询只是个中间结果,分组等是作用于最后的结果拥有显示)
  • 子查询一定要用( )包围

非相关子查询

简单嵌套查询

查询选修课程号为’101’并且成绩高于学生号为’9501101’的所有学生的成绩.

select * from sclass 
where cno='101' and degree>=(select degree from sclass where sno='9501101'and cno='101')
-------------------------------------------------------
当子查询跟随在 =、!=、<、<=、>、>=之后,子查询的返回值只能是一个, 否则应在外层where子句中用一个in限定符,即要返回多个值,要用in或者not in

带[not] in的嵌套查询

只要主查询中列或运算式是在(不在)子查询所得结果列表中的话,则主查询的结果为我们要的数据

select sales_id,tot_amt
from sales 
where sale _id  in(select sale_id from employee where sex='F')

相关子查询

带exists的嵌套查询

子查询的结果至少存在一条数据时,则主查询的结果为我们要的数据。(exists)或自查询的结果找不到数据时,则主查询的结果为我们要的数据(not exists)
我们经常查询的两个表有多少重复的记录就用这个
以下范例让你找出滞销的产品,也就是尚未有任何销售记录的库存产品。此范例主要是查询以库文件中的每一条产品代码到销售明细表中去查询,如果查询不到任何一条,表示该产品未曾卖出任何一件。

select * from stock a
where not exists(select * from sale_item b where a.prod_id=b.prod_id and a.stup_id=b.stup_id)

这是个嵌套子查询!

非相关子查询和相关子查询区别

  1. 非相关子查询是独立于外部查询的子查询,子查询总共执行一次,执行完毕后将值传递给外部查询,并且它是优先于外部查询先执行的,他执行了再执行外部。
  2. 相关子查询的执行依赖于外部查询的数据,外部查询执行一行,子查询就执行一次。并且是外部先查询一次,然后再执行一次内部查询!(由于他执行查询的次数多,可见他的效率并不高,可以用存储过程来代替他)
  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MySQL中的子查询是指在一个查询语句中嵌套另一个查询语句。根据子查询和外部查询之间的相关性,可以将子查询分为相关子查询相关子查询相关子查询指的是子查询的结果依赖于外部查询的结果。在相关子查询中,子查询的执行是在外部查询之后进行的。例如,我们可以使用相关子查询来查找具有特定属性的行。例如,我们可以使用一个外部查询来检索所有订单总数大于平均订单总数的顾客: SELECT * FROM Customers c WHERE (SELECT COUNT(*) FROM Orders o WHERE o.CustomerID = c.CustomerID) > (SELECT AVG(OrderCount) FROM (SELECT COUNT(*) AS OrderCount FROM Orders GROUP BY CustomerID) AS Subquery) 在上面的例子中,子查询的结果依赖于外部查询(即外部查询的结果是子查询的一部分)。 相关子查询是指子查询的结果独立于外部查询的结果。在相关子查询中,子查询可以在外部查询执行之前或之后执行。例如,我们可以使用相关子查询来返回某个表中的最大值: SELECT * FROM Products WHERE Price = (SELECT MAX(Price) FROM Products) 在上面的例子中,子查询的结果独立于外部查询(即子查询在外部查询执行之前执行)。 总而言之,相关子查询依赖于外部查询的结果,而相关子查询与外部查询的结果独立。根据具体的需求,我们可以选择使用相关子查询相关子查询来实现所需的查询操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值