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

SQL语句的执行顺序怎么理解?

SQL语句的执行顺序怎么理解?

我们常常会被SQL其书写顺序和执行顺序之间的差异所迷惑。理解这两者的区别,对于编写高效、可靠的SQL代码至关重要。今天,让我们用一些生动的例子和场景来深入探讨SQL的执行顺序。

一、书写顺序 VS 执行顺序

SQL语句的书写顺序遵循的是逻辑直观性,使人能够轻易理解和组织查询的内容。然而,它的执行顺序是基于数据库查询优化器的内部机制,旨在提高查询的效率。

书写顺序

我们通常按照以下顺序编写SQL语句:

  1. SELECT
  2. FROM
  3. JOIN
  4. WHERE
  5. GROUP BY
  6. HAVING
  7. ORDER BY
  8. LIMIT

执行顺序

而其执行顺序却是这样的:

  1. FROM
  2. ON
  3. JOIN
  4. WHERE
  5. GROUP BY
  6. (CUBE|ROLLUP)
  7. HAVING
  8. SELECT
  9. DISTINCT
  10. ORDER BY
  11. LIMIT

二、深入理解执行顺序

FROM 和 JOIN(笛卡尔积、筛选器、外部行)

  • FROM子句是查询的起点,用于确定基础表。
  • JOINON子句决定如何将这些表连接起来。

最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。

这是大佬写的, 7701页的BAT大佬写的刷题笔记,让我offer拿到手软

WHERE(筛选行)

  • WHERE子句过滤掉不符合条件的行。

GROUP BY(分组)

  • GROUP BY对符合条件的行进行分组。

HAVING(分组后筛选)

  • HAVING子句筛选分组后的结果。

SELECT 和 DISTINCT(选择与去重)

  • SELECT确定最终展示的列。
  • DISTINCT用于去除重复的行。

ORDER BY 和 LIMIT(排序和限制)

  • ORDER BY对结果进行排序。
  • LIMIT限制返回的行数。

三、实际案例分析

1. 基础查询

考虑一个简单的查询:

SELECT name, age
FROM users
WHERE age > 30
ORDER BY age;

这个查询首先从users表中选择年龄大于30的记录(FROMWHERE),然后选择nameage列(SELECT),最后按年龄排序(ORDER BY)。

2. JOIN查询

涉及JOIN的复杂查询:

SELECT u.name, u.age, o.order_id
FROM users u
JOIN orders o ON u.user_id = o.user_id
WHERE u.age > 30
ORDER BY o.order_date;

在这个例子中,我们首先确定了两个表(FROM usersJOIN orders),根据用户ID将它们连接起来(ON u.user_id = o.user_id),过滤出年龄大于30的用户(WHERE),然后选择特定的列进行展示(SELECT),最后按订单日期排序(ORDER BY)。

3. 性能优化场景

假设有一个大型的用户表和订单表,我们需要有效地查询某个年龄段的用户及其订单。正确理解执行顺序有助于我们优化这个查询,例如,首先过滤出特定年龄段的用户,然后再去JOIN订单表,这样可以显著减少JOIN的计算量。

四、ORDER BY的特殊情况

在你提出的问题中,ORDER BY按照SCORE列排序,但SELECT子句中并没有选择这一列。这是一个常见的误区。实际上,在执行ORDER BY时,数据库会考虑所有的列,即使这些列没有在SELECT子句中明确指出。因此,即使SCORE列在SELECT子句中没有出现,它仍然可以用于排序。

五、使用聚合函数

考虑这样一个查询:我们想要找出每个部门平均工资最高的前三名员工。

SELECT department_id, employee_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id, employee_id
HAVING AVG(salary) > 10000
ORDER BY department_id, avg_salary DESC
LIMIT 3;

在这个查询中,我们首先从employees表中选择数据(FROM),根据department_idemployee_id进行分组(GROUP BY),只选择平均工资超过10000的组(HAVING),然后选择部门ID、员工ID和平均工资(SELECT),按部门排序且工资降序(ORDER BY),最后选择每个部门的前三名(LIMIT)。

六、多表连接

假设我们需要查询所有顾客的订单信息,包括顾客姓名和订单细节。

SELECT c.name, o.order_details
FROM customers c
JOIN orders o ON c.id = o.customer_id
WHERE o.order_date > '2023-01-01'
ORDER BY c.name, o.order_date;

这个查询首先确定了连接customersorders表(FROMJOIN),根据顾客ID连接(ON),筛选出2023年1月1日之后的订单(WHERE),选择顾客姓名和订单详情(SELECT),并按顾客姓名和订单日期排序(ORDER BY)。

最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。

这是大佬写的, 7701页的BAT大佬写的刷题笔记,让我offer拿到手软

七、子查询

子查询可以用于多种场合,比如在WHERE子句中筛选记录。

SELECT name, age
FROM users
WHERE id IN (SELECT user_id FROM orders WHERE order_date > '2023-01-01')
ORDER BY age;

在这个例子中,SELECT子查询首先找出2023年1月1日之后下单的用户ID,然后外层查询根据这些ID选择用户的名字和年龄(FROMWHERE),最后按年龄排序(ORDER BY)。

八、使用CASE语句

CASE语句可以用来在查询中添加逻辑。

SELECT name, CASE WHEN age < 20 THEN '少年'WHEN age BETWEEN 20 AND 60 THEN '成年'ELSE '老年'END AS age_group
FROM users
ORDER BY age;

这里,CASE语句根据年龄分组(在SELECT中处理),首先从users表选择数据(FROM),然后按年龄排序(ORDER BY)。

九、窗口函数

窗口函数可以用来执行复杂的数据分析任务。

SELECT name, age, RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS rank
FROM employees;

在此查询中,RANK()窗口函数被用来计算每个部门内员工的工资排名(在SELECT中处理),首先选择所有员工(FROM),没有指定特别的排序或限制条件。

这些SQL案例中,可以提炼出几个关键的最佳实践和技巧

1. 优化数据筛选(WHERE和JOIN)

  • 有效使用WHERE子句:在连接表格前先用WHERE子句过滤掉不需要的数据,可以减少处理的数据量,从而提高查询效率。
  • 明智选择JOIN类型:根据查询需求选择合适的JOIN类型(INNER JOIN, LEFT JOIN, RIGHT JOIN等),可以有效控制结果集的大小和准确性。

2. 熟练使用聚合和分组(GROUP BY和HAVING)

  • 合理使用聚合函数:在GROUP BY子句中使用聚合函数(如AVG, SUM, COUNT等)可以有效地对数据进行总结和分析。
  • 精确过滤分组结果:HAVING子句用于过滤分组后的结果,特别是在处理聚合数据时,它比WHERE子句更加灵活。

3. 掌握数据排序和限制(ORDER BY和LIMIT)

  • 有效利用ORDER BY:正确使用ORDER BY子句可以确保结果集按照特定的顺序返回,这对于报告和用户界面显示非常重要。
  • 合理应用LIMIT:LIMIT子句非常有用,尤其是在处理大数据集时,它可以限制返回的结果数量,加快查询速度并减少内存消耗。

4. 灵活应用子查询和CASE语句

  • 子查询的强大功能:子查询可以在主查询之前或之内执行,使得SQL语句更加强大和灵活。
  • 使用CASE语句进行条件逻辑处理:CASE语句可以在SELECT、WHERE和ORDER BY子句中使用,实现复杂的条件逻辑。

5. 理解窗口函数

  • 窗口函数的应用:窗口函数(如RANK, ROW_NUMBER等)可以用于执行复杂的数据分析和处理,如排名、分区数据处理等。

6. 性能优化

  • 索引的重要性:合理使用索引可以显著提高查询效率,尤其是在大数据量的表上。
  • 避免不必要的复杂性:过于复杂的JOIN和子查询可能导致性能下降,应当避免不必要的复杂性。

7. 清晰易懂的代码

  • 代码可读性:写出清晰、易于理解的SQL代码对于维护和团队协作非常重要。

通过运用这些技巧,你可以编写出既高效又易于理解的SQL查询,这对于处理各种数据分析和数据库操作任务至关重要。记住,良好的SQL实践不仅仅关乎代码本身,还涉及到如何在特定的数据环境中最有效地运用这些代码。

推荐一个学习 MySQL 的专栏

  • 01、MySQL MariaDB 基础教程
  • 02、MySQL 简介
  • 03、MySQL MariaDB 安装
  • 04、MySQL 管理
  • 05、MySQL 日常管理
  • 06、MySQL PHP 语法
  • 07、MySQL 创建连接
  • 08、MySQL 获取数据库列表
  • 09、MySQL 创建数据库
  • 10、MySQL 删除数据库
  • 11、MySQL 选择数据库
  • 12、MySQL 数据类型
  • 13、MySQL 列出数据表
  • 14、MySQL 创建数据表
  • 15、MySQL 删除表
  • 16、MySQL 插入数据
  • 17、MySQL 获取插入数据的 ID
  • 18、MySQL SELECT FROM 查询数据
  • 19、MySQL WHERE 子句有条件的查询数据
  • 20、MySQL UPDATE 更新数据
  • 21、MySQL DELETE FROM 语句删除数据
  • 22、MySQL 返回删改查受影响的行数
  • 23、MySQL LIKE 子句模糊查询数据
  • 24、MySQL UNION 操作符查询多张表
  • 25、MySQL ORDER BY 排序
  • 26、MySQL GROUP BY 分组查询数据
  • 27、MySQL JOIN 进行多表查询
  • 28、MySQL NULL 值处理
  • 29、MySQL REGEXP 子句正则表达式查询
  • 30、MySQL 数据库事务
  • 31、MySQL ALTER 命令
  • 32、MySQL 索引
  • 33、CREATE TEMPORARY TABLE 创建临时表
  • 34、MySQL DROP TABLE 删除临时表
  • 35、MySQL INSERT INTO SELECT 复制表
  • 36、MySQL 获取服务器元数据
  • 37、MySQL 自增序列 AUTO_INCREMENT
  • 38、MySQL 处理重复数据
  • 39、MySQL 安全及防止 SQL 注入攻击
  • 40、MySQL 导出数据
  • 41、MySQL 导入数据

总结

理解SQL的执行顺序不仅能帮助我们写出更有效的查询,还能让我们更好地理解数据库是如何处理我们的请求的。通过实际案例的分析和理解,我们可以更好地掌握SQL查询的艺术。记住,每一条SQL语句都像是一次小小的旅行,从FROM出发,经过一系列的处理,最终到达SELECT的归宿。

在SQL的世界里,旅途的顺序和规划同样重要,它决定了查询的效率和准确性。我们要做的,就是成为这个旅程的优秀规划师。

最后说一句(求关注,求赞,别白嫖我)

最近无意间获得一份阿里大佬写的刷题笔记,一下子打通了我的任督二脉,进大厂原来没那么难。

这是大佬写的, 7701页的BAT大佬写的刷题笔记,让我offer拿到手软

项目文档&视频:

项目文档 & 视频

本文,已收录于,我的技术网站 ddkk.com,有大厂完整面经,工作技术,架构师成长之路,等经验分享

求一键三连:点赞、分享、收藏

点赞对我真的非常重要!在线求赞,加个关注我会非常感激!@架构师专栏

相关文章:

SQL语句的执行顺序怎么理解?

SQL语句的执行顺序怎么理解&#xff1f; 我们常常会被SQL其书写顺序和执行顺序之间的差异所迷惑。理解这两者的区别&#xff0c;对于编写高效、可靠的SQL代码至关重要。今天&#xff0c;让我们用一些生动的例子和场景来深入探讨SQL的执行顺序。 一、书写顺序 VS 执行顺序 SQ…...

js解析.shp文件

效果图 原理与源码 本文采用的是shapefile.js工具 这里是他的npm地址 https://www.npmjs.com/package/shapefile 这是他的unpkg地址&#xff0c;可以点开查看源码 https://unpkg.com/shapefile0.6.6/dist/shapefile.js 这个最关键的核心问题是如何用这个工具&#xff0c;网上…...

关于“Python”的核心知识点整理大全25

目录 10.3.4 else 代码块、 10.3.5 处理 FileNotFoundError 异常 alice.py 在这个示例中&#xff0c;try代码块引发FileNotFoundError异常&#xff0c;因此Python找出与该错误匹配的 except代码块&#xff0c;并运行其中的代码。最终的结果是显示一条友好的错误消息&#x…...

代码随想录刷题题Day15

刷题的第十五天&#xff0c;希望自己能够不断坚持下去&#xff0c;迎来蜕变。&#x1f600;&#x1f600;&#x1f600; 刷题语言&#xff1a;C Day15 任务 ● 513.找树左下角的值 ● 112. 路径总和 113.路径总和ii ● 106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历…...

软件设计师——信息安全(一)

&#x1f4d1;前言 本文主要是【信息安全】——软件设计师——信息安全的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304…...

git必须掌握:git远程变动怎么解决

如何已经指定了选择分支 那下面的分支名称可以省略 如果远程分支存在变动&#xff0c;通常 git 推送的流程如下&#xff1a; 首先&#xff0c;使用 git fetch 命令从远程仓库获取最新的分支信息和变动。 git fetch然后&#xff0c;可以使用 git merge 或者 git rebase 命令进…...

Python里的时间模块

time 模块 时间表示方式 时间戳 timestamp:表示的是从 1970 年1月1日 00:00:00 开始按秒计算的偏移量UTC(Coordinated Universal Time, 世界协调时)亦即格林威治天文时间,世界标准时间。在中国为 UTC+8 DST(Daylight Saving Time) 即夏令时;结构化时间(struct_time): …...

SCI一区级 | Matlab实现GWO-CNN-GRU-selfAttention多变量多步时间序列预测

SCI一区级 | Matlab实现GWO-CNN-GRU-selfAttention多变量多步时间序列预测 目录 SCI一区级 | Matlab实现GWO-CNN-GRU-selfAttention多变量多步时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现GWO-CNN-GRU-selfAttention灰狼算法优化卷积门控循环…...

C#学习相关系列之自定义遍历器

在C#中&#xff0c;自定义遍历器需要实现IEnumerable接口和IEnumerator接口。其中&#xff0c;IEnumerable接口包含一个GetEnumerator方法&#xff0c;该方法返回一个IEnumerator接口的实例&#xff0c;而IEnumerator接口包含Current、MoveNext和Reset方法。 IEnumerable&#…...

WPS没保存关闭了怎么恢复数据?3个方法,完成数据恢复!

“我今天在使用WPS时&#xff0c;突然有点急事出去了一趟&#xff0c;但是我忘记保存文档了&#xff0c;回来之后发现电脑自动关机了&#xff0c;我的文档也没了&#xff01;这可怎么办呢&#xff1f;有什么办法可以找回这些数据吗&#xff1f;” 在快节奏的工作中&#xff0c;…...

数据结构和算法-最小生成树(prim和krusakal)和最短路径问题(BFS和dijkastra和floyd)

文章目录 最小生成树总览生成树广度优先生成树深度优先生成树最小生成树Prim算法Kruskal算法Prim vs KrusakalPrim的实现Kruskal的实现 小结 最短路径问题单源最短路径问题BFS求无权图的单源最短路径小结Dijkastra算法算法时间复杂度不适用情况 每一对顶点的最短路径问题Floyd算…...

响应者链概述

响应者链 iOS事件的3大类型 Touch Events(触摸事件)Motion Events(运动事件&#xff0c;比如重力感应和摇一摇等)Remote Events(远程事件&#xff0c;比如用耳机上得按键来控制手机) 触摸事件 处理触摸事件的两个步骤 寻找事件的最佳响应者事件的响应在响应链中的传递 寻…...

ShenYu网关Http服务探活解析

文章目录 网关端服务探活admin端服务探活 Shenyu HTTP服务探活是一种用于检测HTTP服务是否正常运行的机制。它通过建立Socket连接来判断服务是否可用。当服务不可用时&#xff0c;将服务从可用列表中移除。 网关端服务探活 以divide插件为例&#xff0c;看下divide插件是如何获…...

基于dockerfile搭建LNMP

组件自定义IP所需组件nginx172.111.0.10nginxwordpressmysql172.111.0.20mysql-5.7.20php172.111.0.30php LNMP介绍 L&#xff1a;Linux平台&#xff0c;操作系统&#xff0c;另外桑组件的运行平台 N&#xff1a;nginx 提供前端页面 M&#xff1a;MySQL&#xff0c;开源关系的…...

基于VGG-16+Android+Python的智能车辆驾驶行为分析—深度学习算法应用(含全部工程源码)+数据集+模型(三)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 模型构建3. 模型训练及保存1&#xff09;模型训练2&#xff09;模型保存 4. 模型生成1&#xff09;模型导入及调用2&#xff09;相关代码&#xff08;1&#xff09;布局文件&#xff08;2&#xff…...

springMVC-@RequestMapping

基本介绍 RequestMapping注解可以指定控制器/处理器的某个方法的请求的url, 示例 &#xff08;结合springMVC基本原理理解&#xff09; Controller public class UserHandler {RequestMapping(value "/login")public String login() {System.out.println("登…...

智能优化算法应用:基于树种算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于树种算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于树种算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.树种算法4.实验参数设定5.算法结果6.参考文献7.MA…...

web前端项目-影视网站开发

影视网站 本项目主要使用到了 HTML&#xff1b;CSS&#xff1b;JavaScript脚本技术&#xff1b;AJAX无刷新技术&#xff1b;jQuery等技术实现了动态影视网页 运行效果&#xff1a; 一&#xff1a;index.html <!DOCTYPE> <html lang"en"> <head>…...

QT:Unable to create a debugging engine.

debug跑不了&#xff1a; 报错&#xff1a;Unable to create a debugging engine. 参考&#xff1a; https://blog.csdn.net/u010906468/article/details/104716198 先检查是否安装了DEBUG插件 工具-》》选项 查看插件&#xff0c;如果没有的话&#xff0c;需要重新安装qt时…...

如何理解Rust语言中的“impl”关键字

在Rust编程语言中&#xff0c;impl是一个关键字&#xff0c;用于为类型实现方法和特性&#xff08;traits&#xff09;。impl关键字后面可以跟一个类型或者特性名称&#xff0c;然后在大括号中定义该类型或特性的具体实现。 当我们使用impl关键字为一个类型实现方法时&#xf…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...