SQL之子查询

2023-10-29

1、案例

案例1:

OrderItems表示订单商品表,含有字段订单号:order_num、订单价格:item_price;Orders表代表订单信息表,含有顾客id:cust_id和订单号:order_num

OrderItems表

order_num item_price
a1 10
a2 1
a2 1
a4 2
a5 5
a2 1
a7 7

Orders表

order_num cust_id
a1 cust10
a2 cust1
a2 cust1
a4 cust2
a5 cust5
a2 cust1
a7 cust7

【问题】使用子查询,返回购买价格为 10 美元或以上产品的顾客列表,结果无需排序。
注意:你需要使用 OrderItems 表查找匹配的订单号(order_num),然后使用Order 表检索这些匹配订单的顾客 ID(cust_id)。

--T1:
select cust_id
from Orders
left join OrderItems
on OrderItems.order_num = Orders.order_num
where item_price >= '10'

--PS:同一顾客可能会多次购买十美元及以上的商品,故需要用DISTINCT去重

--T2:
SELECT DISTINCT cust_id
FROM Orders
WHERE order_num IN (
    SELECT order_num
    FROM OrderItems
    WHERE item_price >= '10')

【示例结果】返回顾客id cust_id

cust_id
cust10

案例2:

表OrderItems代表订单商品信息表,prod_id为产品id;Orders表代表订单表有cust_id代表顾客id和订单日期order_date

OrderItems表

prod_id order_num
BR01 a0001
BR01 a0002
BR02 a0003
BR02 a0013

Orders表

order_num cust_id order_date
a0001 cust10 2022-01-01 00:00:00
a0002 cust1 2022-01-01 00:01:00
a0003 cust1 2022-01-02 00:00:00
a0013 cust2 2022-01-01 00:20:00

【问题】

编写 SQL 语句,使用子查询来确定哪些订单(在 OrderItems 中)购买了 prod_id 为 "BR01" 的产品,然后从 Orders 表中返回每个产品对应的顾客 ID(cust_id)和订单日期(order_date),按订购日期对结果进行升序排序。

--t1:
select
  distinct cust_id,
  order_date
from
  Orders
  left join OrderItems on Orders.order_num = OrderItems.order_num
where
  prod_id = 'BR01'
order by
  order_date 

--where版本
select
  cust_id,
  order_date
from
  Orders o,
  OrderItems oi
where
  prod_id = 'BR01'
  and o.order_num = oi.order_num
order by
  order_date ; 

--子查询版本
select
  cust_id,
  order_date
from
  Orders
where
  order_num in (
    select
      order_num
    from
      OrderItems
    where
      prod_id = 'BR01'
  )
order by
  order_date;

--左连接版本
select
  cust_id,
  order_date
from
  Orders o
  LEFT JOIN OrderItems oi ON o.order_num = oi.order_num
where
  prod_id = 'BR01'
order by
  order_date;

--自然连接版本
select
  cust_id,
  order_date
from
  Orders
  NATURAL JOIN OrderItems
where
  prod_id = 'BR01'
order by
  order_date;

--内连接 类似where
select
  cust_id,
  order_date
from
  Orders o
  inner JOIN OrderItems oi on o.order_num = oi.order_num
  and prod_id = 'BR01'
order by
  order_date;

--join using 类似自然连接
select
  cust_id,
  order_date
from
  Orders # 相当于自然连接对相同的列进行连接
  join OrderItems using(order_num)
where
  prod_id = 'BR01'
order by
  order_date;

【示例结果】返回顾客id cust_id和定单日期order_date。

cust_id order_date
cust10 2022-01-01 00:00:00
cust1 2022-01-01 00:01:00

案例3:

你想知道订购 BR01 产品的日期,有表OrderItems代表订单商品信息表,prod_id为产品id;Orders表代表订单表有cust_id代表顾客id和订单日期order_date;Customers表含有cust_email 顾客邮件和cust_id顾客id

OrderItems表

prod_id order_num
BR01 a0001
BR01 a0002
BR02 a0003
BR02 a0013

Orders表

order_num cust_id order_date
a0001 cust10 2022-01-01 00:00:00
a0002 cust1 2022-01-01 00:01:00
a0003 cust1 2022-01-02 00:00:00
a0013 cust2 2022-01-01 00:20:00

Customers表代表顾客信息,cust_id为顾客id,cust_email为顾客email

【问题】返回购买 prod_id 为BR01 的产品的所有顾客的电子邮件(Customers 表中的 cust_email),结果无需排序。

提示:这涉及 SELECT 语句,最内层的从 OrderItems 表返回 order_num,中间的从 Customers 表返回 cust_id。

select
  cust_email
from
  Customers
where
  cust_id in (
    select
      cust_id
    from
      Orders
    where
      order_num in (
        select
          order_num
        from
          OrderItems
        where
          prod_id = 'BR01'
      )
  )

【示例结果】

返回顾客email cust_email

cust_email
cust10@cust.com
cust1@cust.com

案例4:

我们需要一个顾客 ID 列表,其中包含他们已订购的总金额。

OrderItems表代表订单信息,OrderItems表有订单号:order_num和商品售出价格:item_price、商品数量:quantity。

order_num item_price quantity
a0001 10 105
a0002 1 1100
a0002 1 200
a0013 2 1121
a0003 5 10
a0003 1 19
a0003 7 5

Orders表订单号:order_num、顾客id:cust_id

order_num cust_id
a0001 cust10
a0002 cust1
a0003 cust1
a0013 cust2

【问题】

编写 SQL语句,返回顾客 ID(Orders 表中的 cust_id),并使用子查询返回total_ordered 以便返回每个顾客的订单总数,将结果按金额从大到小排序。

提示:你之前已经使用 SUM()计算订单总数。

select
  a.cust_id,
  sum(b.total_o) as total_ordered
from
  Orders a
  left join (
    select
      order_num,
      sum(item_price * quantity) as total_o
    from
      OrderItems
    group by
      order_num
  ) b on a.order_num = b.order_num
group by
  cust_id
order by
  total_ordered desc

--等值连接
select
cust_id,
(select
 SUM(item_price*quantity)
FROM OrderItems a
WHERE a.order_num=b.order_num)total_ordered
from Orders b
ORDER BY total_ordered DESC

【示例结果】返回顾客id cust_id和total_order下单总额

cust_id total_ordered
cust2 2242
cust1 1300
cust10 1050
cust2 104
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL之子查询 的相关文章

随机推荐

  • uni-app开发ios App,如何去掉底部安全空白区域

    在ios开发的过程当中 在ios设备上底部会出现一个安全空白区域 如果想要去掉 在manifest json中点开源码视图配置 将所有 iPhone X 刘海屏 底部安全区域背景颜色 自动适应 当前页面什么颜色会自动调整 代码 将所有 iP
  • COMP 9417 T2_2021 Lesson 6

    Pg1 54 逻辑回归和感知机的区别主要是多了一个求概率 逻辑回归的损失函数由最大似然推导而来 使预测概率分布与真实概率分布接近 感知机的损失函数可能有多种方法 可能有多层感知机 但他们本质的思想都是使预测的结果与真实结果误差更小 是函数拟
  • 解决sass的GBK and UTF-8问题

    问题 在ruby命令窗口sass watch global scss global css会报错 且生成的css文件中文注释是乱码的 根据提示是编码问题 gt gt gt Sass is watching for changes Press
  • 无线网开机不能用显示红色叉号

    操作系统不能上无线网络 一般是先检查无线网卡驱动程序是否正常 然后检查无线服务是否开启 用操作系统中自带网络诊断之后 显示此计算机上没有运行的windows无线服务 开始 运行 输入 services msc 点击确定 或按下回车键 Ent
  • elementUI switch 内部显示文字

    只需要加入一些css即可 deep el switch core before content 高 position absolute top 0 right 5px color fff is checked deep el switch
  • Swift语法学习--扩展与泛型

    文章目录 扩展 扩展定义 对方法进行扩展 通过扩展判断数组是否相同 泛型 使用泛型进行数组合并 使用泛型进行任意类型数组元素调换 扩展 扩展定义 对方法进行扩展 通过扩展判断数组是否相同 泛型 使用泛型进行数组合并 使用泛型进行任意类型数组
  • 点击链接重定向跳转微信公众号关注页、微信关注链接

    1 先获取你要设置的公众号的biz a 电脑进入公众号 点击右上角的 菜单 b 点击出现公众号的简介页面 再点击页面下面三个按钮中间的按钮 c 点击复制链接获取biz 例如 http mp weixin qq com mp getmasss
  • latex编辑器别把一整段放到一行里面

    如果是Winedit的话 ctrl W就行 其实就是设置自动换行
  • 【JavaSe】面向对象篇(十四) 异常

    JavaSe 面向对象篇 十四 异常 1 异常 1 1 异常概念 异常 就是不正常的意思 在生活中 医生说 你的身体某个部位有异常 该部位和正常相比有点不同 该部位的功能将受影响 在程序中的意思就是 异常 指的是程序在执行过程中 出现的非正
  • postgresql 连接超时_Postgre SQL连接服务器失败原因分析及解决方法

    首先这是登陆postgre sql时提示的错误信息 psql 无法联接到服务器 Connection refused 0x0000274D 10061 服务器是否在主机 localhost 1 上运行并且准备接受在端口 5432 上的 TC
  • 机器学习前沿热点–Deep Learning

    一Deep Learning的前世今生 二Deep Learning的基本思想和方法 三深度学习Deep Learning算法简介 不充分的深度是有害的 大脑有一个深度架构 认知过程看起来是深度的 四拓展学习推荐 五应用实例 六参考链接 深
  • windows server 2012 R2 远程桌面设置中仅允许运行使用网络级别选项灰色

    服务器远程开在外网 装完系统 仅允许使用网络级别身份验证的选项 状态为 灰色未勾选 一段时间之后 很多登录失败 占满内存 只能重启系统 开放外网的远程桌面 未输入凭据 直接到锁屏注销界面登录 致使大量未知用户错误登录 占满系统内存 都属于同
  • 面向前端的webview知识总结

    webview 本篇文主要面向前端同学食用 分别从简介 内核 组件 基本配置 加载 缓存机制 通信等几个方向列举安卓和iOS有关 webview 的知识点 希望前端在和客户端同学对接时不会太懵逼 简介 webview 是一个可以加载网页的可
  • 3.ESP32-S2 USB 挂载SPI-SD,当作U盘使用,无线U盘

    使用的 IDF 4 4 C语言开发 1 ESP32 S2 USB烧录 输出日志 2 ESP32 S2 USB 挂载内部Flash 当作U盘使用 无线U盘 3 ESP32 S2 USB 挂载SPI SD 当作U盘使用 无线U盘 4 ESP32
  • 欧拉函数模板

    欧拉函数 n varphi n n 表示 1 n
  • libvirt 报错

    执行virsh命令出现 下面的错误 error failed to connect to the hypervisor error no valid connection error Failed to connect socket to
  • Nginx 学习笔记01

    Nginx 学习笔记01 概念 Nginx是lgor Sysoev为俄罗斯访问量第二的rambler ru站点设计开发的 从2004年发布至今 凭借开源的力量 已经接近成熟与完善 Nginx功能丰富 可作为HTTP服务器 也可作为反向代理服
  • 打不到VarAsType的解决办法

    在uses单元加入Variants VarType function from Variants unit in Delphi 7 In Delphi 5 VarType function is declared in Systems un
  • 【Verilog基础】7.计数器

    4位计数器 module count4 out reset clk output 3 0 out input reset clk reg 3 0 out always posedge clk begin if reset out lt 0
  • SQL之子查询

    1 案例 案例1 OrderItems表示订单商品表 含有字段订单号 order num 订单价格 item price Orders表代表订单信息表 含有顾客id cust id和订单号 order num OrderItems表 ord