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

news2024/12/27 11:41:24

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.coloradmin.cn/o/1310557.html

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

相关文章

数据结构和算法(全)

1.了解数据结构和算法 1.1 二分查找 二分查找&#xff08;Binary Search&#xff09;是一种在有序数组中查找特定元素的搜索算法。它的基本思想是将数组分成两半&#xff0c;然后比较目标值与中间元素的大小关系&#xff0c;从而确定应该在左半部分还是右半部分继续查找。这个…

后台业务管理系统原型模板,Axure后台组件库(整套后台管理页面)

后台业务系统需要产品经理超强的逻辑思维能力和业务理解能力&#xff0c;整理了一批后台原型组件及完整的用 Axure 8 制作的后台系统页面&#xff0c;方便产品经理们快速上手制作后台原型。 包括交互元件、首页、商品、订单、库存、用户、促销、运营、内容、统计、财务、设置、…

步进电机驱动芯片TB6600HG部分翻译

有些参数没看懂。一边设计&#xff0c;一边修正。 目录 1.芯片梗概 2.引脚配置 1)引脚含义 2)内部逻辑 3.功能详解 1&#xff09;励磁模式设置 2&#xff09;功能设置 3&#xff09;初始模式 4&#xff09;100% 电流设置(电流值) 5&#xff09;OSC 6&#xff09;衰减…

【unity】【WebRTC】从0开始创建一个Unity远程媒体流app-构建可同步场景

【背景】 最近在研究远程画面,所以就实践了一下。技术采用我认为比较合适的WebRTC。 这篇文章的基础是我的另一篇博文,如果希望顺利完成本篇操作,请先关注我后查询我的如下博文: 【WebRTC】【Unity】Unity Web RTC1-Unity中简单实现远程画面 上一篇地址: 【WebRTC】【Uni…

【PWN】学习笔记(三)【返回导向编程】(中)

目录 课程回顾动态链接过程 课程 课程链接&#xff1a;https://www.bilibili.com/video/BV1854y1y7Ro/?vd_source7b06bd7a9dd90c45c5c9c44d12e7b4e6 课程附件&#xff1a; https://pan.baidu.com/s/1vRCd4bMkqnqqY1nT2uhSYw 提取码: 5rx6 回顾 管道符 | 把前一个指令的输出作…

一文了解java中volatile关键字

认识volatile volatile关键字的作用有两个&#xff1a;变量修改对其他线程立即可见、禁止指令重排。 第二个作用我们后面再讲&#xff0c;先主要讲一下第一个作用。通俗点来说&#xff0c;就是我在一个线程对一个变量进行了修改&#xff0c;那么其他线程马上就可以知道我修改…

树莓派zero w入坑指南

树莓派zero w入坑指南 入坑契机 说起创客不得不提到开源硬件Raspberry Pi(树莓派)。它是一款基于ARM的微型电脑主板&#xff0c;以MicroSD卡为硬盘&#xff0c;提供HDMI和USB等外部接口&#xff0c;可连接显示器和键鼠。以上部件全部整合在一张仅比信用卡稍大的主板上&#x…

MHA高可用实验(故障模拟+恢复)

实验前准备 MHA manager节点服务器&#xff1a;192.168.188.13 MHA node和manager组件 Master节点服务器&#xff1a;192.168.188.14 mysql5.7、MHA node组件 Slave节点服务器1&#xff1a;192.168.188.15 mysql5.7、MHA node组件 Slave节点服务器2&#xff1a;192.…

uniapp x 相比于其他的开发系统框架怎么样?

首先我们要知道niapp这是一种基于Vue.js开发的跨平台应用框架&#xff0c;可以将同一套代码同时运行在多个平台上&#xff0c;包括iOS、Android、H5等。相比其他开发系统框架&#xff0c;他有什么优点呢&#xff1f;让我们共同探讨一下吧&#xff01; 图片来源&#xff1a;unia…

python每日学10:关于python实用版本的选择

用python也有好几年了&#xff0c;也会经常安装python&#xff0c;因为有工作需要&#xff0c;可能在各个地方使用python&#xff0c;自己的电脑也经常重装&#xff0c;重装后会装python&#xff0c;还有的时候&#xff0c;装的包太多了&#xff0c;影响整个环境的使用&#xf…

Meta 开启 Ray-Ban人工智能眼镜多模态 AI 功能测试,可识别物体、翻译语言

Meta 公司宣布他们将向部分用户推送其 Meta Ray-Ban 智能眼镜的多模态 AI 功能。这项功能允许 AI 助手通过眼镜的摄像头和麦克风了解佩戴者所看到和听到的事物&#xff0c;并提供相关信息和帮助。 Meta CEO 马克・扎克伯格在 Instagram 上展示了这项功能&#xff0c;他让眼镜推…

【WSL】Windows下的Linux子系统使用方法指南

▒ 目录 ▒ &#x1f6eb; 导读需求开发环境 1️⃣ WSL安装启用或关闭windows功能安装分发命令行启动Linux 2️⃣ WSL 的基本命令显示帮助列出可用的 Linux 发行版列出已安装的 Linux 发行版检查 WSL 版本更新 WSL通过 PowerShell 或 CMD 运行特定的 Linux 发行版关闭WSL全部服…

Amazon SageMaker:让机器学习变得更简单、更强大

授权说明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 亚马逊云科技开发者社区, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道。 前言&#xff1a; 在大数据时代的浪潮中&#xff0c;数据不再只…

期末数组函数加强练习

前言&#xff1a;由于时间问题&#xff0c;部分题解取自网友&#xff0c;但都是做过的好题。 对于有些用c实现的题目&#xff0c;可以转化成c实现&#xff0c;cin看成c的读入&#xff0c;可以用scanf&#xff0c;输出cout看作printf&#xff0c;endl即换行符 开胃菜&#xff…

多项创新技术加持,汉威科技危化品企业、化工园区两大智能化管控平台重磅发布

化工产业是我国支柱产业&#xff0c;化学品产值约占全球的40%&#xff0c;位列第一。石油化工、煤化工、化肥、制药、冶金、氢能源等产业持续升级迭代&#xff0c;化工园区作为重要载体&#xff0c;不断推动产业朝专业化、集约化方向发展。 近年来我国危险化学品领域重特大事故…

动手学深度学习-注意力机制

10.1注意力提示 自主性注意力机制 有意识的注意力机制。非自主性注意力机制 无意识的注意力机制。 小结: 人类的注意力是有限的&#xff0c;有价值和稀缺的资源。受试者使用非自主性和自主性提示有选择的引导注意力&#xff0c;前者基于突出性&#xff0c;后者则依赖于意识。…

【Spring教程28】Spring框架实战:从零开始学习SpringMVC 之 请求与请求参数详解

目录 1 设置请求映射路径1.1 环境准备 1.2 问题分析1.3 设置映射路径 2 请求参数2.1 环境准备2.2 参数传递2.2.1 GET发送单个参数2.2.2 GET发送多个参数2.2.3 GET请求中文乱码2.2.4 POST发送参数2.2.5 POST请求中文乱码 欢迎大家回到《Java教程之Spring30天快速入门》&#xff…

【操作系统导论】内存篇——分段

引入 利用基址和界限寄存器&#xff0c;操作系统很容易将不同进程重定位到不同的物理内存区域。 但是&#xff0c;对于一整个地址空间&#xff0c;在栈和堆之间存在一块空闲空间&#xff0c;如果将整个地址空间分配给进程&#xff0c;无疑造成了大量的内存浪费。 为了解决这…

软件测试面试八股文(答案解析+视频教程)

1、B/S架构和C/S架构区别 B/S 只需要有操作系统和浏览器就行&#xff0c;可以实现跨平台&#xff0c;客户端零维护&#xff0c;维护成本低&#xff0c;但是个性化能力低&#xff0c;响应速度较慢。 C/S响应速度快&#xff0c;安全性强&#xff0c;一般应用于局域网中&#xf…

场景化文案怎么来的?媒介盒子拆解写作技巧

为什么有时候你的软文营销起不到作用、用户不买单&#xff1f;可能是引起你没有做好场景提醒&#xff0c;没有切中用户的切身利益点。今天媒介盒子就来和大家聊聊&#xff1a;场景化文案怎么写。 一、 场景文案核心点 在了解场景化文案的写作技巧前&#xff0c;咱们先来理清场…