前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL经典练习题+解题思路(一)

MySQL经典练习题+解题思路(一)

作者头像
啵啵鱼
发布于 2022-11-23 10:59:50
发布于 2022-11-23 10:59:50
65101
代码可运行
举报
运行总次数:1
代码可运行

个人主页BoBooY的CSDN博客_Java领域博主 前言:在上一期中我们讲解了MySQL的入门知识点,但理论总还是要通过实践来印证,学了再多不练也是白费,这一期我们讲解MySQL的一些经典查询例题帮助大家巩固已学知识点,如在做题过程中有知识点的遗忘,可以参考往期文章: MySQL入门知识点(上):https://blog.csdn.net/qq_58233406/article/details/127143537 MySQL入门知识点(下):https://blog.csdn.net/qq_58233406/article/details/127144532

文章目录

MySQL练习题(一)

导入练习数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE DATABASE `mysqlpractice`
DROP TABLE IF EXISTS EMP;
DROP TABLE IF EXISTS DEPT;
DROP TABLE IF EXISTS SALGRADE;

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;
  • 导入成功后,有如下三张表:

员工表

部门表

工资等级表

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

(1)先按照部门编号分组,取得每个部门的最高薪水。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select 
	e.ename,e.deptno,max(e.sal) '最高薪水'
from
	emp e
group by 
	e.deptno;

(2)再将查询结果当做一张临时表,与emp表进行表连接(因为有的最高薪水是相同的人,需要将他们都显示出来)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select
	e.ename,e.deptno,e.sal
from
	(select ename,deptno,max(sal) as maxsal from emp group by deptno) t
join
	emp e
on 
	t.deptno = e.deptno and e.sal = t.maxsal
order by  
	e.deptno;

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

(1)先找出每个部门的平均薪水

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select 
	deptno,avg(sal)
from
	emp
group by
	deptno;

(2)找出每个部门比各自部门平均薪水高的人

条件:比平均薪水高,部门号相同

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select
	e.ename,e.sal,e.deptno
from
	emp e
join 
	(select deptno,avg(sal) as avgsal from emp group by deptno) t
where
	e.deptno = t.deptno and e.sal > t.avgsal
order by
	e.deptno;

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

(1)先找出每个人的薪资等级

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select 
	e.ename,s.grade,e.deptno
from
	emp e
join
	salgrade s
on 
	e.sal between s.losal and s.hisal;

(2)再按部门分组,求得每个部门的平均薪资水平

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select 
	t.ename,avg(t.grade),t.deptno
from 
	(select 
		e.ename ename,s.grade grade,e.deptno deptno
	 from
		emp e
	 join
		salgrade s
	 on 
		e.sal between s.losal and s.hisal
     ) t
 group by 
 	t.deptno;

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

  • 方式一:使用limit分页

(1)将每个人的薪水进行降序排列,然后使用limit分页取第一个人的薪水

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select 
	e.ename,e.sal
from
	emp e
order by
	e.sal desc
limit 0,1;

(2)将结果当做一个临时表,与emp进行内连接 条件为emp表中的薪水 = 临时表中的薪水

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select 
	e.ename,e.sal
from
	emp e
join 
	(select 
		e.ename as ename,e.sal as sal
	from
		emp e
	order by
		e.sal desc
	limit 0,1
	) t
on
	e.sal = t.sal;
  • 方式二:使用表的自连接

(1)将emp表自连接,找出 emp a表中所有比 emp b表中薪资小的薪水生成一个结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select 
	distinct a.sal
from
	emp a
join 
	emp b
on 
	a.sal < b.sal;

(2)再将emp中薪水不在这个结果中薪水找出来就是最高薪资

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select 
	e.ename,e.sal
from
	emp e
where 
	e.sal not in(select 
					distinct a.sal
				from
					emp a
				join 
					emp b
				on 
					a.sal < b.sal
                  );

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

(1)取得每个部门的平均薪水

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select 
	deptno,avg(sal)
from
	emp
group by
	deptno;

(2)将结果当做一张临时表进行取最高

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select
	t.deptno,max(t.avgsal)
from
	(select 
		deptno,avg(sal) avgsal
	from
		emp
	group by
		deptno
    ) t;

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

(1)按部门分组求得每个组的平均薪水

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select deptno ,avg(sal) from emp group by deptno;

(2)将结果与dept表进行内连接

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select 
	d.dname,t.deptno,max(t.avgsal) 
from 
	(select deptno ,avg(sal) avgsal from emp group by deptno) t
join 
	dept d
on 
	t.deptno = d.deptno;

7、求平均薪水的等级最低的部门的部门名称

(1)按部门分组求得每个组的平均薪水

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select deptno ,avg(sal) from emp group by deptno;

(2)将结果与salgrade表进行内连接 求得每个部门的部门等级,并取最低等级的部门

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select 
	t.deptno,min(s.grade),t.avgsal
from 
	(select deptno ,avg(sal) avgsal from emp group by deptno) t
join 
	salgrade s
on 
	t.avgsal between s.losal and s.hisal;

(3)将结果与部门表进行内连接求得平均薪资水平最低的部门名称

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select
	d.dname,t2.deptno,t2.avgsal,t2.mingrade
from (
	select 
		t.deptno deptno,min(s.grade) mingrade,t.avgsal avgsal
	from 
		(select deptno ,avg(sal) avgsal from emp group by deptno) t
		join 
			salgrade s
		on 
			t.avgsal between s.losal and s.hisal
) t2
join
	dept d
on
	t2.deptno = d.deptno;

8、取得比普通员工(员工代码没有在 mgr 字段上出现的) 的最高薪水还要高的领导人姓名(*)

(1)找出所有是领导身份的员工代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select distinct mgr from emp where mgr is not null;

(2)不在上面结果的员工都是普通员工,取工资最高的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select 
	max(sal) 
from 
	emp 
where empno not in(select distinct mgr from emp where mgr is not null);

(3)找出比这个最高工资大的员工的姓名和编号

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select 
	e.ename,e.empno
from 
	emp e
where(
	e.sal > (select 
				max(sal) 
			from 
				emp 
			where 
             	empno not in(select distinct mgr from emp where mgr is not null))
);

如果本篇文章的内容你都掌握了,那么我们开始练习下篇文章的内容吧:

MySQL经典练习题+解题思路(二):https://blog.csdn.net/qq_58233406/article/details/127162943

MySQL经典练习题+解题思路(三):https://blog.csdn.net/qq_58233406/article/details/127165622

MySQL经典练习题+解题思路(四):https://blog.csdn.net/qq_58233406/article/details/127167682

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
数据库MySQL学习——内含34道MySQL练习题及答案
DML(数据操作语言):insert delete update,对表中数据进行增删改
全栈程序员站长
2022/09/30
3.3K0
MySQL经典练习题+解题思路(二)
有 3 个表 S(学生表),C(课程表),SC(学生选课表) S(SNO,SNAME)代表(学号,姓名) C(CNO,CNAME,CTEACHER)代表(课号,课名,教师) SC(SNO,CNO,SCGRADE)代表(学号,课号,成绩) 问题:
啵啵鱼
2022/11/23
4130
MySQL经典练习题+解题思路(二)
MySQL经典练习题+解题思路(三)
CSDN话题挑战赛第2期 参赛话题:学习笔记 个人主页:BoBooY的CSDN博客_Java领域博主 前言:在上一期中我们讲解了MySQL的入门知识点,但理论总还是要通过实践来印证,学了再多不练也是白费,这一期我们讲解MySQL的一些经典查询例题帮助大家巩固已学知识点,如在做题过程中有知识点的遗忘,可以参考往期文章: MySQL入门知识点(上):https://blog.csdn.net/qq_58233406/article/details/127143537 MySQL入门知识点(下)
啵啵鱼
2022/11/23
4950
MySQL经典练习题+解题思路(三)
MySQL经典练习题+解题思路(四)
CSDN话题挑战赛第2期 参赛话题:学习笔记 个人主页:BoBooY的CSDN博客_Java领域博主 前言:在上一期中我们讲解了MySQL的入门知识点,但理论总还是要通过实践来印证,学了再多不练也是白费,这一期我们讲解MySQL的一些经典查询例题帮助大家巩固已学知识点,如在做题过程中有知识点的遗忘,可以参考往期文章: MySQL入门知识点(上):https://blog.csdn.net/qq_58233406/article/details/127143537 MySQL入门知识点(下):h
啵啵鱼
2022/11/23
3750
MySQL经典练习题+解题思路(四)
MySQL复合查询全解析:从基础到多表关联与高级技巧
这里‘J_’和‘J%’的主要区别在于它们所代表的字符串匹配模式的严格程度和范围。‘J_’更为严格,只匹配特定长度的字符串;而‘J%’则更为灵活,能匹配任意长度的字符串(只要以‘J’开头)。 
用户11316056
2025/05/05
870
MySQL复合查询全解析:从基础到多表关联与高级技巧
MySQL经典33题,DQL语句硬核专项练习!!!
第二步:将第一步的表当作临时表与emp表做连接 连接条件e.deptno=t.deptno and e.sal=t.maxsal
百思不得小赵
2022/12/01
6520
MySQL经典33题,DQL语句硬核专项练习!!!
MySQL 多表查询与复杂查询技巧实战
实际开发中往往数据来自不同的表,所以需要多表查询。本节我们用一个简单的公司管理系统,有三张表EMP,DEPT,SALGRADE来演示如何进行多表查询。
用户11286421
2025/03/24
1880
MySQL 多表查询与复杂查询技巧实战
mysql练习(含答案)
表结构 DROP DATABASE IF EXISTS test1; CREATE DATABASE test1; USE test1; ##部门表 #DROP IF EXISTS TABLE DEPT; CREATE TABLE DEPT( DEPTNO int PRIMARY KEY,##部门编号 DNAME VARCHAR(14) , ##部门名称 LOC VARCHAR(13) ##部门地址 ) ; INSERT INTO DEPT VALUES (10,'ACCOU
Java学习
2018/04/17
2.6K0
mysql练习(含答案)
mysql数据库多表查询练习题[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/143714.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/01
1.4K0
mysql数据库多表查询练习题[通俗易懂]
oracle--多表联合查询sql92版
sql92学习 -查询员工姓名,工作,薪资,部门名称 sql的联合查询(多表查询) --1、sql92标准 ----笛卡尔积:一件事情的完成需要很多步骤,而不同的步骤有很多种方式,完成这件事情的所有方式称之为笛卡尔积 select * from emp--14 select * from dept--7 select * from emp,dept order by ename--7*14=98 等值链接,链接条件。等值链接的时候字段的名
eadela
2019/09/29
6080
Oracle数据库学习笔记 (四 —— select 从入门到放弃 【上】)
基本语法 order by xxxx asc(desc) asc 升序, desc 降序
Gorit
2021/12/09
1.1K0
Oracle 查询练习
1.已知Oracle的Scott用户中提供了三个测试数据库表,名称分别为dept,emp和salgrade。使用SQL语言完成以下操作
Arebirth
2019/09/24
1.4K0
hql和sql练习题
select t.ename,t.empno,t.deptno from emp t where t.job = ‘CLERK’
张哥编程
2024/12/17
980
Oracle学习(五):多表查询
1.知识点:可以对照下面的录屏进行阅读 SQL> --等值连接 SQL> --查询员工信息: 员工号 姓名 月薪 部门名称 SQL> select empno,ename,sal,dname 2 from emp,dept 3 where emp.deptno=dept.deptno; SQL> --不等值连接 SQL> --查询员工信息: 姓名 月薪 工资级别 SQL> select ename,sal,grade 2 from emp e,salgrade s 3 wh
Java架构师必看
2021/05/17
4290
【说站】mysql内连接是什么
1、内部连接类似于自然连接,但内部连接不要求比较两个表的同名属性列,可以用on或using指定两个表比较的字段。
很酷的站长
2022/11/23
6530
【说站】mysql内连接是什么
Oracle应用实战七——多表查询+PL/SQL
1 多表查询 内连接 使用一张以上的表做查询就是多表查询 语法: SELECT {DISTINCT} *|列名.. FROM 表名 别名,表名1 别名 {WHERE 限制条件 ORDER BY 排序
Java帮帮
2018/03/19
3K0
Oracle应用实战七——多表查询+PL/SQL
Oracle多表查询、子查询实战练习
SELECT ENAME,HIREDATE FROM EMP WHERE DEPTNO=(SELECT DEPTNO FROM EMP WHERE ENAME='SCOTT');
星哥玩云
2022/08/17
1.5K0
Oracle多表查询、子查询实战练习
Oracle学习笔记二
格式: select * from 表1,表2   select * from emp;   select * from dept;
Kevin_Zhang
2018/08/20
7180
Oracle学习笔记二
mysql 外连接
select e.ename,ee.ename from emp e join emp ee on e.mgr=ee.empno; 
用户7630333
2023/12/07
2190
mysql 外连接
长文一次说完MySQL常用语句和命令等汇总
在表的连接查询方面有一种现象被称为:笛卡尔积现象。 笛卡尔积现象:当两张表进行连接查询的时候,没有任何条件进行限制,最终的查询结果条数是两张表记录条数的乘积。 怎么避免笛卡尔积现象?当然是加条件进行过滤。 思考:避免了笛卡尔积现象,会减少记录的匹配次数吗? 不会。只不过显示的是有效记录。
共饮一杯无
2022/11/24
7970
长文一次说完MySQL常用语句和命令等汇总
相关推荐
数据库MySQL学习——内含34道MySQL练习题及答案
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验