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,有大厂完整面经,工作技术,架构师成长之路,等经验分享

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

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

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

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

相关文章

【unity实战】一个通用的FPS枪支不同武器射击控制脚本

文章目录 前言模型素材文章用到的粒子火光特效射击效果换弹瞄准开枪抖动效果设置显示文本最终代码不同武器射击效果1. 手枪2. 机枪3. 狙击枪4. 霰弹枪5. 加特林 其他感谢完结 前言 实现FPS枪支不同武器效果&#xff0c;比如手枪&#xff0c;喷子&#xff0c;狙击枪&#xff0c…

《使用ThinkPHP6开发项目》 - 创建应用

《使用ThinkPHP6开发项目》 - 安装ThinkPHP框架-CSDN博客 《使用ThinkPHP6开发项目》 - 设置项目环境变量-CSDN博客 《使用ThinkPHP6开发项目》 - 项目使用多应用开发-CSDN博客 根据前面的步骤&#xff0c;我们现在就可以开发我们的项目开发了&#xff0c;根据项目开发的需要…

【数据挖掘】国科大苏桂平老师数据库新技术课程作业 —— 第四次作业

云数据库研究 云计算与云数据库背景 云计算&#xff08;cloud computing&#xff09;是 IT 技术发展的最新趋势&#xff0c;正受到业界和学术界的广泛关注。云计算是在分布式处理、并行处理和网格计算等技术的基础上发展起来的&#xff0c;是一种新兴的共享基础架构的方法。它…

[足式机器人]Part4 南科大高等机器人控制课 Ch05 Instantaneous Velocity of Moving Frames

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;CLEAR_LAB 笔者带更新-运动学 课程主讲教师&#xff1a; Prof. Wei Zhang 南科大高等机器人控制课 Ch05 Instantaneous Velocity of Moving Frames 1.Instantanenous Velocity of Rotating Frames2.Instantanenous Veloc…

最新Redis7持久化(权威出版)

首先我们要知道什么是持久化&#xff1a;持久化是指将数据保存到磁盘上&#xff0c;以确保在Redis服务器重启时数据不会丢失。 Redis支持两种主要的持久化方式&#xff1a;RDB持久化和AOF持久化 下面让我依次给你介绍一下&#xff1a; RDB持久化 作用 这是将Redis数据保存…

Java语言概述及保姆级入门教程(JDK 17版本)

笔记来自尚硅谷老师-康老师 学习教程&#xff1a;https://www.bilibili.com/video/BV1PY411e7J6/?spm_id_from333.337.search-card.all.click 1、Java基础全程脉络图 1.1 本章专题与脉络 2. 抽丝剥茧话Java 2.1 当前大学生就业形势 麦可思研究院发布了《2022年中国大学生就业…

C#图像处理OpenCV开发指南(CVStar,09)——边缘识别之Scharr算法的实例代码

1 边缘识别之Scharr算法 算法文章很多&#xff0c;不再论述。 1.1 函数原型 void Cv2.Scharr(src,dst,ddepth,dx,dy,scale,delta,borderType&#xff09; 1.2 参数说明 src 代表原始图像。dst 代表目标图像。ddepth 代表输出图像的深度。CV_16Sdx 代表x方向上的求导阶数…

uniApp应用软件在运行时,不符合华为应用市场审核标准。解决方案合集!

&#xff08;暂时用不到的也建议收藏一下&#xff0c;因为文章持续更新中&#xff09; 最新更改时间&#xff1a;20023-12-10 第一次做App应用开发相信大家一定都遇到过华为应用市场审核的“驳回”&#xff01; 有些问题一看就明白可以立马修改&#xff0c;而有一些问题修改意…

Dubbo入门直接上手,结合微服务详解

Dubbo 高性能、轻量级的 Java RPC 框架 RPC&#xff1a; Remote Procedure Call 远程过程调用&#xff0c;简单来说就是它允许一个计算机程序通过网络请求调用另一个计算机上的程序&#xff0c;就像本地调用一样。有非常多的协议和技术来都实现了RPC的过程&#xff0c;比如&a…

Elasticsearch 8.9 refresh刷Es缓冲区的数据到Lucene,更新segemnt,使数据可见

一、相关API的handler1、接受HTTP请求的hander(RestRefreshAction)2、往数据节点发送刷新请求的action(TransportRefreshAction)3、数据节点接收主节点refresh传输的action(TransportShardRefreshAction) 二、在IndexShard执行refresh操作1、根据入参决定是使用lucene提供的阻塞…

【设计模式--创建型--原型模式】

设计模式--创建型--原型模式 原型模式概述结构实现结果 案例代码结果使用场景 扩展&#xff08;深\浅克隆&#xff09;浅克隆演示&#xff1a;结果&#xff1a;使用深克隆&#xff08;利用对象流&#xff09;结果 原型模式 概述 用一个已经创建的实例作为原型&#xff0c;通过…

Spring Cloud Gateway + Nacos + LoadBalancer实现企业级网关

1. Spring Cloud Gateway 整合Nacos、LoadBalancer 实现企业级网关 前置工作&#xff1a; 创建 SpringBoot 多模块项目创建网关&#xff08;gateway-service&#xff09;、用户&#xff08;user-service&#xff09;模块用户模块添加 Nacos discovery 支持以及 Spring Web&am…

gitbash下载安装

参考教程 零、下载 官网地址 2.43.0win64 链接&#xff1a;https://pan.baidu.com/s/16urs_nmky7j20-qNzUTTkg 提取码&#xff1a;7jaq 一、安装 图标组件&#xff08;Additional icons&#xff09;&#xff1a;选择是否创建桌面快捷方式&#xff1b;桌面浏览&#xff08;Win…

逸迅科技丁红阳:三种能力帮助企业打造GBI “护城河”

大数据产业创新服务媒体 ——聚焦数据 改变商业 近日&#xff0c;由上海市经济和信息化委员会、上海市科学技术委员会指导&#xff0c;数据猿与上海大数据联盟联合主办的“2023企业数智化转型升级发展论坛”在上海举行。本次论坛以“释放数字价值驱动智能升级”为主题&#xf…

piakachu越权漏洞

水平越权 首先打开这一关&#xff0c;在右侧有一些提示&#xff0c;我们可以看到 然后我们随便输入一组信息即可&#xff0c;可以在url中看到这样的字段 当我们尝试在url中直接更换另一个用户名时可以发现&#xff0c;直接切换到了另一个用户的身份 垂直越权 这里可以看到右边…

一文学会使用 PyInstaller 将 Python 脚本打包为 .exe 可执行文件

文章目录 前言PyInstaller特点跨平台支持自动依赖项处理单文件发布支持图形用户界面&#xff08;GUI&#xff09;和命令行界面&#xff08;CLI&#xff09;应用支持多种打包选项 基本用法常用参数其它参数 版本 & 环境实现步骤安装 PyInstaller创建 Python 脚本使用 PyInst…

【SpringBoot教程】SpringBoot 创建定时任务(配合数据库动态执行)

作者简介&#xff1a;大家好&#xff0c;我是撸代码的羊驼&#xff0c;前阿里巴巴架构师&#xff0c;现某互联网公司CTO 联系v&#xff1a;sulny_ann&#xff08;17362204968&#xff09;&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗…

transformer模型结构|李宏毅机器学习21年

来源&#xff1a;https://www.bilibili.com/video/BV1Bb4y1L7FT?p4&vd_sourcef66cebc7ed6819c67fca9b4fa3785d39 文章目录 概述seq2seqtransformerEncoderDecoderAutoregressive&#xff08;AT&#xff09;self-attention与masked-self attentionmodel如何决定输出的长度…

【亲测有效】支持横竖屏 微信小程序video禁止进度条拖动,微信小程序遮罩进度条,

背景&#xff1a;部分课程禁止客户拖动视频进度条直至播放结束 红色是遮罩区域遮罩区域 实际遮罩效果&#xff08;有一个很浅的阴影区域&#xff09; 实现代码 .wxml文件 <video enable-progress-gesture"false" ><cover-view class"cover">…

基于深度学习的yolov7植物病虫害识别及防治系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介简介YOLOv7 系统特性工作流程 二、功能三、系统四. 总结 一项目简介 # YOLOv7植物病虫害识别及防治系统介绍 简介 该系统基于深度学习技术&#xff0c;采…