优化SQL查询之了解SQL执行顺序

news2024/9/22 7:27:39

文章目录

    • 优化SQL查询之了解SQL执行顺序
    • 举例的SQL语句
    • SQL执行顺序 - 文字解释
    • SQL执行顺序 - 图示
    • SQL执行顺序 - 动画演示
    • distinct 子句会在哪个位置
    • 除了6个主要的关键字,还有哪些关键字
    • 总结

优化SQL查询之了解SQL执行顺序

SQL 查询的执行过程并非是简单的按照语句的书写顺序依次进行,而是遵循着一套特定的逻辑顺序。只有掌握了这个执行顺序,我们才能准确地分析 SQL 查询的性能瓶颈,并有针对性地进行优化。通过对 SQL 执行顺序的深入理解,我们可以更好地编写高效的 SQL 查询语句,提高数据库的响应速度,减少资源消耗,为应用程序的稳定运行和良好用户体验提供坚实的基础。

在这里插入图片描述
查询所用关键词主要有六个,顺序依次为 select、from、where、group by、having、order by。其中 select 和 from 为必选,其他关键词可选。

举例的SQL语句

以下面的SQL举例。

SELECT
customer id,COUNT(order_id)as total_orders,
SUM(order_amount)as total spent
FROM customers
JOIN orders
ON customers.id orders.customer_id
WHERE ORDER_DATE >= 2024-01-01'
GROUP BY customer_id
HAVING total_spent≥1ooo
ORDER BY total_spent DESC
LIMIT 10;

SQL执行顺序 - 文字解释

  1. FROM 子句:
    • 确定数据源,即customers表和orders表,并根据ON子句中的连接条件customers.id = orders.customer_id进行表连接操作,生成一个中间结果集。
  2. WHERE 子句:
    • 对连接后的中间结果集进行筛选,只保留满足ORDER_DATE >= '2024-01-01'条件的行。
  3. GROUP BY 子句:
    • 按照customer_id对筛选后的结果进行分组。
  4. 聚合函数计算:
    • 在每个分组中,计算COUNT(order_id)作为total_orders,计算SUM(order_amount)作为total_spent
  5. HAVING 子句:
    • 对分组后的结果进行进一步筛选,只保留满足total_spent≥1000条件的分组。
  6. SELECT 子句:
    • 从满足条件的分组结果集中选择customer_idtotal_orderstotal_spent列作为最终结果集的列。
  7. ORDER BY 子句:
    • 按照total_spent列降序对结果集进行排序。
  8. LIMIT 子句:
    • 从排序后的结果集中选取前 10 行作为最终的查询结果。

SQL执行顺序 - 图示

在这里插入图片描述

SQL执行顺序 - 动画演示

优化SQL查询之了解SQL执行顺序

distinct 子句会在哪个位置

distinct 子句在 SQL 查询语句中起着重要的作用,它用于去除结果集中的重复行,确保返回的结果是唯一的。distinct 子句通常会位于查询语句的第六和第七步中间,也就是在 SELECT 子句之后,ORDER BY 子句之前。
在这个位置,distinct 子句首先会在 SELECT 子句从数据库中检索出数据之后对结果集进行处理。它会检查结果集中的每一行数据,如果发现有重复的行,distinct 子句会只保留其中的一行,去除其他重复的行。这样可以确保最终返回的结果集不包含重复的数据,更加简洁和准确。
然后,在 distinct 子句处理完结果集后,如果存在 ORDER BY 子句,它会对去重后的结果集按照指定的列进行排序。

除了6个主要的关键字,还有哪些关键字

在 SQL 查询中,除了上述提到的关键字外,还有以下一些关键字:

一、聚合函数相关

  1. SUM():用于计算指定列的总和。例如,SELECT SUM(salary) FROM employees;可以计算员工表中薪资列的总和。
  2. AVG():计算指定列的平均值。如SELECT AVG(score) FROM exams;计算考试成绩表中分数列的平均值。
  3. MAX():找出指定列的最大值。比如SELECT MAX(price) FROM products;找出产品表中价格列的最大值。
  4. MIN():确定指定列的最小值。例如SELECT MIN(age) FROM students;找出学生表中年龄列的最小值。

二、连接查询相关

  1. JOIN:用于连接两个或多个表。例如SELECT * FROM table1 JOIN table2 ON table1.id = table2.table1_id;根据指定的条件将两个表连接起来。
  2. LEFT JOIN:左连接,返回左表中的所有行以及右表中匹配的行,如果右表中没有匹配的行,则相应的列值为 NULL。
  3. RIGHT JOIN:右连接,与左连接相反,返回右表中的所有行以及左表中匹配的行。
  4. FULL JOIN:全连接,返回两个表中的所有行,如果没有匹配的行,则相应的列值为 NULL。

三、数据操作相关

  1. INSERT INTO:用于向表中插入新的数据行。例如INSERT INTO customers (name, email) VALUES ('John Doe', 'john@example.com');向客户表中插入一条新记录。
  2. UPDATE:更新表中的数据。如UPDATE employees SET salary = salary * 1.1 WHERE department = 'Sales';将销售部门员工的薪资提高 10%。
  3. DELETE FROM:删除表中的数据行。例如DELETE FROM orders WHERE order_date < '2024-01-01';删除日期早于 2024 年 1 月 1 日的订单。

四、子查询相关

  1. IN:用于在 WHERE 子句中判断一个值是否在一个子查询的结果集中。例如SELECT * FROM customers WHERE customer_id IN (SELECT customer_id FROM orders WHERE total_amount > 1000);找出在订单总金额大于 1000 的订单中的客户。
  2. EXISTS:用于在 WHERE 子句中判断一个子查询是否返回至少一行结果。例如SELECT * FROM customers WHERE EXISTS (SELECT * FROM orders WHERE customers.customer_id = orders.customer_id);找出有订单的客户。

五、其他关键字

  1. LIMIT:用于限制查询结果集的行数。例如SELECT * FROM employees LIMIT 10;只返回员工表中的前 10 行数据。
  2. OFFSET:与 LIMIT 一起使用,用于指定从哪一行开始返回结果。例如SELECT * FROM employees LIMIT 10 OFFSET 20;从员工表中第 21 行开始返回 10 行数据。
  3. AS:用于为列或表起别名。例如SELECT customer_name AS name FROM customers;将客户表中的客户名称列起别名为 name。

总结

了解 SQL 执行顺序对于优化 SQL 查询具有重要作用:

一、明确优化方向

通过了解 SQL 执行顺序,我们能够清晰地知道查询语句中各个部分的执行先后,从而有针对性地进行优化。例如,知道 WHERE 子句在早期执行,我们可以在此处尽可能地筛选出更少的数据行,减少后续操作的数据量,提高查询效率。

二、合理使用关键字

  1. 对于必选的关键字如 SELECT 和 FROM,我们可以根据执行顺序更好地理解它们的基础作用。SELECT 确定要返回的列,而 FROM 指明数据的来源表。在优化时,可以精心选择返回的列,避免不必要的列加载,减少数据传输和处理的开销。
  2. 对于可选关键字如 WHERE、GROUP BY、HAVING 等,了解执行顺序有助于我们正确地放置条件和聚合操作。WHERE 子句先于 GROUP BY 和 HAVING 执行,可以在早期阶段过滤数据。GROUP BY 用于对数据进行分组,而 HAVING 则在分组后对结果进行筛选。合理安排这些关键字的使用,可以减少不必要的分组和筛选操作,提高查询性能。

三、准确放置 distinct 子句

知道 distinct 子句在 SELECT 子句之后、ORDER BY 之前的位置,可以更好地理解其作用范围。在优化时,可以根据具体需求考虑是否使用 distinct 以及放置的位置,避免不必要的去重操作或者确保正确的去重结果。

四、充分利用其他关键字

除了六个主要关键字,了解其他关键字如聚合函数(SUM、AVG 等)、连接查询关键字(JOIN、LEFT JOIN 等)、数据操作关键字(INSERT INTO、UPDATE、DELETE FROM)和子查询相关关键字(IN、EXISTS)等的作用和执行顺序,可以在复杂查询中合理运用这些关键字,实现更高效的查询。例如,在连接查询中,根据执行顺序选择合适的连接方式可以减少数据冗余和提高查询速度。

五、整体规划查询

了解 SQL 执行顺序有助于我们从整体上规划 SQL 查询,避免不必要的操作和错误的逻辑顺序。可以根据执行顺序逐步分析查询的性能瓶颈,并采取相应的优化措施,如添加合适的索引、调整查询逻辑、优化数据存储等,以提高 SQL 查询的效率和性能。

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

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

相关文章

话费接口API对接流程是什么?又有哪些优势?

话费接口 API 对接流程 前期准备 找一家专业做话费充值的公司&#xff0c;联系其商务了解对接的具体情况&#xff0c;包括合作模式、话费价格、消耗及打款金额是否可以开票、对接时是否有技术配合等 开户与对接 确定合作后在话费充值平台进行开户&#xff0c;获取账户参数及…

14、Django Admin的“Action(动作)”中添加额外操作

如图红框增加操作 将以下代码添加到HeroAdmin类中 actions ["mark_immortal"] def mark_immortal(self, request, queryset):queryset.update(is_immortalTrue) 修改后完整代码如下&#xff1a; admin.register(Hero) class HeroAdmin(admin.ModelAdmin):list_di…

c++返回一个pair类型

前言 Under the new standard we can list initialize the return value. 代码测试 #include<iostream> #include<string> #include<vector>std::pair<std::string, int> process(std::vector<std::string>& v) {if (!v.empty()){return …

无用但有趣的R包之教你怎么科学地用R语言摸鱼

如果你觉得R只是用来科研的工具&#xff0c;那就太辜负广大开发者的良苦用心了。今天给大家介绍几个useless但fun的的R包&#xff0c;为大家工作学习之余提供一点微不足道的小乐趣。 All work and no play makes jack a dull boy. 话不多说&#xff0c;游戏开始。 1.Fun包&a…

Nginx: 进程结构和信号量管理

进程结构 需要首先关注多进程和多线程的一个区别Nginx采用的是一种多进程&#xff0c;这样一种进程结构, 为何不采用多线程这样一种进程结构Nginx 设计之初就是为了高可能性和高可靠性而设计的Nginx 通常是运行在边缘节点上&#xff0c;通常是用来接受用户的第一个请求的时候&…

第三届人工智能与智能信息处理国际学术会议(AIIIP 2024)

目录 大会介绍 基本信息 合作单位 主讲嘉宾 会议组委 征文主题 ​编辑 参会方式 会议日程 中国-天津 | 2024年10月25-27日 | 会议官网&#xff1a;www.aiiip.net 大会介绍 第三届人工智能与智能信息处理国际学术会议&#xff08;AIIIP 2024&#xff09;将…

如何通过PLM系统提升企业研发效率与市场竞争力?

在当今快速变化的商业环境中&#xff0c;企业的研发能力和市场响应速度成为了决定其竞争力的关键因素。PLM系统作为一种集成了产品设计、开发、制造、销售、服务及最终报废等全生命周期信息的集成化管理平台&#xff0c;正逐渐成为企业提升研发效率、加速产品创新、优化资源配置…

Java后端面试题(微服务相关)(day12)

目录 分布式与微服务区别&#xff1f;什么是CAP原则&#xff1f;Spring Cloud Alibaba 组件有哪些&#xff1f;Nacos配置中心动态刷新原理目前主流的负载方案有哪些&#xff1f;Nginx作为服务端负载均衡器&#xff0c;常见的负载均衡策略有哪些&#xff1f;Spring Ribbon相关Sp…

中秋佳节,好物相伴 —— 精选五款数码好物推荐

中秋佳节&#xff0c;不仅是家人团聚的时刻&#xff0c;也是享受科技与生活的完美结合的好时机。在这个充满温情的节日里&#xff0c;我们为您精心挑选了五款数码好物&#xff0c;其中包括备受好评的南卡Runner Pro5骨传导耳机&#xff0c;以及其他四款各具特色的数码产品&…

中国电子学会Python3级等级考试202403客观题解析2

11、单选题 关于语句 fopen(r"c:\计算.txt",w)&#xff0c;下列描述不正确的是&#xff1f;&#xff08; &#xff09; A f 是变量 B w以写方式打开文件 C 如果文件“计算.txt”不存在&#xff0c;不会报错 D 如果文件“计算.txt”内原来有内容&#xff0c;将不…

数据库透明加密的定义与原理

数据库透明加密(TDE)是一种先进的加密技术&#xff0c;主要用于保护存储在数据库中的敏感数据&#xff0c;防止未经授权的访问和数据泄露。以下是对数据库透明加密的详细解析&#xff1a; 一、定义与原理 定义&#xff1a;数据库透明加密是一种在数据库管理系统(DBMS)中集成加密…

软考高级:系统架构设计师——软件架构设计 Chapter 笔记

软考高级&#xff1a;系统架构设计师——软件架构设计 1 软件架构设计—基本概念架构所处的位置架构发展历程架构的“41”视图例题 架构描述语言&#xff08;ADL&#xff09;例题 2软件架构设计—架构风格数据流风格调用/返回 风格独立构件风格虚拟机风格仓库风格&#xff08;以…

Codeforces Round 970 (Div. 3) (个人题解)(未补完)

前言&#xff1a; 昨天晚上的比赛&#xff0c;可惜E题太笨了没想到如何解决&#xff0c;不过好在看到F过的多直接跳过去写F了&#xff0c;能过个5个也还不错了&#xff0c;而且一个罚时也没吃。之后的题我还是会再能补的时候补完的噢&#xff01; 正文&#xff1a; 链接&…

ELK(Elasticsearch、Logstash、Kibana) 分布式日志搭建详细过程

ELK是三款软件的简称&#xff0c;分别是Elasticsearch、 Logstash、Kibana组成 本文中描述了ELK日志平台的详细搭建过程&#xff0c;不对工具用途做描述。 一、准备 安装包 所需安装包及官网下载地址&#xff1a; elasticsearch-8.14.3-linux-x86_64.tar.gz (https://www…

2024 【Delphi 12】苹果ios开发环境配置(五星保姆级)

目录 一、创建证书 1. 创建证书签名请求&#xff1a;&#xff08;在苹果电脑上操作&#xff09;&#xff1a; .certSigningRequest 文件 2. 创建证书&#xff1a;在苹果的 开发者网站 上操作 重复以上步骤并下载对应的证书文件如下&#xff1a; 3. 创建标识符&#xff08;…

引爆关注!LLM大模型开源项目突破34.4千星,热度飙升!

其实这个Repo在外网知名度很高&#xff0c;但咱这似乎没看到咋推 随着近两年大型语言模型的发展&#xff0c;LLM在生活中发挥着愈发重要的作用&#xff0c;通过改变我们与技术互动的方式&#xff0c;为医疗、金融和教育等各领域带来变革性的变化&#xff0c;之前AI周刊中也说了…

开放式耳机怎么戴?开放式耳机比入耳式耳机舒适吗?

开放式耳机佩戴教程如下&#xff1a; 选择合适的耳挂或支架&#xff1a;开放式耳机通常有耳挂式或头梁式等设计。如果是耳挂式&#xff0c;确保耳挂的大小和形状适合您的耳朵&#xff0c;能够稳固地挂在耳朵上&#xff1b;如果是头梁式&#xff0c;调整头梁的长度&#xff0c;使…

交易处理商TAAL公司深度参与BSV区块链的ARC研发

​​发表时间&#xff1a;2024年8月7日 TAAL技术主管Michael Bckli表示&#xff0c;TAAL公司一直在对ARC进行测试&#xff0c;并准备在今年年底全面发布。因TAAL在区块链交易处理方面具备深厚的专业知识&#xff0c;BSV区块链委托TAAL进行ARC开源参考落地方案的开发。 ARC是一个…

jmeter的1个线程如何遍历提取到的1个变量的多个值?

某个请求的uri是动态变化的&#xff0c;且这个url这个从上一个接口中提取到&#xff0c;但是其值可能有多个&#xff0c;也可能有1个&#xff0c;1个用户执行时&#xff0c;需要将这几个值作为uri全部请求一遍。 如我需要把变量C53这个变量&#xff08;共计取到了3个值&#x…

Language Models are Few-Shot Learners

Abstract 最近的研究表明&#xff0c;通过在大量文本语料上进行预训练&#xff0c;然后在特定任务上进行微调&#xff0c;可以在许多自然语言处理任务和基准测试中取得显著进展。尽管这种方法在架构上通常是任务无关的&#xff0c;但它仍然需要特定任务的微调数据集&#xff0…