MySQL基础进阶:编写复杂查询

编写复杂查询

  • 1. 子查询
  • 2. IN运算符
  • 3. 子查询VS连接
  • 4. ALL关键字
  • 5. ANY关键字
  • 6. 相关子查询
  • 7. EXISTS运算符
  • 8. SELECT子句中得子查询
  • 9. FROM子句中得子查询

1. 子查询

子查询: 任何一个充当另一个SQL语句的一部分的 SELECT 查询语句都是子查询,子查询是一个很有用的技巧。子查询的层级用括号实现。

MySQL执行时会先执行括号内的子查询(内查询),将获得的结果返回给外查询,子查询不仅可用在 WHERE …… 中,也可用在 SELECT …… 或 FROM …… 等子句中

SELECT
    *
FROM products
WHERE unit_price > (
     SELECT unit_price
     FROM products
     WHERE name LIKE '%Lettuce%'
)

SELECT
    *
FROM employees
WHERE salary > (
     SELECT AVG(salary) AS average_salary
     FROM employees
)

2. IN运算符

当需要判定的条件中有多个数值时,用到IN和NOT IN运算符。(可以是字符也可以是数字)

SELECT *
FROM products
WHERE product_id NOT IN(
    SELECT DISTINCT product_id  -- distinct关键字用于属性名前,得到不重复值
    FROM order_items
)

3. 子查询VS连接

子查询(Subquery)是将一张表的查询结果作为另一张表的查询依据并层层嵌套,其实也可以先将这些表连接(Join)合并成一个包含所需全部信息的详情表再直接在详情表里筛选查询。两种方法一般是可互换的,具体用哪一种取决于性能(Performance)和可读性(readability)。

SELECT *
FROM products
LEFT JOIN order_items USING (product_id)
WHERE order_id IS NULL  
-- 等同于在WHERE中采用子查询

SELECT
    DISTINCT customer_id,
    first_name,
    last_name
FROM customers
LEFT JOIN orders USING (customer_id)
LEFT JOIN order_items USING (order_id)
WHERE product_id = 3    
-- 对于多表之间的查询,先连接成大表,然后再查询可读性更强

SELECT 
    customer_id,
    first_name,
    last_name
FROM customers
WHERE customer_id IN (
    SELECT o.customer_id
    FROM order_items oi
    JOIN orders o USING (order_id)
    WHERE product_id = 3
)  -- 采用子查询和外连接共同作用来进行多表查询

4. ALL关键字

(MAX (……)) 和 > ALL(……) 等效可互换:“比这里面最大的还大” = “比这里面的所有的都大”
从以下代码来进行对比:

SELECT *
FROM invoices
WHERE invoice_total > (
    SELECT MAX(invoice_total) -- 用于表中的属性值计算最大值
    FROM invoices
    WHERE client_id = 3
)

SELECT *
FROM invoices
WHERE invoice_total > ALL ( -- 用于子查询后结构的计算最大值
    SELECT invoice_total
    FROM invoices
    WHERE client_id = 3
)

5. ANY关键字

同SOME,表示其中任何一个
= ANY (……) 与 IN (……) 等效;
< ANY/SOME (……) 与 < (MIN (……)) 等效

SELECT *
FROM clients
WHERE client_id = ANY (    -- 可采用IN或= SOME来替换
    SELECT client_id
    FROM invoices
    GROUP BY client_id
    HAVING COUNT(*) > 2
)

6. 相关子查询

  • 非相关子查询:子查询先查出整体的某平均值或满足某些条件的一列id,作为主查询的筛选依据,这种子查询与主查询无关,会先一次性得出查询结果再返回给主查询供其使用。
  • 关子查询:子查询是依赖主查询的,子查询的判定中需要引入主查询的属性值(需要为主查询中表名命别名),每一条记录的主查询对应的子查询结果也会发生改变。这种关联查询是在主查询的每一行/每一条记录层面上依次进行的,另外也正因为这一点,相关子查询会比非关联查询执行起来慢一些。

Note:伪代码其实就是注释的表达方式,一种按照程序执行步骤编写的注释,中英文都可以

SELECT *
FROM employees e
WHERE salary > (  -- 相当于执行循环计算,子查询用到了主查询中的属性值
    SELECT AVG(salary)
    FROM employees
    WHERE office_id = e.office_id
)

7. EXISTS运算符

  • IN + 子查询 等效于 EXIST + 相关子查询,如果前者子查询的结果集过大占用内存,用后者逐条验证更有效率。
  • EXIST()本质上是根据是否为空返回TRUE和FALSE,而IN 是获取返回的数值
  • EXIST也可以加NOT取反
SELECT * 
FROM clients
WHERE client_id IN (  -- 判断的是某些数值
    SELECT DISTINCT client_id
    FROM invoices
)

SELECT DISTINCT client_id,name
-- 外连接可能产生大量重复项,需要剔除
FROM clients
JOIN invoices USING (client_id)

SELECT * 
FROM clients c   -- 数据库本质上就是对表格数据的逐条判断筛选,然后联系到大量关系型数据库表格
WHERE EXISTS (
-- 类似判断语句,符合条件返回ture,则将此条记录输出
-- 对于clients表格中记录进行输出,不会产生重复
    SELECT *
    FROM invoices
    WHERE client_id = c.client_id
)

NOTE:

  1. EXISTS(…) 函数相当于是前置的 … IS NULL(共同点:都是根据是否为空返回布林值)
  2. WHERE 确实是逐条验证筛选行/记录的
  3. EXISTS也是相关子查询
  4. 对于大电商来说,如果用IN+子查询法,子查询可能会返回一个百万量级的产品列表,这种情况还是用EXIST+相关子查询逐条验证法更有效率

8. SELECT子句中得子查询

不仅WHERE筛选条件里可以用子查询,SELECT选择子句和FROM来源表子句也能用子查询。

SELECT选择语句是用来确定查询结果选择包含哪些字段,每个字段都可以是一个表达式,而每个字段表达式里的元素除了可以是原始的列,具体的数值,也同样可以是其它各种花里胡哨的子查询的结果。

SELECT 
    invoice_id,
    invoice_total,
    (SELECT AVG(invoice_total) FROM invoices) AS invoice_average,
    -- '123' AS Test 命名属性值,同时给其赋值。
    -- 当需要记录值逐条输出时,不能直接用聚合函数。必须和GROUP BY语句联合输出
    /*用括号+子查询改变顺序,【子查询 (SELECT AVG(invoice_total) FROM invoices)
    是作为一个数值结果 152.388235 加入主查询语句的】*/
    invoice_total - (SELECT invoice_average) AS difference
    /*SELECT表达式里要用原列名,不能直接用别名invoice_average
    要用列别名的话用子查询(SELECT 同级的列别名)即可*/
FROM invoices
Note:可以理解为给属性列来赋值
SELECT 
    client_id,
    name,
    (SELECT SUM(invoice_total) FROM invoices WHERE client_id = c.client_id) AS total_sales,
    -- 子查询相对主查询clients,会进行5次循环查询。若用GRUOP BY则只会产生4组数值
    (SELECT AVG(invoice_total) FROM invoices) AS average,
    (SELECT total_sales - average) AS difference
FROM clients c

Note:形成表格过程中一定注意行中列数要匹配。

9. FROM子句中得子查询

子查询的结果同样可以充当一个“虚拟表”作为FROM语句中的来源表,即将筛选查询结果作为来源再进行进一步的筛选查询。但注意只有在子查询不太复杂时进行这样的嵌套,否则最好用后面讲的视图先把子查询结果储存起来再使用。

复杂的子查询再嵌套进FROM里会让整个查询看起来过于复杂,最好是将子查询结果储存为视图,然后再直接使用该视图作为来源表。(形成新表,然后查询。)

FROM子句中的子查询一般不用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python应用开发——30天学习Streamlit Python包进行APP的构建(12)

st.checkbox 显示复选框部件。 Function signature[source] st.checkbox(label, valueFalse, keyNone, helpNone, on_changeNone, argsNone, kwargsNone, *, disabledFalse, label_visibility"visible") Returns (bool) Whether or not the checkbox is checked. …

Sentinel解决雪崩问题

我们或多或少都对雪崩问题有点了解&#xff0c;在微服务系统中&#xff0c;各个微服务互相调用&#xff0c;关系错综复杂&#xff0c;如果其中一个微服务挂了或者处理消息的速度大幅下降&#xff0c;需要被处理的消息越积越多&#xff0c;那么影响的不仅仅是本微服务的功能&…

算法入门(上)

什么是算法&#xff1f; 算法&#xff08;Algorithm&#xff09;是解决特定问题求解步骤的描述&#xff0c;在计算机中表现为指令的有限序列&#xff0c;并且每条指令表示一个或多个操作。 给定一个问题&#xff0c;能够解决这个问题的算法是有很多种的。算式中的问题是千奇百怪…

C语言单链表的算法之插入节点

一&#xff1a;访问各个节点中的数据 &#xff08;1&#xff09;访问链表中的各个节点的有效数据&#xff0c;这个访问必须注意不能使用p、p1、p2&#xff0c;而只能使用phead &#xff08;2&#xff09;只能用头指针不能用各个节点自己的指针。因为在实际当中我们保存链表的时…

后端之路第三站(Mybatis)——XML文件操作sql

一、XML映射文件是啥 前面我们学过了在Mapper接口用注解的方式来操作sql语句 那么XML映射文件就另一种操作sql语句的方法 为什么还要有这么个玩意&#xff1f; 我简单说就是&#xff1a;如果有的sql特别复杂的话&#xff0c;比如需要【动态sql】的话&#xff0c;就得用到XM…

数据可视化期末总结

期末考试重点&#xff08;世界上最没意义的事情&#xff09; 选择 p8 数据可视化的标准&#xff1a; 实用、完整、真实、艺术、交互&#xff08;性&#xff09; p21 色彩三属性 色相、饱和度、亮度 p23 视觉通道的类型&#xff1a; 记得色调是定性 p39 散点图&#xff08;二维…

GIT-LFS使用

0.前言 目前git仓库有很多很大的文件需要管理&#xff0c;但是直接上传&#xff0c;每次clone的文件太大&#xff0c;所有准备使用git-lfs解决。 1、下载和安装 Git LFS 1.1、直接下载二进制包&#xff1a; Releases git-lfs/git-lfs GitHub 安装 Git LFS sudo rpm -ivh…

Leica Cyclone 3DR2024 一款功能强大的点云建模软件下载License获取

Leica Cyclone 3DR 2024 是一款功能强大的点云建模软件&#xff0c;使用旨在为用户提供全面的点云管理、自动化的点云分析&#xff0c;结合强大的建模&#xff0c;在一个直观友好的环境中&#xff0c;专注的完成挑战&#xff0c;提高生产力&#xff0c;轻松创建并交付专业的成果…

杨幂跨界学术圈:内容营销专家刘鑫炜带你了解核心期刊的学术奥秘

近日&#xff0c;知名艺人杨幂在权威期刊《中国广播电视学刊》上发表了一篇名为《浅谈影视剧中演员创作习惯——以电视剧<哈尔滨一九四四>为例》的学术论文&#xff0c;此举在学术界和娱乐圈均引起了广泛关注。该期刊不仅享有极高的声誉&#xff0c;还同时被北大中文核心…

Data-Driven Reinforcement Learning for Robotic Manipulation

意思是 不同的任务以及机器人都有单独的数据和模型 未来需要整合 一个大的数据集包含所有的 然后训练一个大模型 以后具体的任务只需要针对这个模型进行微调 challenge bootstrapping with large data 2 3 4 高清图补充

【C++】using namespace std 到底什么意思

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文作为 JohnKi 的学习笔记&#xff0c;引用了部分大佬的案例 &#x1f4e2;未来很长&a…

【SGX系列教程】(二)第一个 SGX 程序: HelloWorld,linux下运行

文章目录 0. SGX基础原理分析一.准备工作1.1 前提条件1.2 SGX IDE1.3 基本原理 二.程序设计2.1 目录结构2.2 源码设计2.2.1 Encalve/Enclave.edl:Enclave Description Language2.2.2 Enclave/Enclave.lds: Enclave linker script2.2.3 Enclave/Enclave.config.xml: Enclave 配置…

ctfshow-web入门-命令执行(web59-web65)

目录 1、web59 2、web60 3、web61 4、web62 5、web63 6、web64 7、web65 都是使用 highlight_file 或者 show_source 1、web59 直接用上一题的 payload&#xff1a; cshow_source(flag.php); 拿到 flag&#xff1a;ctfshow{9e058a62-f37d-425e-9696-43387b0b3629} 2、w…

MathType7.6专业数学公式编辑器!与Word、PPT等常用软件无缝对接。

MathType&#xff0c;一款专业的数学公式编辑器&#xff0c;以其强大的功能和友好的用户界面&#xff0c;在科研、教学等领域广受欢迎。它支持丰富的数学符号和公式模板&#xff0c;满足不同用户的需求。同时&#xff0c;MathType还提供了多种输出格式&#xff0c;方便与其他文…

3ds Max导出fbx贴图问题简单记录

1.前言 工作中发现3ds Max导出的fbx在其它软件&#xff08;Autodesk viewer&#xff0c;blender&#xff0c;navisworks&#xff0c;FBXReview等&#xff09;中丢失了部分贴图&#xff0c;但导出的fbx用3ds Max打开却正常显示。 fbx格式使用范围较广&#xff0c;很多常见的三…

如何用Go语言,实现基于宏系统的解释器?

目录 一、Go语言介绍二、什么是宏系统三、什么是解释器四、如何用Go语言实现一个基于宏系统的解释器&#xff1f; 一、Go语言介绍 Go语言&#xff0c;又称为Golang&#xff0c;是一种由谷歌公司开发并开源的编程语言。Go语言的设计目标是提高程序员的生产力&#xff0c;同时具…

树莓派开发之文件传输

文章目录 一、简介使用U盘传输文件使用SD卡传输文件使用Xftp 7传输文件 二、 总结 一、简介 在树莓派开发中经常会用到文件传输&#xff0c;下面介绍几种树莓派文件传输的几种方法。 使用U盘传输文件 &#xff08;1&#xff09;复制所需传输文件到U盘 &#xff08;2&#…

详细介绍MySQL的索引(上)

索引 索引概述 索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种方式引用(指向数据&#xff0c;这样就可以在这些数据结构上实现高级查找算法&#xff0c;这种数据结…

【计算机图形学】期末考试知识点汇总(上)

文章目录 视频教程第一章 计算机图形学概述计算机图形学的定义计算机图形学的应用计算机图形学 vs 图像处理 vs模式识别图形显示器的发展及工作原理理解三维渲染管线 第二章 基本图元的扫描转换扫描转换直线的扫描转换DDA算法Bresenham算法中点画线算法圆的扫描转换中点画圆算法…

json文件 增删查改

默认收藏夹 qt操作json格式文件... 这个人的 写的很好 我的demo全是抄他的 抄了就能用 —————————— 下次有空把我的demo 传上来 在E盘的demo文件夹 json什么名字