MySQL数据库07 复杂查询练习题

1、 列出与“SCOTT”从事相同工作的所有员工及部门名称,部门人数。

# 按照部门分组 , 求出部门名称和人数
select e.deptno ,dname, count(empno) ct from emp e, dept d where e.deptno = d.deptno group by e.deptno, d.dname
# 单表查询所有员工
select  from emp where job = (select job from emp where ename = 'SCOTT');

# 多表联查
select e.*,nt.dname, nt.ct 
from emp e , (select e.deptno ,dname, count(empno) ct from emp e, dept 
   d where e.deptno = d.deptno group by e.deptno, d.dname) nt  
where e.deptno = nt.deptno and job = (select job from emp where ename = 'SCOTT');

2、 列出公司各个工资等级雇员的数量、平均工资。

select s.grade,count(empno), avg(sal)
from emp e , salgrade s
where e.sal between s.losal and s.hisal 
group by s.grade

3、 列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金、部门名称。

#在部门30工作的所有员工的薪金
select sal from emp where deptno = 30

select e.ename, e.sal , d.dname
from emp e join dept d on e.deptno = d.deptno
where sal > all(select sal from emp where deptno = 30);

4、 列出在每个部门工作的员工数量、平均工资和平均服务期限。

select deptno, count(empno),avg(sal) , avg(datediff(now(),hiredate)/365)
from emp
group by deptno

# 第二种更加精确的方式
select deptno, count(empno),avg(sal) , avg(timestampdiff(year,hiredate,now()))
from emp
group by deptno

5、 列出所有员工的姓名、部门名称和工资。

select ename, dname, sal from emp e join dept d on e.deptno = d.deptno

6、 列出所有部门的详细信息和部门人数。

# 1- 部门人数
select deptno , count(1) ct from emp group by deptno
# 2- 使用子查询+ 多表查询
select d.*, nt.ct
from dept d left join (select deptno , count(1) ct from emp group by deptno) nt 
on d.deptno = nt.deptno

7、 列出各种工作的最低工资及从事此工作的雇员姓名。

# 各种工作的最低工资 该最低工资的雇员
select ename from emp where sal in (select min(sal) from emp group by job);

8、 列出各个部门的MANAGER(经理)的最低薪金、姓名、部门名称、部门人数。

# 1- 各个部门的MANAGER(经理)的最低薪金
select deptno, min(sal) min_sal from emp where job = 'MANAGER' group by deptno;
# 2- 统计部门人数
select deptno , count(1) ct from emp group by deptno;
# 3- 四表联合查询
select nt_sal.min_sal 最低薪金,e.ename, d.dname,nt_ct.ct
from emp e,dept d,
	(select deptno, min(sal) min_sal from emp where job = 'MANAGER' group by deptno) nt_sal ,
	(select deptno , count(1) ct from emp group by deptno) nt_ct
where e.deptno = d.deptno 
    and e.deptno = nt_sal.deptno 
    and e.deptno = nt_ct.deptno 
    and e.job = 'MANAGER'

9、 列出所有员工的年工资,所在部门名称,按年薪从低到高排序。

select e.sal + ifnull(comm,0) 年薪, d.dname 
from emp e join dept d on e.deptno = d.deptno order by 年薪;

10、查出某个员工的上级主管及所在部门名称,并要求这些主管的薪水超过3000

# 员工姓名, 主管姓名 主管所在部门名称, 主管sal > 3000
select e.ename, m.ename, d.dname
from emp e join emp m on e.mgr = m.empno join dept d on m.deptno = d.deptno
where m.sal >= 3000
# 
select e.ename, m.ename, d.dname
from emp e,emp m,dept d
where  e.mgr = m.empno and m.deptno = d.deptno and m.sal >= 3000

11、求出部门名称中,带‘S’字符的部门员工的、工资合计、部门人数。


12、给任职日期超过30年或者在87年雇佣的雇员加薪,加薪原则:10部门增长10%,20部门增长20%,30部门增长30%,依次类推。


13.列出至少有一个员工的所有部门的信息:


14.列出薪金比SMITH对的所有员工:


15.列出所有员工的姓名以及其直接上级的姓名:


16.列出受雇日期早于其直接上级的所有员工的编号、姓名,部门名称

17.列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门

18.列出所有"CLERK(职员)"的姓名以及部门名称,部门的人数

19.列出最低薪金大于1500的各种工作以及从事此工作的全部雇员人数

20.列出在部门"SALES"工作的员工的姓名,假定不知道销售部的部门编号

21.列出薪金高于公司平均薪金的所有员工,所在部门,上级领导,公司的工资等级

  1. 列出至少有一个员工的所有部门编号、名称,并统计出这些部门的平均工资、最低工资、最高工资。
  2. 列出薪金比“SMITH”或“ALLEN”多的所有员工的编号、姓名、部门名称、其领导姓名。
  3. 列出所有员工的编号、姓名及其直接上级的编号、姓名,显示的结果按领导年工资的降序排列。

25.列出受雇日期早于其直接上级的所有员工的编号、姓名、部门名称、部门位置、部门人数。

  1. 列出部门名称和这些部门的员工信息(数量、平均工资),同时列出那些没有员工的部门。
  2. 列出所有“CLERK”(办事员)的姓名及其部门名称,部门的人数,工资等级。
  3. 列出最低薪金大于1500的各种工作及此从事此工作的全部雇员人数及所在部门名称、位置、平均工资。
  4. 列出在部门“SALES”(销售部)工作的员工的姓名、基本工资、雇佣日期、部门名称,假定不知道销售部的部门编号。
  5. 列出薪金高于公司平均薪金的所有员工,所在部门,上级领导,公司的工资等级。 31. 列出与“SCOTT”从事相同工作的所有员工及部门名称,部门人数。

32.查询dept表的结构

33.检索emp表,用is a 这个字符串来连接员工姓名和工种两个字段

34.检索emp表中有提成的员工姓名、月收入及提成。

35.创建my_employee表,向表中插入下列数据
ID FIRST_NAME LAST_NAME USERID SALARY
1 patel Ralph Rpatel 895
2 Dancs Betty Bdancs 860
3 Biri Ben Bbiri 1100
4 Newman Chad Cnewman 750
5 Ropeburn Audrey Aropebur 1550

36.将3号员工的last_name修改为"drelxer"

37.将所有工资少于900的员工的工资修改为1000
38.删除所有数据

39.清空表my_employee
40. 创建表dept
列名 Null? type
id Number(7)
name Varchar2(25)

41.将表emp中的数据插入表dept中

42.创建表emp2
name Null? type
id Number(7)
First_name Varchar2(25)
Last_name Varchar2(25)
Dept_id Number(7)

43.直接删除表emp2中的列dept_id

44.将列Last_name的长度增加到50
45.根据表emp创建employees2

46.将表employees2重命名为emp3
47.在表dept和emp中添加新列test_column(varchar2(50)),并检查所作的操作
48.向表emp的id列中添加PRIMARY KEY约束

49.向表emp中添加列dept_id,并在其中定义FOREIGN KEY约束,与之相关联的列是dept表中的id列。
50.向表dept的id列中添加PRIMARY KEY约束

你可能感兴趣的:(数据库)