MySql的Sql语句的练习(试试你能写出来几道呢)

MySql 的练习题

提前准备好数据库表

-- EMP(雇员表)
CREATE TABLE emp(
EMPNO INT, -- 雇员编号
ENAME VARCHAR(50), -- 表示雇员姓名
JOB VARCHAR(50), -- 表示工作职位
MGR INT, -- 表示一个雇员的领导编号
HIREDATE DATE, -- 表示雇佣日期
SAL DECIMAL(8,2), -- 表示月薪,工资
COMM DECIMAL(8,2), -- 表示奖金或佣金
DEPTNO INT -- 表示部门编号
);

-- DEPT(部门表)
CREATE TABLE dept(
DEPTNO INT,-- 部门编号
DNAME VARCHAR(50),-- 部门名称
LOC VARCHAR(50)-- 部门位置
);

-- BONUS(奖金表)
CREATE TABLE bonus(
ENAME VARCHAR(50),-- 雇员姓名
JOB VARCHAR(50),-- 雇员工作
SAL DECIMAL(8,2),-- 雇员工资
COMM DECIMAL(8,2)-- 雇员奖金
);

-- SALGRADE(工资等级表)
CREATE TABLE salgrade(
GRADE INT,-- 等级编号
LOSAL DECIMAL(8,2),-- 此等级的最低工资
HISAL DECIMAL(8,2)-- 此等级的最高工资
);

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

INSERT INTO dept VALUES (10,'ACCOUNTING','NEW YORK');
INSERT INTO dept VALUES (20,'RESEARCH','DALLAS');
INSERT INTO dept VALUES (30,'SALES','CHICAGO');
INSERT INTO dept VALUES (40,'OPERATIONS','BOSTON');

INSERT INTO salgrade VALUES (1,700,1200);
INSERT INTO salgrade VALUES (2,1201,1400);
INSERT INTO salgrade VALUES (3,1401,2000);
INSERT INTO salgrade VALUES (4,2001,3000);
INSERT INTO salgrade VALUES (5,3001,9999);

使用 * 的缺点有
a) 查询出了不必要的列
b) 效率上不如直接指定列名
由于这是练习,为了方便,这里就使用 * ,

习题

-- 1查询员工表所有数据, 并说明使用*的缺点
-- 2查询职位(JOB)为’PRESIDENT’的员工的工资
-- 3查询佣金(COMM)为0 或为NULL 的员工信息
-- 4查询入职日期在1981-5-1 到1981-12-31 之间的所有员工信息
-- 5查询所有名字长度为4 的员工的员工编号,姓名
-- 6显示10号部门的所有经理(‘MANAGER’)和20 号部门的所有职员(‘CLERK’)的详细信息
-- 7显示姓名中没有’L’字的员工的详细信息或含有’SM’字的员工信息
-- 8显示各个部门经理(‘MANAGER’)的工资
-- 9显示佣金(COMM)收入比工资(SAL)高的员工的详细信息
-- 10把hiredate 列看做是员工的生日,求本月过生日的员工(考察知识点:单行函数)
-- 11把hiredate 列看做是员工的生日,求下月过生日的员工(考察知识点:单行函数)
-- 12求1982 年入职的员工(考察知识点:单行函数)
-- 13 求1981 年下半年入职的员工(考察知识点:单行函数)
-- 14求1981 年各个月入职的的员工个数(考察知识点:组函数)
-- 15查询各个部门的平均工资
-- 16显示各种职位的最低工资
-- 17按照入职日期由新到旧排列员工信息
-- 18查询员工的基本信息,附加其上级的姓名
-- 19显示工资比’ALLEN’高的所有员工的姓名和工资
-- 20显示与’SCOTT’从事相同工作的员工的详细信息
-- 21显示销售部(‘SALES’)员工的姓名
-- 22显示与30号部门’MARTIN’员工工资相同的员工的姓名和工资
-- 23查询所有工资低于平均工资(平均工资包括所有员工)的销售人员(‘SALESMAN’)
-- 24显示所有职员的姓名及其所在部门的名称和工资
-- 25查询在研发部(‘RESEARCH’)工作员工的编号,姓名,工作部门,工作所在地
-- 26查询各个部门的名称和员工人数
-- 27查询各个职位员工工资大于平均工资(平均工资包括所有员工)的人数和员工职位
-- 28查询工资相同的员工的工资和姓名
-- 29查询工资最高的3名员工信息
-- 30按工资进行排名,排名从1 开始,工资相同排名相同(如果两人并列第1 则没有第2 名,从第三名继续排)
-- 31求入职日期相同的(年月日相同)的员工
-- 32查询每个部门的最高工资
-- 33查询每个部门,每种职位的最高工资
-- 34查询每个员工的信息及工资级别(用到表Salgrade)
-- 35查询工资最高的第6-10 名员工
-- 36查询各部门工资最高的员工信息
-- 37查询每个部门工资最高的前2名员工
-- 38查询出有3 个以上下属的员工信息
-- 39查询所有大于本部门平均工资的员工信息
-- 40查询平均工资最高的部门信息
-- 41查询大于各部门总工资的平均值的部门信息
-- 42查询大于各部门总工资的平均值的部门下的员工信息(考察知识点:子查询,组函数,连接查询)
-- 43查询没有员工的部门信息

1. 查询员工表所有数据, 并说明使用*的缺点

select * from emp;

查询结果:

在这里插入图片描述

2. 查询职位(JOB)为’PRESIDENT’的员工的工资

select ename,sal from emp where job='PRESIDENT';

查询结果:

在这里插入图片描述

3. 查询佣金(COMM)为0 或为NULL 的员工信息

select * from emp where comm = 0 or comm is null;

查询结果:

在这里插入图片描述

4. 查询入职日期在1981-5-1 到1981-12-31 之间的所有员工信息

select * from emp where month(hiredate) >= 5 and year(hiredate) = 1981;
select * from emp where hiredate between "1981-05-01" and "1981-12-31";

查询结果:

在这里插入图片描述

5. 查询所有名字长度为4 的员工的员工编号,姓名

select empno,ename from emp where length(ename) = 4;

查询结果:

在这里插入图片描述

6. 显示10号部门的所有经理(‘MANAGER’)和20 号部门的所有职员(‘CLERK’)的详细信息

select * from emp where deptno = 10 and job = 'MANAGER' or deptno = 20 and job = 'CLERK';

查询结果:

在这里插入图片描述

7. 显示姓名中没有’L’字的员工的详细信息或含有’SM’字的员工信息

select * from emp where ename like '%SM%' or ename not like '%L%';

查询结果:

在这里插入图片描述

8. 显示各个部门经理(‘MANAGER’)的工资

select * from emp where job = 'MANAGER' group by deptno;

查询结果:

在这里插入图片描述

9. 显示佣金(COMM)收入比工资(SAL)高的员工的详细信息

select * from emp where comm > sal;

查询结果:

在这里插入图片描述

10. 把hiredate 列看做是员工的生日,求本月过生日的员工

select * from emp where month(hiredate) = month(now());
select * from emp where month(hiredate) = month(CURDATE());
select * from emp where substring(hiredate,6,2) = substring(now(),6,2);
SELECT * FROM emp WHERE EXTRACT(MONTH FROM hiredate)=EXTRACT(MONTH FROM SYSDATE())

查询结果:

在这里插入图片描述

11. 把hiredate 列看做是员工的生日,求下月过生日的员工

select * from emp where month(hiredate) = month(now()) + 1;
select * from emp where month(hiredate) = month(CURDATE()) + 1;
select * from emp where substring(hiredate,6,2) = substring(now(),6,2) + 1;
SELECT * FROM emp WHERE  EXTRACT(MONTH FROM hiredate) =EXTRACT(MONTH FROM NOW())+1;

查询结果:

在这里插入图片描述

12. 求1982 年入职的员工

select * from emp where year(hiredate) = 1982;
select * from emp where substring(hiredate,1,4) = 1982;
SELECT * FROM emp WHERE EXTRACT(YEAR FROM hiredate)=1982;

查询结果:

在这里插入图片描述

13. 求1981 年下半年入职的员工

select * from emp where year(hiredate) = 1981 and month(hiredate) > 6;
select * from emp where substring(hiredate,1,4) = 1981 and substring(hiredate,6,2) > 6;
select * from emp where year(hiredate) = 1981 and month(hiredate) between 7 and 12;
SELECT * FROM emp WHERE hiredate BETWEEN STR_TO_DATE('1981-6-1','%Y-%m-%d') AND STR_TO_DATE('1981-12-31','%Y-%m-%d')

查询结果:

在这里插入图片描述

14. 求1981 年各个月入职的的员工个数

select month(hiredate) 月份,count(*) 人数 from emp where year(hiredate) = 1981 group by month(hiredate)

查询结果:

在这里插入图片描述

15. 查询各个部门的平均工资

select deptno,avg(sal) 平均工资 from emp group by deptno

查询结果:

在这里插入图片描述

16. 显示各种职位的最低工资

select job,min(sal) 最低工资 from emp group by job;

查询结果:

在这里插入图片描述

17. 按照入职日期由新到旧排列员工信息

select * from emp order by hiredate desc;

查询结果:

在这里插入图片描述

18. 查询员工的基本信息,附加其上级的姓名

-- 有缺陷,因为内连接查询会发现查不到一些没有上级的人
-- select e1.*,e2.ename 上级姓名 from emp e1,emp e2 where e1.mgr = e2.empno;
-- 使用内连接查询
select e1.*,e2.ename 上级姓名 from emp e1 left join emp e2 on e1.mgr = e2.empno;

查询结果:

在这里插入图片描述

19. 显示工资比’ALLEN’高的所有员工的姓名和工资

select ename,sal from emp where sal > (select sal from emp where ename = 'ALLEN');
-- 内连接查询
select e1.ename,e1.sal from emp e1,emp e2 where  e2.ename = 'ALLEN' and e1.sal > e2.sal;
select e1.ename,e1.sal from emp e1 where EXISTS (select e2.empno from emp e2 where e1.sal > e2.sal and e2.ename = 'ALLEN')

查询结果:

在这里插入图片描述

20. 显示与’SCOTT’从事相同工作的员工的详细信息

select * from emp e where e.job = (select t.job from emp t where t.ename = 'SCOTT' and t.empno != e.empno);

select e.* from emp e,emp t where e.job = t.job and t.ename = 'SCOTT' and e.empno != t.empno;

select * from emp e where e.ename != 'SCOTT' and exists(select t.empno from emp t where t.ename = 'SCOTT' and t.job = e.job);

查询结果:

在这里插入图片描述

21. 显示销售部(‘SALES’)员工的姓名

select ename,deptno from emp where deptno = (select deptno from dept where dname = 'SALES');
select e.ename,e.deptno from emp e,dept d where d.dname = 'SALES' and e.deptno = d.deptno; 

查询结果:

在这里插入图片描述

22. 显示与’MARTIN’员工工资相同的员工的姓名和工资

select e.ename,e.sal from emp e where e.sal = (select t.sal from emp t where t.ename = 'MARTIN' and e.empno != t.empno);
select e.ename,e.sal from emp e,emp t where e.empno != t.empno and e.sal = t.sal and t.ename = 'MARTIN';

查询结果:

在这里插入图片描述

23. 查询所有工资低于平均工资(平均工资包括所有员工)的销售人员(‘SALESMAN’)

select * from emp where sal < (select avg(sal) from emp) and job = 'SALESMAN';

查询结果:

在这里插入图片描述

24. 显示所有职员的姓名及其所在部门的名称和工资

-- 内连接查询有问题
-- select e.ename,d.dname,e.sal from emp e,dept d where e.deptno = d.deptno;
-- 使用外连接
select e.ename,d.dname,e.sal from emp e left join dept d on e.deptno = d.deptno;

查询结果:

在这里插入图片描述

25. 查询在研发部(‘RESEARCH’)工作员工的编号,姓名,工作部门,工作所在地

select e.ename,e.deptno,d.dname,d.loc from emp e,dept d where d.deptno = e.deptno and d.dname = 'RESEARCH';
SELECT e.*,d.* FROM emp e LEFT JOIN dept d ON (e.`DEPTNO`=d.`DEPTNO`) WHERE d.`DNAME`='RESEARCH';

查询结果:

在这里插入图片描述

26. 查询各个部门的名称和员工人数

-- 使用内连接有问题
-- select d.dname,count(e.empno) from emp e,dept d where e.deptno = d.deptno group by d.deptno;
-- 使用右连接
select d.dname,count(e.deptno) from emp e right join dept d on e.deptno = d.deptno group by d.deptno;

查询结果:

在这里插入图片描述

27. 查询各个职位员工工资大于平均工资(平均工资包括所有员工)的人数和员工职位

select count(empno) 人数,e.job from emp e where sal > (select avg(sal) from emp) group by e.job;

查询结果:

在这里插入图片描述

28. 查询工资相同的员工的工资和姓名

select e.ename,e.sal from emp e,emp d where e.empno != d.empno and e.sal = d.sal;
SELECT e1.* FROM emp e1 WHERE EXISTS (SELECT e2.`EMPNO` FROM emp e2 WHERE e1.`SAL`=e2.`SAL` AND e1.`EMPNO`!= e2.`EMPNO`);
SELECT sal,ename FROM emp WHERE sal IN (SELECT sal FROM emp GROUP BY sal HAVING COUNT(*)>=2 );

查询结果:

在这里插入图片描述

29. 查询工资最高的3名员工信息

select * from emp order by sal desc limit 0,3;
select e.* from emp e where (select count(*) from emp d where d.sal > e.sal) < 3 order by sal desc

查询结果:
在这里插入图片描述

30. 按工资进行排名,排名从1 开始,工资相同排名相同(如果两人并列第1 则没有第2 名,从第三名继续排)

select e.*,(select count(*) from emp d where d.sal > e.sal) + 1 排名 from emp e order by sal desc;

查询结果:

在这里插入图片描述

31. 求入职日期相同的(年月日相同)的员工

SELECT e.* FROM emp e,emp d where e.hiredate = d.hiredate and e.empno != d.empno;
select e.* from emp e where e.hiredate in (select d.hiredate from emp d where e.empno != d.empno)
SELECT * FROM emp WHERE HIREDATE IN (SELECT HIREDATE FROM emp GROUP BY HIREDATE HAVING COUNT(*)>=2 );

查询结果:

在这里插入图片描述

32. 查询每个部门的最高工资

select d.dname,max(sal) 最高工资 from emp e right join dept d on e.deptno = d.deptno  group by d.deptno;

查询结果:

在这里插入图片描述

33. 查询每个部门,每种职位的最高工资

select e.job,e.deptno,max(e.sal) 最高工资 from emp e group by e.job,e.deptno order by e.deptno desc;

查询结果:

在这里插入图片描述

34. 查询每个员工的信息及工资级别(用到表Salgrade)

select e.*,s.grade from emp e,salgrade s where sal between s.losal and s.hisal
SELECT e.*,s.`GRADE` FROM emp e LEFT JOIN salgrade s ON e.`SAL` BETWEEN s.`LOSAL` AND s.`HISAL`

查询结果:

在这里插入图片描述

35. 查询工资最高的第6-10 名员工

select * from emp order by sal desc limit 5,5;

查询结果:

在这里插入图片描述

36. 查询各部门工资最高的员工信息

SELECT *FROM emp m WHERE m.sal IN(SELECT MAX(e.`SAL`) FROM emp e WHERE m.`DEPTNO`=e.`DEPTNO` GROUP BY e.`DEPTNO`);

SELECT e.ename,e.sal,e.deptno FROM emp e ,(SELECT MAX(sal) AS sa FROM emp GROUP BY deptno) t WHERE e.sal =t.sa ;

查询结果:

在这里插入图片描述

37. 查询每个部门工资最高的前2名员工

select e.* from emp e where (select count(*) from emp d where e.sal < d.sal and e.deptno = d.deptno) < 2;

查询结果:

在这里插入图片描述

38. 查询出有3 个以上下属的员工信息

select e.* from emp e,(select d.mgr,count(mgr) num from emp d  group by d.mgr) t where t.num >= 3 and t.mgr = e.empno;
SELECT *FROM emp WHERE EMPNO IN (SELECT e.`MGR` FROM emp e GROUP BY e.`MGR` HAVING COUNT(e.`MGR`)>=3);

查询结果:

在这里插入图片描述

39. 查询所有大于本部门平均工资的员工信息

select e.* from emp e,(select deptno,avg(sal) sals from emp group by deptno) d where e.sal > d.sals and e.deptno = d.deptno

查询结果:

在这里插入图片描述

40. 查询平均工资最高的部门信息

select d.* from dept d,(select deptno,avg(sal) money from emp group by deptno order by money desc limit 0,1) t where d.deptno = t.deptno

查询结果:

在这里插入图片描述

41. 查询大于各部门总工资的平均值的部门信息

select d.* from dept d,(select deptno,avg(sal) money from emp group by deptno order by money) t 
where t.deptno = d.deptno and t.money > (select avg(sal) from emp)

SELECT d.* FROM dept d,(SELECT m.`DEPTNO` FROM emp m GROUP BY m.`DEPTNO` 
HAVING AVG(m.`SAL`)>(SELECT AVG(sal) FROM emp )) t WHERE d.`DEPTNO` = t.`DEPTNO`; 

查询结果:

在这里插入图片描述

42. 查询大于各部门总工资的平均值的部门下的员工信息

select e.* from emp e,(select deptno,avg(sal) money from emp group by deptno order by money) t 
where t.deptno = e.deptno and t.money > (select avg(sal) from emp) 


SELECT e.* FROM emp e WHERE e.`DEPTNO` IN(SELECT m.`DEPTNO` FROM emp m GROUP BY m.`DEPTNO` HAVING AVG(m.`SAL`)>(SELECT AVG(sal) FROM emp ))

查询结果:

在这里插入图片描述

43. 查询没有员工的部门信息

select d.* from dept d where d.deptno not in (select e.deptno from emp e group by e.deptno)
SELECT d.* FROM dept d WHERE (SELECT COUNT(*) FROM emp e WHERE e.`DEPTNO`=d.`DEPTNO`)<=0;

查询结果:

在这里插入图片描述

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

☞^O^☜♞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值