MySQL - 表达式With as 语句的使用及练习

目录

[8.1 WITH AS 的含义](#8.1 WITH AS 的含义)

[8.2 WITH AS语法的基本结构如下:](#8.2 WITH AS语法的基本结构如下:)

[8.3 练习题1](#8.3 练习题1)

[8.4 牛客练习题](#8.4 牛客练习题)


8.1 WITH AS 的含义

WITH AS 语法是MySQL中的一种临时结果集,它可以在SELECT、INSERT、UPDATE或DELETE语句中使用。通过使用WITH AS语句,可以将一个查询的结果存储在一个临时表中,然后在后续的查询中引用这个临时表。这样可以简化复杂的查询,提高代码的可读性和可维护性。

8.2 WITH AS语法的基本结构如下:

sql 复制代码
WITH temporary_table_name AS (
  SELECT column1, column2, ...
  FROM table_name
  WHERE condition
)
SELECT * FROM temporary_table_name;
复制代码
其中,temporary_table_name是https://so.csdn.net/so/search?q=%E4%B8%B4%E6%97%B6%E8%A1%A8&spm=1001.2101.3001.7020的名称,table_name是要查询的表名,condition是筛选条件。

8.3 练习题1

数据库

sql 复制代码
drop table if exists  `dept_emp` ;
drop table if exists  `salaries` ;
CREATE TABLE `dept_emp` (
                            `emp_no` int(11) NOT NULL,
                            `dept_no` char(4) NOT NULL,
                            `from_date` date NOT NULL,
                            `to_date` date NOT NULL,
                            PRIMARY KEY (`emp_no`,`dept_no`));
CREATE TABLE `salaries` (
                            `emp_no` int(11) NOT NULL,
                            `salary` int(11) NOT NULL,
                            `from_date` date NOT NULL,
                            `to_date` date NOT NULL,
                            PRIMARY KEY (`emp_no`,`from_date`));
INSERT INTO dept_emp VALUES(10001,'d001','1986-06-26','9999-01-01');
INSERT INTO dept_emp VALUES(10002,'d001','1996-08-03','9999-01-01');
INSERT INTO dept_emp VALUES(10003,'d004','1995-12-03','9999-01-01');
INSERT INTO dept_emp VALUES(10004,'d004','1986-12-01','9999-01-01');
INSERT INTO dept_emp VALUES(10005,'d003','1989-09-12','9999-01-01');
INSERT INTO dept_emp VALUES(10006,'d002','1990-08-05','9999-01-01');
INSERT INTO dept_emp VALUES(10007,'d005','1989-02-10','9999-01-01');
INSERT INTO dept_emp VALUES(10009,'d006','1985-02-18','9999-01-01');
INSERT INTO dept_emp VALUES(10010,'d006','2000-06-26','9999-01-01');

INSERT INTO salaries VALUES(10001,88958,'2002-06-22','9999-01-01');
INSERT INTO salaries VALUES(10002,72527,'2001-08-02','9999-01-01');
INSERT INTO salaries VALUES(10003,43311,'2001-12-01','9999-01-01');
INSERT INTO salaries VALUES(10004,74057,'2001-11-27','9999-01-01');
INSERT INTO salaries VALUES(10005,94692,'2001-09-09','9999-01-01');
INSERT INTO salaries VALUES(10006,43311,'2001-08-02','9999-01-01');
INSERT INTO salaries VALUES(10007,88070,'2002-02-07','9999-01-01');
INSERT INTO salaries VALUES(10009,95409,'2002-02-14','9999-01-01');

有一个员工表dept_emp简况如下:

有一个薪水表salaries简况如下:

问题1:获取每个部门中当前员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary,按照部门编号dept_no升序排列,以上例子输出如下:

sql 复制代码
with temp as (
    select dept_no,d.emp_no,salary
    from dept_emp as d
    inner join salaries as s
    on d.emp_no=s.emp_no
)
select temp.dept_no,emp_no,maxSalary
from temp
inner join(
select dept_no, max(salary) as maxSalary
from temp
group by dept_no) as t2
on temp.dept_no=t2.dept_no and t2.maxSalary=salary
order by temp.dept_no;

8.4 牛客练习题

SQL206 获取每个部门中当前员工薪水的最高的相关信息

相关推荐
SL-staff3 分钟前
(一)数据源配置 —— JVS-Rules规则引擎 V2.5 操作说明介绍
数据库·jar·规则引擎·数据源·jvs-rules·api 接口·jvs低代码
李白的天不白8 分钟前
服务器上数据库的创建
mysql
ha_lydms16 分钟前
AnalyticDB基本概念
mysql·adb·analyticdb
摇滚侠1 小时前
Spring 零基础入门到进阶 基于 XML 管理 Bean 14-28
xml·数据库·spring
Fanta丶1 小时前
23.MySql group by优化、limit优化、 count优化、update优化
mysql
医疗信息化王工1 小时前
医院自律端系统——预警处置模块全栈实战(ASP.NET Core + Vue3 + Quartz 定时调度)
mysql·postgresql·vue·asp.net core·quartz
Metaphor6921 小时前
使用 Python 给 PDF 设置背景色或背景图
数据库·python·pdf
Gauss松鼠会1 小时前
【GaussDB】GaussDB重要通信参数汇总
服务器·网络·数据库·sql·性能优化·gaussdb·经验总结
睡不醒男孩0308231 小时前
第五篇:2026年企业级 PostgreSQL 高可用方案深度横评:Patroni vs. CLup 架构与可靠性全面对决
数据库·postgresql·架构
NineData1 小时前
SQL 都在等锁时,ChatDBA 先帮 MySQL 找到谁在挡路
数据库·人工智能·sql·mysql·安全·数据复制·数据迁移工具