SQL的select语句完整的执行顺序

SQL的SELECT语句的执行顺序可以用"做菜流程"来类比理解。虽然我们写SQL时按SELECT…FROM…WHERE…顺序写,但数据库执行顺序完全不同。以下是通俗易懂的讲解(附流程图和示例):

🔧 执行顺序流程图:
FROMJOINWHEREGROUP BYHAVINGSELECTDISTINCTORDER BYLIMIT/OFFSET

🍳 做菜版类比:
假设你要做一盘"宫保鸡丁"
1. 准备食材(FROM+JOIN) → 2. 筛选新鲜食材(WHERE)
3. 按类别分组(GROUP BY)→ 4. 检查调料是否达标(HAVING)
5. 选择需要的配菜(SELECT)→ 6. 去掉重复的(DISTINCT)
7. 摆盘顺序(ORDER BY)→ 8. 最终装盘量(LIMIT)

📝 分步详解(以查询为例):

SELECT department, COUNT(*) as emp_count 
FROM employees 
WHERE salary > 5000 
GROUP BY department 
HAVING COUNT(*) > 3 
ORDER BY emp_count DESC 
LIMIT 2;

1️⃣ FROM + JOIN(先确定数据源)

-- 第一步:先读取employees表的所有数据
FROM employees

2️⃣ WHERE(筛选行)

-- 第二步:过滤出工资>5000的记录
WHERE salary > 5000 
-- 注意:这里还不能使用SELECT中的别名emp_count!

3️⃣ GROUP BY(分组)

-- 第三步:按部门分组
GROUP BY department 
-- 现在数据被分成若干组,比如:[HR组, IT组, Finance组...]

4️⃣ HAVING(筛选分组)

-- 第四步:只保留员工数>3的部门
HAVING COUNT(*) > 3 
-- 这里可以用聚合函数,但WHERE不行

5️⃣ SELECT(选择列)

-- 第五步:选出部门名称和统计数
SELECT department, COUNT(*) as emp_count 
-- 此时才生成emp_count这个别名

6️⃣ DISTINCT(去重)

-- 如果有DISTINCT,此时执行去重操作
-- 本例没有使用

7️⃣ ORDER BY(排序)

-- 第六步:按统计数降序排列
ORDER BY emp_count DESC 
-- 这里可以使用SELECT阶段生成的别名!

8️⃣ LIMIT/OFFSET(最终限制)

-- 第七步:只取前2条结果
LIMIT 2

💡 关键记忆点:

  1. WHERE vs HAVING:WHERE过滤行,HAVING过滤分组
  2. 别名使用顺序:ORDER BY可以使用SELECT的别名,WHERE不行
  3. 聚合函数位置:HAVING可用聚合函数,WHERE不可用
  4. 执行顺序与书写顺序不同:FROM永远最先执行

📊 最终结果示例:
假设原始数据:

部门工资
HR6000
HR5500
IT7000
IT7200
IT6800
Finance8000

经过各步骤处理后会得到:

departmentemp_count
IT3
HR2

但因为HAVING COUNT(*)>3和LIMIT 2,最终只显示IT部门(假设IT组实际有超过3人)

记住这个流程,面试时可以用"做菜步骤"来形象描述,保证面试官印象深刻!

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

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

相关文章

Spring Cloud LoadBalancer详解

一、介绍 Spring Cloud LoadBalancer是Spring Cloud官方自己提供的客户端负载均衡器,抽象和实现,用来替代Ribbon(已经停更), 二、Ribbon和Loadbalance 对比 组件组件提供的负载策略支持负载的客户端Ribbon随机 RandomRule轮询 RoundRobinRule 重试 RetryRule最低并发 Bes…

ubuntu中ollama设置记录

自己同一台电脑主机安装3080和3090显卡,测试发现ollama只默认跑在3090上;故查看一下设置,成功也把3080也运行起来了。 原因如下: 开始设置记录: Environment Variables: OLLAMA_DEBUG 作用:显示额外的调试…

RabbitMQ系列(四)基本概念之Exchange

在 RabbitMQ 中,Exchange(交换机) 是消息路由的核心组件,负责根据规则将生产者发送的消息分发到对应的队列(Queue)中。以下是其核心功能与分类的详细说明: 一、Exchange 的核心作用 消息路由枢…

有没有什么免费的AI工具可以帮忙做简单的ppt?

互联网各领域资料分享专区(不定期更新): Sheet 正文 1. 博思AIPPT 特点:专为中文用户设计,支持文本/文件导入生成PPT,内置海量模板和智能排版功能,涵盖商务、教育等多种场景。可一键优化布局、配色,并集成AI绘图功能(文生图/图生图)。适用场景:职场汇报、教育培训、商…

【Python · PyTorch】循环神经网络 RNN(基础应用)

【Python PyTorch】循环神经网络 RNN(简单应用) 1. 简介2. 模拟客流预测(数据集转化Tensor)3.1 数据集介绍3.2 训练过程 3. 模拟股票预测(DataLoader加载数据集)3.1 IBM 数据集3.1.2 数据集介绍3.1.3 训练…

【JSON2WEB】15 银河麒麟操作系统下部署JSON2WEB

【JSON2WEB】系列目录 【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSO…

地基简识Spring MVC 组件

Spring MVC 是一个基于 MVC 设计模式的框架,其核心组件协同工作以处理 HTTP 请求并生成响应。以下是各组件的详细说明及其协作流程: 一、​核心组件 ​DispatcherServlet(前端控制器)​ ​作用:接收所有请求并协调其他…

Spring Boot(七):Swagger 接口文档

1. Swagger 简介 1.1 Swagger 是什么? Swagger 是一款 RESTful 风格的接口文档在线自动生成 功能测试功能软件。Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。目标是使客户端和文件系统作为服务器以同样的…

cursor 弹出在签出前,请清理仓库工作树 窗口

问题出现的背景:是因为我有两台电脑开发,提交后,另一个电脑的代码是旧的,这个时候我想拉取最新的代码,就会出现如下弹窗,因为这个代码暂存区有记录或者工作区有代码的修改,所以有冲突&#xff0…

Cocos Creator3.8.6拖拽物体的几种方式

文章目录 前言一、第一种通过UILocation二、第二种通过UIDelta实现总结 前言 在游戏开发中,拖拽物体是一个非常常见的交互功能,无论是用于UI元素的拖动,还是场景中物体的移动,拖拽操作都能极大地提升用户体验。Cocos Creator 3.8…

在 Mac mini M2 上本地部署 DeepSeek-R1:14B:使用 Ollama 和 Chatbox 的完整指南

随着人工智能技术的飞速发展,本地部署大型语言模型(LLM)已成为许多技术爱好者的热门选择。本地部署不仅能够保护隐私,还能提供更灵活的使用体验。本文将详细介绍如何在 Mac mini M2(24GB 内存)上部署 DeepS…

《UE5_C++多人TPS完整教程》学习笔记33 ——《P34 关卡与大厅之间的过渡(Transition Level And Lobby)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P34 关卡与大厅之间的过渡(Transition Level And Lobby)》 的学习笔记,该系列教学视频为计算机工程师、程序员、游戏开发者、作家(Engineer, Programmer, Game Developer,…

Nginx 配置与常用命令速查手册

Nginx 配置文件结构 Linux 中 Nginx 的配置文件: 通常位于 /etc/nginx/nginx.conf 或 /usr/local/nginx/conf/nginx.conf。 Nginx 采用模块化设计,主要分为以下部分: 1. 全局块 配置与服务器整体相关的参数,如工作进程数、日…

Vscode 便用快捷键设置教程

文章目录 简介:1. go to define (跳转到函数定义的位置)2. go to declaration (跳转到函数声明的位置)3. move line (上下移动本行代码)3.1上下复制本行代码 4. 前进和后退(就是前进到光标上一次停留的位置,和后退到那…

Vim 常用快捷键大全:跳转、编辑、查找替换全解析

摘要: Vim 是一款非常强大的文本编辑器,许多程序员和系统管理员都离不开它。 本文详细介绍了 Vim 编辑器中的常用快捷键和命令,从基本模式、光标移动、编辑操作到查找替换,再到文件保存等常用操作,帮助你快速上手并提…

【实战篇】【深度解析DeepSeek:从机器学习到深度学习的全场景落地指南】

一、机器学习模型:DeepSeek的降维打击 1.1 监督学习与无监督学习的"左右互搏" 监督学习就像学霸刷题——给标注数据(参考答案)训练模型。DeepSeek在信贷风控场景中,用逻辑回归模型分析百万级用户数据,通过特征工程挖掘出"凌晨3点频繁申请贷款"这类魔…

Vue核心知识:Vue动态权限到按钮完整方案

为了进一步实现上面提到的动态路由功能,并且加入对每个路由的权限控制(即增、删、改、查按钮的权限控制),我们需要对数据库、后端接口、前端的设计做一些改进和扩展。下面我将详细描述如何在现有方案的基础上加入对路由的增、删、…

swift 开发效率提升工具

安装github copliot for xcode github/CopilotForXcode brew install --cask github-copilot-for-xcode安装swiftformat for xcode brew install swiftformatXcode Swift File代码格式化-SwiftFormat

Trae智能协作AI编程工具IDE:如何在MacBook Pro下载、安装和配置使用Trae?

Trae智能协作AI编程工具IDE:如何在MacBook Pro下载、安装和配置使用Trae? 一、为什么选择Trae智能协作IDE? 在AI编程新时代,Trae通过以下突破性功能重新定义开发体验: 双向智能增强:AI不仅提供代码补全&a…

【推荐项目】023-游泳俱乐部管理系统

023 游泳俱乐部管理系统 游泳俱乐部管理系统概述 前端技术框架: 我们优雅地采用了Vue.js作为游泳俱乐部管理系统的前端基础框架。Vue.js以其轻盈、高效和易于上手的特点,为我们的用户界面带来了极致的流畅性和响应速度。通过Vue.js,我们为…