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 获取每个部门中当前员工薪水的最高的相关信息

相关推荐
希忘auto29 分钟前
详解MySQL安装
java·mysql
运维佬37 分钟前
在 MySQL 8.0 中,SSL 解密失败,在使用 SSL 加密连接时出现了问题
mysql·adb·ssl
Leo.yuan41 分钟前
数据量大Excel卡顿严重?选对报表工具提高10倍效率
数据库·数据分析·数据可视化·powerbi
Runing_WoNiu1 小时前
MySQL与Oracle对比及区别
数据库·mysql·oracle
天道有情战天下1 小时前
mysql锁机制详解
数据库·mysql
看山还是山,看水还是。1 小时前
Redis 配置
运维·数据库·redis·安全·缓存·测试覆盖率
谷新龙0011 小时前
Redis运行时的10大重要指标
数据库·redis·缓存
CodingBrother1 小时前
MySQL 中单列索引与联合索引分析
数据库·mysql
精进攻城狮@1 小时前
Redis缓存雪崩、缓存击穿、缓存穿透
数据库·redis·缓存
小酋仍在学习2 小时前
光驱验证 MD5 校验和
数据库·postgresql