MySQL总结练习题

news2024/10/5 14:20:25

目录

1.准备数据表

2.表之间的关系

3.题目

3.1 取得每个部门最高薪水的人员名称

3.2 哪些人的薪水在部门的平均薪水之上

3.3 取得部门中(所有人的)平均的薪水等级

3.4 不准用组函数(Max ),取得最高薪水

3.5 取得平均薪水最高的部门的部门编号

3.5 取得平均薪水最高的部门的部门名称

3.6 取得薪水最高的第六至第十名员工

3.7 取得每个薪水等级有多少员工

3.8 列出所有员工及领导的名字

3.9 列出至少有5个员工的所有部门

3.10 列出薪金比"SMITH" 多的所有员工信息

3.11 列出所有"CLERK"( 办事员) 的姓名及其部门名称, 部门的人数

3.12 列出最低薪金大于 1500 的各种工作及从事此工作的全部雇员人数按照工作岗位分组求最小值。


对之前学习的mysql基础和进阶进行一些练习,巩固前面学完的知识。

1.准备数据表


CREATE TABLE DEPT
       (DEPTNO int(2) not null ,
    DNAME VARCHAR(14) ,
    LOC VARCHAR(13),
    primary key (DEPTNO)
    );
CREATE TABLE EMP
       (EMPNO int(4)  not null ,
    ENAME VARCHAR(10),
    JOB VARCHAR(9),
    MGR INT(4),
    HIREDATE DATE  DEFAULT NULL,
    SAL DOUBLE(7,2),
    COMM DOUBLE(7,2),
    primary key (EMPNO),
    DEPTNO INT(2)
    )
    ;

CREATE TABLE SALGRADE
      ( GRADE INT,
    LOSAL INT,
    HISAL INT );




INSERT INTO DEPT ( DEPTNO, DNAME, LOC ) VALUES (
10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO DEPT ( DEPTNO, DNAME, LOC ) VALUES (
20, 'RESEARCH', 'DALLAS');
INSERT INTO DEPT ( DEPTNO, DNAME, LOC ) VALUES (
30, 'SALES', 'CHICAGO');
INSERT INTO DEPT ( DEPTNO, DNAME, LOC ) VALUES (
40, 'OPERATIONS', 'BOSTON');
commit;

INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES (
7369, 'SMITH', 'CLERK', 7902,  '1980-12-17'
, 800, NULL, 20);
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES (
7499, 'ALLEN', 'SALESMAN', 7698,  '1981-02-20'
, 1600, 300, 30);
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES (
7521, 'WARD', 'SALESMAN', 7698,  '1981-02-22'
, 1250, 500, 30);
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES (
7566, 'JONES', 'MANAGER', 7839,  '1981-04-02'
, 2975, NULL, 20);
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES (
7654, 'MARTIN', 'SALESMAN', 7698,  '1981-09-28'
, 1250, 1400, 30);
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES (
7698, 'BLAKE', 'MANAGER', 7839,  '1981-05-01'
, 2850, NULL, 30);
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES (
7782, 'CLARK', 'MANAGER', 7839,  '1981-06-09'
, 2450, NULL, 10);
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES (
7788, 'SCOTT', 'ANALYST', 7566,  '1987-04-19'
, 3000, NULL, 20);
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES (
7839, 'KING', 'PRESIDENT', NULL,  '1981-11-17'
, 5000, NULL, 10);
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES (
7844, 'TURNER', 'SALESMAN', 7698,  '1981-09-08'
, 1500, 0, 30);
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES (
7876, 'ADAMS', 'CLERK', 7788,  '1987-05-23'
, 1100, NULL, 20);
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES (
7900, 'JAMES', 'CLERK', 7698,  '1981-12-03'
, 950, NULL, 30);
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES (
7902, 'FORD', 'ANALYST', 7566,  '1981-12-03'
, 3000, NULL, 20);
INSERT INTO EMP ( EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM,
DEPTNO ) VALUES (
7934, 'MILLER', 'CLERK', 7782,  '1982-01-23'
, 1300, NULL, 10);
commit;

INSERT INTO SALGRADE ( GRADE, LOSAL, HISAL ) VALUES (
1, 700, 1200);
INSERT INTO SALGRADE ( GRADE, LOSAL, HISAL ) VALUES (
2, 1201, 1400);
INSERT INTO SALGRADE ( GRADE, LOSAL, HISAL ) VALUES (
3, 1401, 2000);
INSERT INTO SALGRADE ( GRADE, LOSAL, HISAL ) VALUES (
4, 2001, 3000);
INSERT INTO SALGRADE ( GRADE, LOSAL, HISAL ) VALUES (
5, 3001, 9999);
commit;

之间运行上面的sql,需要用到的数据表就建立好了。

2.表之间的关系

  1. DEPT(部门表):

    • DEPTNO:部门编号,整数类型,主键。
    • DNAME:部门名称。
    • LOC:部门所在地。
  2. EMP(员工表):

    • EMPNO:员工编号,整数类型,主键。
    • ENAME:员工姓名。
    • JOB:员工职位。
    • MGR:上级经理的员工编号,整数类型。
    • HIREDATE:入职日期,日期类型,默认为NULL。
    • SAL:薪资。
    • COMM:奖金。
    • DEPTNO:所属部门编号,整数类型。
  3. SALGRADE(薪资等级表):

    • GRADE:薪资等级,整数类型。
    • LOSAL:最低薪资,整数类型。
    • HISAL:最高薪资,整数类型。

3.题目

3.1 取得每个部门最高薪水的人员名称

思路:

  1. 使用INNER JOIN将EMP表和DEPT表连接,以获取员工和其所在部门的相关信息。

  2. 使用子查询,计算每个部门的最高薪水。子查询中使用GROUP BY和MAX函数来找到每个部门的最高薪水。

  3. 在主查询中,通过比较员工的薪水和其所在部门的最高薪水,筛选出薪水等于最高薪水的员工。

  4. 结果集中包括了每个部门中薪水最高的员工的姓名、部门名称和薪水。

select d.dname as "部门名称", e.ename as "员工姓名", e.sal as "薪水"
from emp e
inner join dept d on e.deptno = d.deptno
where (e.deptno, e.sal) in (
    select deptno, max(sal)
    from emp
    group by deptno
);

结果:

3.2 哪些人的薪水在部门的平均薪水之上

思路:

  1. 主查询中使用INNER JOIN连接EMP表(e)和DEPT表(d),以获取员工和其所在部门的相关信息。

  2. 使用INNER JOIN连接一个子查询,该子查询计算每个部门的平均薪水。子查询中使用GROUP BY和AVG函数来计算每个部门的平均薪水。

  3. 在主查询中,通过比较员工的薪水(e.sal)和其所在部门的平均薪水(dept_avg.avg_dept_salary),筛选出薪水高于所在部门平均薪水的员工。

  4. 结果集包括了员工姓名、员工薪水、部门名称和部门平均薪水,以便比较员工薪水与部门平均薪水。

SELECT e.ename AS "员工姓名", e.sal AS "员工薪水", d.dname AS "部门名称", avg_dept_salary AS "部门平均薪水"
FROM emp e
INNER JOIN dept d ON e.deptno = d.deptno
INNER JOIN (
    SELECT deptno, AVG(sal) AS avg_dept_salary
    FROM emp
    GROUP BY deptno
) dept_avg ON e.deptno = dept_avg.deptno
WHERE e.sal > dept_avg.avg_dept_salary;

结果:

3.3 取得部门中(所有人的)平均的薪水等级

1.首先要取得所有人的薪水等级再按部门编号分组

2.按照部门编号分组后再取平均值

select e.DEPTNO as '部门编号',avg(s.GRADE) as '部门平均薪资等级'
    from emp e
    inner join salgrade s
    on e.SAL between s.LOSAL and s.HISAL group by  e.DEPTNO;

3.4 不准用组函数(Max ),取得最高薪水

第一种方法:使用降序取第一个数据

select ENAME,SAL from emp order by SAL desc limit 1;

第二种方法:使用自连接再进行not in 去查找

select SAL from emp where sal 
not in (select distinct a.SAL from emp a join emp b on a.SAL < b.SAL)

3.5 取得平均薪水最高的部门的部门编号

用avg取平均值,按照deptno分组,最后降序排序取第一个值

select DEPTNO as '部门编号',avg(SAL) as '平均薪水' from emp 
group by DEPTNO order by avg(SAL) desc limit 1;

 

3.5 取得平均薪水最高的部门的部门名称

按照dname来分组最后采用降序排序

select d.DNAME,avg(e.SAL) as avgsal from emp e
join dept d
on e.DEPTNO = d.DEPTNO
group by d.DNAME
order by avgsal desc limit 1;

3.6 取得薪水最高的第六至第十名员工

降序排序取6-10

select ENAME,SAL from emp order by sal desc limit 5,5;

3.7 取得每个薪水等级有多少员工

按照grand进行分组再求和

select s.GRADE,COUNT(*) from emp e 
inner join salgrade s 
on e.SAL between s.LOSAL and s.HISAL 
group by s.GRADE;

3.8 列出所有员工及领导的名字

select a.ENAME '员工' ,b.ENAME '领导' from emp a 
left join emp b on a.mgr = b.EMPNO;

3.9 列出至少有5个员工的所有部门

  1. 使用INNER JOIN将EMP表(e)和DEPT表(d)连接,以获取员工和其所在部门的相关信息。

  2. 使用GROUP BY子句按部门名称(d.dname)进行分组,以计算每个部门中的员工数量。

  3. 使用HAVING子句筛选出员工数量至少为5的部门。

select d.DNAME as '部门名称',count(*) as '员工数量'  
from emp e inner join dept d on e.DEPTNO = d.DEPTNO 
group by d.DNAME having count(*) >= 5;

3.10 列出薪金比"SMITH" 多的所有员工信息

直接筛选出来然后比较就行

select ENAME,SAL from emp 
where SAL > (select SAL from emp where ename = 'SMITH') order by SAL desc ;

3.11 列出所有"CLERK"( 办事员) 的姓名及其部门名称, 部门的人数

1.从EMP表中选择职位为"CLERK"的员工的姓名(ename)、所在部门编号(deptno)。

2.使用INNER JOIN将上述查询结果与DEPT表连接,以获取员工所在部门的名称(dname)。

3.使用子查询计算每个部门的员工人数,并使用GROUP BY子句按部门编号进行分组。

4.最后,将上述查询的结果用作子查询,并再次使用INNER JOIN将部门人数(deptcount)与部门名称(dname)连接,以获取最终结果。

SELECT t1.ename AS "员工姓名", t1.dname AS "部门名称", t2.deptcount AS "部门人数"
FROM (
    SELECT e.ename, d.dname, e.deptno
    FROM emp e
    JOIN dept d ON e.deptno = d.deptno
    WHERE e.job = 'CLERK'
) t1
JOIN (
    SELECT deptno, COUNT(*) AS deptcount
    FROM emp
    GROUP BY deptno
) t2 ON t1.deptno = t2.deptno;

3.12 列出最低薪金大于 1500 的各种工作及从事此工作的全部雇员人数按照工作岗位分组求最小值。

select job,sal, count(*) as '从事该工作工资低于1500的人数' from emp  
group by job having min(SAL) > 1500;

 后续会继续增加些题目。。。。。。

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

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

相关文章

Java基础之反射机制

背景&#xff1a;Java程序中的所有对一项都有两种类型&#xff1a;编译时类型和运行时类型&#xff08;由于多态导致的&#xff09;&#xff0c;这可能会导致对象的编译时类型和运行时类型不一致。 反射&#xff08;Reflection&#xff09;是被是为动态语言的关键&#xff0c;反…

速通Redis基础(二):掌握Redis的哈希类型和命令

目录 Redis 哈希类型简介 Redis 哈希命令 HSET HGET HEXISTS HDEL HKEYS HVALS HGETALL HMGET HLEN HSETNX ​编辑 HINCRBY HINCRBYFLOAT Redis的哈希类型命令小结 Redis 是一种高性能的键值存储数据库&#xff0c;支持多种数据类型&#xff0c;其中之…

jdbc+数据连接池

1.1 JDBC概念 JDBC 就是使用Java连接并操作数据库的一套API 全称&#xff1a;( Java DataBase Connectivity ) Java 数据库连接 1.2 JDBC优势 可随时替换底层数据库&#xff0c;访问数据库的Java代码基本不变 以后编写操作数据库的代码只需要面向JDBC&#xff08;接口&…

如何在Windows系统搭建VisualSVN服务并在公网远程访问【内网穿透】

文章目录 前言1. VisualSVN安装与配置2. VisualSVN Server管理界面配置3. 安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4. 固定公网地址访问 前言 SVN 是 subversion 的缩写&#xff0c;是一个开放源代码的版本控制系统…

尚品甄选2023全新SpringBoot+SpringCloud企业级微服务项目

最适合新手入门的SpringBootSpringCloud企业级微服务项目来啦&#xff01;如果你已经学习了Java基础、SSM框架、SpringBoot、SpringCloud&#xff0c;想找一个项目来实战练习&#xff1b;或者你刚刚入行&#xff0c;需要可以写到简历中的微服务架构项目&#xff01; 项目采用前…

大运新能源天津车展深度诠释品牌魅力 为都市人群打造理想车型

如今&#xff0c;新能源汽车行业发展潜力巨大&#xff0c;不断吸引无数车企入驻新能源汽车赛道&#xff0c;而赛道的持续紧缩也让一部分车企很难找到突破重围的机会。秉持几十年的造车经验&#xff0c;大运新能源凭借雄厚的品牌实力从一众车企中脱颖而出。从摩托车到重卡&#…

在两个有序数组中找整体第k小的数

一、题目 给定两个已经排序的数组&#xff08;假设按照升序排列&#xff09;&#xff0c;然后找出第K小的数。比如数组A {1&#xff0c; 8&#xff0c; 10&#xff0c; 20}&#xff0c; B {5&#xff0c; 9&#xff0c; 22&#xff0c; 110}&#xff0c; 第 3 小的数是 8.。…

基于 Mtcnn(人脸检测)+Hopenet(姿态检测)+拉普拉斯算子(模糊度检测) 的人脸检测服务

写在前面 工作原因&#xff0c;顺便整理博文内容为一个 人脸检测服务分享以打包 Docker 镜像&#xff0c;可以直接使用服务目前支持 http 方式该检测器主要适用低质量人脸图片处理理解不足小伙伴帮忙指正&#xff0c;多交流&#xff0c;相互学习 对每个人而言&#xff0c;真正的…

11.动名词

一.什么是动名词 动名词是动词的另一种非谓语动词形式。动名词跟宾语或状语构成动名词短语&#xff0c;动名词跟动词不定式一样&#xff0c;都属于非谓语动词&#xff0c;不能作谓语&#xff0c;动名词或动名词短语可以作主语&#xff0c;表语&#xff0c;宾语&#xff0c;介词…

fastjson2与fury的巅峰对决,谁会笑到最后?

写在前面 两个月前&#xff0c;我们写过一篇关于fury和protostuff的性能对比的文章&#xff1a;谁才是真正的协议之王&#xff1f;fastjson2 vs fury&#xff0c;那时&#xff0c;两个协议框架各有千秋&#xff0c;不分伯仲&#xff0c;今天&#xff0c;看到fury推出了全新的0…

我用Python写了几个摸鱼小游戏,赐你2023年度上班上学摸鱼必备良品!(附源码)

文章目录 前言一丶超级玛丽二、沙漠打地鼠三、贪吃蛇四、坦克大战五、五子棋 前言 获取python整套完整教程&#xff0c;3263学习笔记&#xff0c;源码&#xff0c;项目实战&#xff0c;全部在手&#xff0c;python不愁~~~ Python学习资料点击领取福利 例如&#xff1a; 超级…

js高级(2)函数的柯里化,cookie的使用,10天免登录案例,购物车案例,拖动盒子小案例等等

1.函数的柯里化 自定义函数的柯里化 // 自定义函数的柯里化function curry(fn) {//判断输入的函数有几个参数let len fn.length;// 返回一个函数,并且有函数名为treturn function t() {// 获取到实参的个数let innerLength arguments.length// 获取到真实参数,转化为数组[.…

FPGA---UDP通信求助

项目场景&#xff1a; 使用UDP进行回环&#xff0c;网络调试助手&#xff0c;发送数据通过UDP接收模块接收&#xff0c;解析出数据&#xff0c;给到UDP发送模块&#xff0c;传回上位机。 问题描述 UDP接收模块中&#xff0c;接收到的CRC校验值与自己计算CRC校验值进行判断&am…

【电商API接口的应用:电商数据分析入门】初识Web API(一)

如何使用Web应用变成接口(API)自动请求网站到特定信息而不是整个网站&#xff0c;再对这些信息进行可视化。由于这样编写到程序始终使用最新到数据来生成可视化&#xff0c;因此即便数据瞬息万变&#xff0c;它呈现到信息也都是最新的。 使用Web API Web API是网站的一部分&am…

javapoet 注释中添加枚举值

问题描述 使用javapoet生成源代码 为了实现这么一个目的 解决 翻了一下源代码&#xff0c;他的实现如下&#xff1a; 这个方法是私有的&#xff0c;暂时不确定如何调用 照着这个方法&#xff0c;即可实现大多数类型的基本调用 即可实现上图需要的效果

为Yolov7环境安装Cuba匹配的Pytorch

1. 查看Cuba版本 方法一 nvidia-smi 找到CUDA Version 方法二 Nvidia Control Panel > 系统信息 > 组件 > 2. 安装Cuba匹配版本的PyTorch https://pytorch.org/get-started/locally/这里使用conda安装 conda install pytorch torchvision torchaudio pytorch-cu…

[华为认证]路由表和FIB表

路由器转发数据包的关键是路由表和FIB表&#xff0c;每个路由器都至少保存着一张路由表和一张FIB&#xff08;Forwarding Information Base&#xff09;表。路由器通过路由表选择路由&#xff0c;通过FIB表指导报文进行转发。 路由表 每台路由器中都保存着一张本地核心路由表&…

Java学数据结构(4)——PriorityQueue(优先队列) 二叉堆(binary heap)

前言 数据结构与算法作为计算机科学的基础&#xff0c;是一个重点和难点&#xff0c;在实际编程中似乎看不它们的身影&#xff0c;但是它们有随处不在&#xff0c;如影随形。 本系列博客是《数据结构与算法分析—Java语言描述》的读书笔记&#xff0c;合集文章列表如下&#…

delphi socket cross开源跨平台通讯库

delphi socket cross是Pascal开源跨平台的tcp通讯组件 windows下用的iocp linux下用的epoll 支持http&#xff0c;https 开源地址&#xff1a;GitHub - winddriver/Delphi-Cross-Socket: Delphi cross platform socket library 下图来自网络&#xff1a;

陪诊系统|陪诊系统解放繁琐,为陪诊添便利

在当代快节奏的生活中&#xff0c;随着医疗服务的不断发展&#xff0c;陪诊成为了越来越多人的需求。然而&#xff0c;传统的陪诊方式却存在着时间成本高、沟通不畅、服务体验差等问题。但近年来&#xff0c;陪诊小程序的兴起却为这一难题提供了创新的解决方案。 陪诊小程序&a…