【MySQL】子查询

文章目录

  • 子查询
  • IN运算符
  • 子查询 VS 连接
  • ALL关键字
  • ANY关键字
  • 相关子查询 !
  • EXISTS运算符
  • select子句中的子查询
  • from子句中的子查询

子查询

  • 获取价格大于id为3的货物的商品
    • 用到了内查询,获取id为3的商品的单价,把结构传给外查询
  • 在where子句中编写子查询,也可以在from或select子句中编写。
use sql_store;
select *
from products
where unit_price > (select unit_pricefrom productswhere product_id = 3)

运行结果:
在这里插入图片描述

  • 练习:查询工资大于平均工资的员工
use sql_hr;
select *
from employees
where salary > (select avg(salary)from employees)

运行结果:
在这里插入图片描述

IN运算符

  • in运算符写子查询
  • 查询没有被订购过的商品,先在子查询中找出被订购过的商品id(注意要去重)。将这个查询结果作为子查询,在外层找product_id不在子查询结果里的数据,就是没有被订购过的商品。
use sql_store;
select *
from products
where product_id not in (select distinct product_idfrom order_items
)

在这里插入图片描述

  • 练习:找到没有支付过支票的客户
    • 从invoices中查询去重后的clientid,将这个结果作为内查询传给外查询,找不在这个内查询结果中的id,就是没有支付过支票的顾客
use sql_invoicing;
select *
from clients
where client_id not in (select distinct client_idfrom invoices
)

运行结果:
在这里插入图片描述

子查询 VS 连接

  • 在运行时间差不多的情况下,应该选择最易读的查询,要注意代码的可读性!
  • 上一个练习题,可以使用外连接进行查询,但这样写可读性不好。
select *
from clients
left join invoices using (client_id)
where invoice_id is null
  • 练习
    • 找到订购了货物id为3的顾客
    • 这道题用 连接查询 思路更清晰,可读性更好
-- 用子查询写
use sql_store;
select customer_id, first_name, last_name
from customers
where customer_id in (select customer_idfrom order_itemsjoin orders using (order_id)where product_id = 3
)-- 使用连接查询
select distinct customer_id, first_name, last_name
from customers
join orders using (customer_id)
join order_items using (order_id)
where product_id = 3

ALL关键字

  • 查询大于3号客户的最大发票的所有数据
use sql_invoicing;
select *
from invoices
where invoice_total > (select max(invoice_total)from invoiceswhere client_id = 3)
  • 用all关键字
    • 查询invoice_total比all后查询到的所有数据都大的数据,一个一个的跟all后查询到的结果进行比较
select *
from invoices
where invoice_total > all(select invoice_totalfrom invoiceswhere client_id = 3)

返回结果
在这里插入图片描述

  • max写法和all写法可以相互改写,两种写法的可读性都较好

ANY关键字

  • in 和 = any是等价的。
  • 查询至少有两张发票的客户id
    • 使用count(*)查到所有的信息,根据client_id分组,分组后用having进行条件筛选
select client_id, count(*)
from invoices
group by client_id
having count(*) >= 2
  • 把上述查询当子查询,把clients中至少有两张发票的客户信息查出来
    • where子句中可以用in,也可以用 = any
    • in 和 = any的效果是一样的,用哪种都行
-- in
select *
from clients
where client_id in (select client_idfrom invoicesgroup by client_idhaving count(*) >= 2
)
-- = any
select *
from clients
where client_id = any (select client_idfrom invoicesgroup by client_idhaving count(*) >= 2
)

相关子查询 !

  • 查询逻辑:先到employees表,对每个员工e执行这段子查询,计算和e同一个部门的员工的平均工资,如果这名员工e的工资高于平均工资,就会被返回在结果中。依次一条一条的去查询。
  • 这种查询成为相关子查询,子查询和外查询存在相关性,引用了外查询里出现的别名(即e)
  • 使用相关子查询时,这段子查询会在主查询每一行的层面执行,所以相关子查询经常执行的很慢。
use sql_hr;
select *
from employees e
where salary > (select avg(salary)from employeeswhere office_id = e.office_id)
  • 练习
    • 查询顾客大于自己平均值的数据
use sql_invoicing;
select *
from invoices i
where invoice_total > (select avg(invoice_total)from invoiceswhere client_id = i.client_id)

EXISTS运算符

  • 获取在发票表中有发票的客户
    • 三种写法:子查询,外连接,exists相关子查询
  • 用in,先将in后的子查询运行结果返回给where。
  • in后的子查询会生成一个列表,返回给where。如果子查询查到的过多,会导致列表特别大,这样会妨碍最佳性能;对于这种情况,用exists能提高效率
select *
from clients
where client_id in (select distinct client_idfrom invoices)
  • 用exists运算符,来查看发票表里是否存在符合这个条件的行
  • 子查询并没有给外查询返回一个结果,它会返回一个指令,说明这个子查询中是否有符合这个搜索条件的行,每一行外层查询的数据都到exists后去看是否存在;如果存在,子查询就会给exists返回true,exists运算符就会在最终结果里添加当前的记录。
select *
from clients
where exists(select client_idfrom invoiceswhere invoices.client_id = clients.client_id
);

运行结果
在这里插入图片描述

  • 练习
    • 找到从没有被订购过的商品
use sql_store;
select *
from products
where not exists(select product_idfrom order_itemswhere order_items.product_id = products.product_id
)

运行结果
在这里插入图片描述

select子句中的子查询

  • 在select子句中用子查询得到平均值
  • select语句中 在表达式中不能使用列的别名,这样就只能把select子句中的子查询再复制一遍,但是这样很长很麻烦且重复;解决方法是:再转换成一个子查询(select invoice_average)
use sql_invoicing;
select invoice_id,invoice_total,(select avg(invoice_total)from invoices) as invoice_avearge,invoice_total - (select invoice_avearge) as difference
from invoices

运行结果
在这里插入图片描述

  • 练习:得到每个客户的总发票金额,全部发票的平均值,以及他们的差值
select client_id,name,(select sum(invoice_total)from invoiceswhere client_id = c.client_id) as total_sales,(select avg(invoice_total)from invoices) as average,(select total_sales) - (select average) as difference
from clients c

运行结果
在这里插入图片描述

from子句中的子查询

  • 可以把一段查询生成的表当作另一个查询的from
select *
from(
select client_id,name,(select sum(invoice_total)from invoiceswhere client_id = c.client_id) as total_sales,(select avg(invoice_total)from invoices) as average,(select total_sales) - (select average) as difference
from clients c
) as hahah
where total_sales is not null

运行结果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/164484.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【python基础(四)】if语句详解

文章目录 一. 一个简单示例二. 条件测试1. 检查多个条件1.1. 使用and关联多个条件1.2. 使用or检查多个条件1.3. in的判断 2. 布尔表达式 三. if语句1. 简单的if语句2. if-else语句3. if-elif-else结构4. 使用多个elif代码块5. 省略else代码块 四. 使用if语句处理列表1. 检查特殊…

2023-11-23 LeetCode每日一题(HTML 实体解析器)

2023-11-23每日一题 一、题目编号 1410. HTML 实体解析器二、题目链接 点击跳转到题目位置 三、题目描述 「HTML 实体解析器」 是一种特殊的解析器,它将 HTML 代码作为输入,并用字符本身替换掉所有这些特殊的字符实体。 HTML 里这些特殊字符和它们…

Endnote软件添加期刊引用格式

在下述网址中,找到你想要添加的期刊,下载引用格式文件(后缀为.ens格式) https://endnote.com/downloads/styles/?wpv_post_searchInformationfusion&wpv_aux_current_post_id12829&wpv_view_count12764-TCPID12829 下载…

SQLY优化

insert优化 1.批量插入 手动事务提交 主键顺序插入,主键顺序插入性能高于乱序插入 2.大批量插入数据 如果一次性需要插入大批量数据,使用Insert语句插入性能较低,此时可以使用MYSQL数据库提供的load指令进行插入 主键优化 主键设计原则 …

Java实现王者荣耀小游戏

主要功能 键盘W,A,S,D键:控制玩家上下左右移动。按钮一:控制英雄发射一个矩形攻击红方小兵。按钮控制英雄发射魅惑技能,伤害小兵并让小兵停止移动。技能三:攻击多个敌人并让小兵停止移动。普攻:对小兵造成基础伤害。小…

vue3 终端实现 (vue3+xterm+websocket)

目录 一、xterm介绍 二、效果展示 三、vue文件实现代码 一、xterm介绍 xterm是一个使用

【C++初阶】STL详解(七)Stack与Queue的模拟实现

本专栏内容为:C学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:C 🚚代码仓库:小小unicorn的代码仓库&…

力扣labuladong一刷day17天前缀和数组

力扣labuladong一刷day17天前缀和数组 一、303. 区域和检索 - 数组不可变 题目链接:https://leetcode.cn/problems/range-sum-query-immutable/ 思路:本题即为让写一个类用于计算指定区间内的数字和,但如果直接采用for循环的方式&#xff0…

Unity调用dll踩坑记

请用写一段代码,让unity无声无息的崩溃。 你说这怕是有点难哦,谁会这么不幸呢?不幸的是,我幸运的成为了那个不幸的人。 unity里面调用dll的方式是使用 DllImport ,比如有一个 Hello.dll,里面有一个 char* …

图片如何去除水印?试试这三种去水印方法!

从事自媒体行业的小伙伴们,你们是否经常为文章配图而烦恼呢?下载的图片大部分带有各种各样的水印或者多余元素,让人感到困扰。今天,我要分享三个去水印的妙招,这是新媒体人必备的图片处理技能,快来一起学起…

【MATLAB源码-第87期】基于matlab的Q-learning算法栅格地图路径规划,自主选择起始点和障碍物。

操作环境: MATLAB 2022a 1、算法描述 Q-learning是一种无模型的强化学习算法,适用于有限的马尔可夫决策过程(MDP)。它的核心是学习一个动作价值函数(action-value function),即Q函数&#xf…

面试官:【js多维数组扁平化去重并排序】

文章目录 前言方法一方法二方法三方法四总结后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:JavaScript 🐱‍👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现错误&a…

【腾讯云云上实验室-向量数据库】Tencent Cloud VectorDB在实战项目中替换Milvus测试

为什么尝试使用Tencent Cloud VectorDB替换Milvus向量库? 亮点:Tencent Cloud VectorDB支持Embedding,免去自己搭建模型的负担(搭建一个生产环境的模型实在耗费精力和体力)。 腾讯云向量数据库是什么? 腾…

rsync配置和守护进程实践

目录 一、rsync概念 1.rsync简介 2.rsync特点 3、增量和全局传输 二、Rsync工作方式 1.准备好rsync备份服务器 2.本地的数据传输模式 3.远程的数据传输模式 4.rsync数据推拉模式 三、实践 1.准备三台虚拟机 2.都安装rsync服务 3.拉取远程文件 3.推送文件 4.rsyn…

Oracle用户(User)和表空间(Tablespace)

3. 用户和表空间 3.1. 用户 1)概念 Oracle数据库中,用户(User)是访问数据库的途径和认证方式,同时,用户也是数据库对象的逻辑集合。我们通过数据库用户和密码来登录数据库,然后,可以在该用户下创建和操作数据库对象。 2)创建和配置 创建Oracle用户,需要具备创建…

python系统编程

文章目录 系统编程系统工具概述sys模块os模块 脚本运行上下文当前工作路径命令行参数shell环境变量标准流 文件和目录工具文件工具目录工具 并行系统工具进程分支线程 系统编程 系统工具 概述 python系统模块: 模块名作用*sys负责导出与怕以后呢解释器本身相关的组件*os包含…

Django DRF序列化器serializer

以下案例由浅到深&#xff0c;逐步深入&#xff0c;通过实例介绍了序列化器的使用方法&#xff0c;和其中遇到的常见问题的解决。 一、序列化器serializers.Serializer 1、urls.py urlpatterns [path("api/<str:version>/depart/",views.DepartView.as_vie…

缓存雪崩、击穿、穿透及解决方案_保证缓存和数据库一致性

文章目录 缓存雪崩、击穿、穿透1.缓存雪崩造成缓存雪崩解决缓存雪崩 2. 缓存击穿造成缓存击穿解决缓存击穿 3.缓存穿透造成缓存穿透解决缓存穿透 更新数据时&#xff0c;如何保证数据库和缓存的一致性&#xff1f;1. 先更新数据库&#xff1f;先更新缓存&#xff1f;解决方案 2…

【问题解决】RuntimeError: apex.optimizers.FusedSGD requires cuda extension 问题解决

在使用 apex 库时&#xff0c;按照官方的方式安装后&#xff0c;虽然安装成功&#xff0c;但调用的时候会报错如下&#xff0c;也就是说其实没有成功安装可调用 cuda 的 apex&#xff1a; RuntimeError: apex.optimizers.FusedSGD requires cuda extension我找了很多解决方式&…

【蓝桥杯省赛真题46】Scratch魔术表演 蓝桥杯scratch图形化编程 中小学生蓝桥杯省赛真题讲解

目录 scratch魔术表演 一、题目要求 编程实现 二、案例分析 1、角色分析