当前位置: 首页 > news >正文

关联子查询

SELECT 
cust_id,(SELECT SUM(quantity * item_price)
FROM OrderItems
WHERE OrderItems.order_num = Orders.order_num) AS total_orderedFROM Orders
ORDER BY total_ordered DESC;

这个查询之所以能正常工作而不会因为返回多行而报错,是因为它使用了关联子查询(Correlated Subquery),而且这个子查询被设计为返回单个值

关键原因分析:

1. 关联子查询的特性

(SELECT SUM(quantity * item_price)FROM OrderItemsWHERE OrderItems.order_num = Orders.order_num)  -- 这里关联外部查询
  • 这个子查询为外部查询的每一行执行一次
  • 每次执行时,它使用当前行的Orders.order_num作为过滤条件

2. 聚合函数保证返回单值

SELECT SUM(quantity * item_price)  -- SUM保证返回单个值
FROM OrderItems
WHERE OrderItems.order_num = Orders.order_num  -- 针对特定订单
  • SUM() 是一个聚合函数,它总是返回单个值
  • 即使匹配到多行数据,SUM() 也会将它们聚合成一个总数

3. 执行过程分解

假设数据如下:

Orders表:
order_num | cust_id
----------|--------
1         | A
2         | BOrderItems表:
order_num | quantity | item_price
----------|----------|-----------
1         | 2        | 10
1         | 1        | 20
2         | 3        | 15

执行过程:

  1. 取Orders第一行:order_num = 1, cust_id = A

    • 子查询:SUM(...) WHERE order_num = 1(2*10 + 1*20) = 40
    • 返回:(A, 40)
  2. 取Orders第二行:order_num = 2, cust_id = B

    • 子查询:SUM(...) WHERE order_num = 2(3*15) = 45
    • 返回:(B, 45)

4. 与返回多行的子查询对比

会报错的例子:

SELECT cust_id,(SELECT quantity * item_price  -- 没有SUM聚合FROM OrderItemsWHERE OrderItems.order_num = Orders.order_num) AS item_total
FROM Orders

这个会报错,因为对于每个订单,可能匹配多个OrderItems行。

为什么这是安全的?

  • 一对一关系:外部查询每行对应子查询的一个结果
  • 标量值:子查询使用SUM()确保返回单个值
  • 关联条件WHERE OrderItems.order_num = Orders.order_num 确保正确的数据关联

性能考虑

虽然这个查询语法正确,但在性能上可能不如JOIN方式高效,因为它需要为Orders表的每一行执行一次子查询。对于大数据集,建议使用JOIN方式:

SELECT o.cust_id, SUM(oi.quantity * oi.item_price) as total_ordered
FROM Orders o
JOIN OrderItems oi ON o.order_num = oi.order_num
GROUP BY o.cust_id
ORDER BY total_ordered DESC;

总结: 这个子查询能正常工作是因为它被设计为关联子查询+聚合函数,确保为外部查询的每一行返回且只返回一个值。

http://www.dtcms.com/a/457767.html

相关文章:

  • Linux108 shell:.bashrc 正则表达式:. * .* ^ $ ^$ [ ] [^] ^[] ^[^ ] \< \>
  • 怎么在京东做网站上海网站备案查询
  • 关于网站建设的申请报告做网站如何赚流量钱
  • 知识点1-lcd点亮->frame buffer、字库
  • 手机版免费申请微网站赣州新闻联播视频
  • 西安市做网站的公司新东方雅思培训机构官网
  • n8n工作流配置初解
  • 山东嘉祥做网站的有哪几家跳转网站
  • 如何用表格做网站焦作高端网站建设
  • 【PPT】导出高清晰度图片(dpi支持自定义)-超简单图文实操-修改注册表
  • 相册在线设计平台专业seo培训学校
  • postgresql分区表代码创建方案
  • 做推广送网站免费建站设计公司企业画册
  • 甘肃省建设厅执业资格注册中心网站通知网站建设和维护怎么学
  • 【VSCode】Visual Studio Code
  • 网站建设公司哪家强网站权重提升
  • Python Web开发中的WSGI与ASGI:从传统到现代的接口演进
  • PostgreSQL索引选B-Tree还是GiST?“瑞士军刀”和“多面手”的差别你居然还不知道?
  • 链表经典算法题详解教程
  • 唐山网站建设汉狮怎么样上海牛人岛企业服务有限公司
  • 微网站开发平台wizi网站建设板块如何分类
  • 【材料学python入门】conda、 jupyter、cpu、GPAW、wsl、ubuntu
  • 完整酒店网站开发威海建设网站
  • 高速采集卡ESD方案介绍及验证
  • 建个公司网站一年多少钱wordpress ios7教程
  • 做网站有2个前提条件 一个是网站godaddy做网站
  • 手机网站和微信网站的区别潍坊企业网站建设
  • Qt 支持的绿色系英文颜色(Green Family)
  • 找代做海报的网站广西建筑模板
  • 网站icp备案费用门户网站创新的方式有