news 2026/7/13 22:16:00

复盘SQL①

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
复盘SQL①

SQLtest 01-07

  1. 查询所有员工的姓名、工资以及所在部门的名称。

  2. 查询每个部门的员工人数和平均工资。

  3. 查询工资高于公司平均工资的员工姓名、工资和部门名称(使用子查询)。

  4. 查询每个部门中工资最高的员工的姓名、工资和部门名称(使用子查询作为临时表)。

  5. 查询每个员工的姓名、工资,并使用case when将工资分类:高于10000为"高",8000-10000为"中",低于8000为"低"。

  6. 查询每个员工的信息,包括工龄(当前日期减去入职日期,以年为单位)。

  7. 查询所有员工姓名,将姓名转换为大写,并连接部门名称,格式为:“姓名-部门名称”。

#1selecte.emp_name,e.salary,d.dept_namefromemployees ejoindepartments done.dept_id=d.dept_id;#2selectd.dept_name,count(*),avg(e.salary)fromemployees ejoindepartments dond.dept_id=e.dept_idgroupbyd.dept_name;#3selecte.emp_name,e.salary,d.dept_namefromemployees ejoindepartments dond.dept_id=e.dept_idwheree.salary>(selectavg(employees.salary)fromemployees);#where 不能用函数 只能间接的使用select from 这种套娃叫做子查询selectavg(employees.salary)fromemployees;#4selectemployees.dept_id,max(employees.salary)asmaxsfromemployeesgroupbydept_id;selecte.emp_name,e.salary,d.dept_namefromemployees ejoindepartments dond.dept_id=e.dept_idjoin(selectdept_id,max(salary)asmaxsfromemployeesgroupbydept_id)asmaxdonmaxd.dept_id=e.dept_idandmaxd.maxs=e.salary;#5selecte.emp_name,e.salary,casewhene.salary>10000then'高'whene.salary>8000then'中'else'低'endas'锐评'fromemployees e;#6select*,timestampdiff(year,employees.hire_date,current_date)as'工龄'fromemployees;#7selectconcat(upper(e.emp_name),'-',d.dept_name)as'搞搞新意思'fromemployees ejoindepartments dond.dept_id=e.dept_id;序号 复盘要点1聚合函数不能直接放在WHERE中,需借助子查询2子查询是独立作用域,不能使用外部表的别名3子查询作为临时表(派生表)必须加别名4GROUPBY按什么分组,结果就按什么维度聚合5CASEWHEN结构要完整:有END,字符串有引号6工龄计算用 TIMESTAMPDIFF 最准确7CONCAT 和 UPPER 实现字符串拼接与大小写转换8日期函数:CURDATE()、TIMESTAMPDIFF()

以下是修正过程:

1.独立王国(子查询)不可以使用别名.属性

第一次尝试:

sqlselecte.emp_name,e.salary,d.dept_namefromemployees ejoindepartments dond.dept_id=e.dept_idjoin(selecte.dept_id,max(e.salary)asmaxs-- ❌ 错误1:子查询中用了外部别名 efrome-- ❌ 错误2:子查询中用了外部别名 e 作为表名groupbye.dept_id-- ❌ 错误3:子查询中用了外部别名 e)asmaxdonmaxd.dept_id=e.dept_idandmaxd.maxs=e.salary;报错信息:Table'test05.e'doesn't exist

第二次尝试:

sqlselecte.emp_name,e.salary,d.dept_namefromemployees ejoindepartments dond.dept_id=e.dept_idjoin(selecte.dept_id,max(e.salary)asmaxs-- ❌ 错误:子查询中仍然用了外部别名 efromemployees-- ✅ 表名改对了groupbye.dept_id-- ❌ 错误:子查询中仍然用了外部别名 e)asmaxdonmaxd.dept_id=e.dept_idandmaxd.maxs=e.salary;报错信息: Unknowncolumn'e.dept_id'in'field list'

二、修正后的正确代码

sqlselecte.emp_name,e.salary,d.dept_namefromemployees ejoindepartments dond.dept_id=e.dept_idjoin(selectdept_id,max(salary)asmaxs-- ✅ 去掉所有 e.,直接写列名fromemployees-- ✅ 用完整的表名groupbydept_id-- ✅ 直接写列名)asmaxdonmaxd.dept_id=e.dept_idandmaxd.maxs=e.salary;

三、总结

要点 说明
子查询是独立作用域 子查询 ( ) 内部看不到外部定义的别名(如 e),只能看到自己 from 中的表
外部别名只在外部有效 from employees e 定义的 e 只在外部查询有效,子查询内部不能使用
子查询内部要写完整表名 如 from employees,不能用 from e
子查询内部列名不加前缀 直接写 dept_id、salary 即可,因为子查询只有这一张表,不会产生歧义
外部查询中可以用别名 e. 在子查询 外面,e.emp_name、e.salary、e.dept_id 都是有效的

四、记忆口诀

子查询里别用外别名,表名列名直接写;
外部别名管外部,内外作用域不互通。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/13 22:15:43

Python 自动化之批量重命名与智能文件分类

电脑用久了,桌面和下载文件夹总会变得一团糟。用 Python 写几个脚本,一键重命名、按类型归档、清理重复文件。 一、批量重命名 1. 统一命名规则 import osdef batch_rename(directory, prefix"file", start1, digits3):"""统一…

作者头像 李华
网站建设 2026/7/13 22:11:08

能源国企总额管控改革:北京华恒智信薪酬管理案例

【客户行业】 能源业;国有企业;集团化管控【问题类型】 工资总额预算编制;福利费用管理;分类管控机制【客户背景】某省属能源集团是华中地区能源行业的骨干企业,成立于国家能源体制改革初期,经过多年发展已…

作者头像 李华
网站建设 2026/7/13 22:10:56

通信企业战略转型人力支撑:北京华恒智信管理案例

【客户行业】通信行业【问题类型】提高人效比【客户背景】某大型通信公司是集设计、生产、运营、维护、销售于一体的综合信息服务商,旨在向客户提供综合的信息化解决方案和专业化的通信服务。该公司已积累了较为丰富和领先的行业经验,随着技术的发展&…

作者头像 李华
网站建设 2026/7/13 22:05:56

CSS 过渡(transition)与基础动画:前端开发者的 MSDN 式指南

1. 引言:为什么需要 CSS 动画与过渡?在现代 Web 开发中,流畅的动画与过渡效果是提升用户体验、引导用户注意力、增强界面反馈的关键手段。CSS 提供了两种核心的动态样式能力:过渡(transition)和动画&#x…

作者头像 李华
网站建设 2026/7/13 21:59:14

如何快速上手Drab:3分钟搭建Phoenix实时前端控制环境

如何快速上手Drab:3分钟搭建Phoenix实时前端控制环境 【免费下载链接】drab Remote controlled frontend framework for Phoenix. 项目地址: https://gitcode.com/gh_mirrors/dr/drab 你是否厌倦了在Phoenix应用中编写繁琐的JavaScript代码?&…

作者头像 李华