Mysql 综合练习题

设置表和数据信息:

create table dept(
    deptno int primary key, #--部门编号
    dname varchar(14),--部门名称
    loc varchar(13)--地址
);

create table emp(
    empno int not null primary key,--员工编号
    ename varchar(10),--员工名称
    job varchar(10),--工作
    mgr int,--经理编号
    hiredate datetime,--入职日期
    sal double,--工资
    comm double,--奖金或者提成
    deptno int,--部门编号(外键)员工属于那个部门
    foreign key(deptno) references dept(deptno)
);

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 dept values(50, 'Admin', 'Washing') ;

insert into emp values(7369, 'Smith', 'Clerk',7902, '1980-12-17',800,0,20) ;
insert into emp values(7370, 'S_mith', 'Clerk',7902, '1980-12-17',800,0,20) ;
insert into emp values(7499, 'Allen', 'Salesman',7698,'1981-2-20',1600,300,30) ;
insert into emp values(7844, 'Turner', 'Salesman',7499, '1981-9-8',1500,0,30) ;
insert into emp values(7698, 'Tom', 'Manager',0, '1981-9-8',6100,600,40) ;
insert into emp values(7876, 'Adams', 'Clerk',7900, '1987-5-23',1100,0,20) ;
insert into emp values(7900, 'James', 'Clerk',7698, '1981-12-3',2400,0,30) ;
insert into emp values(7902, 'Ford', 'Analyst',7698, '1981-12-3',3000,null,20) ;
insert into emp values(7901, 'Kik', 'Clerk',7900, '1981-12-3',1900,0,30) 

问题:

#1. 列出至少有一个员工的所有部门
select distinct emp.deptno,dname from emp,dept where emp.deptno =dept.deptno;

#2. 列出薪金比“SMITH”多的所有员工。
select ename from emp where sal>(select sal from emp where ename = 'Smith');

#3. 列出所有员工的姓名及其直接上级的姓名。
select a.ename as c,b.ename,a.hiredate,b.hiredate from emp a,emp b where a.mgr=b.empno;

#4. 列出受雇日期晚于其直接上级的所有员工。
select name from  (select a.ename as name,b.ename,a.hiredate as date1,b.hiredate as date2 from emp a,emp b where a.mgr=b.empno) as c where date1>date2;
   列出受雇日期早于其直接上级的所有员工。
select name from  (select a.ename as name,b.ename,a.hiredate as date1,b.hiredate as date2 from emp a,emp b where a.mgr=b.empno) as c where date1<date2;

#5. 列出部门名称和这些部门的员工信息,同时列出那些没有员工的部门。
select dname,ename from emp right outer join dept on emp.deptno=dept.deptno group by dname;

#6. 列出所有工作为“SALESMAN”的姓名及其部门名称。
select ename,dname from emp,dept where emp.deptno=dept.deptno and emp.job='salesman';

#7. 列出最低薪金大于1500的各种工作。
select job,min(sal) from emp group by job having min(sal)>1500;

8.  列出在部门“SALES”(销售部)工作的员工的姓名,假定不知道销售部的部门编号。
select ename from emp,dept where emp.deptno=dept.deptno and dname='sales';

#9. 列出薪金高于公司平均薪金的所有员工。
 select ename from emp,(select avg(sal) as b from emp)as a where sal>b;
列出每个部门高出部门平均工资的员工。
select ename from emp where sal>(select avg(sal) from emp);

#10.列出与“SMITH”从事相同工作的所有员工。
 select ename from emp where job=(select job from emp where ename='smith');(是否包括smith)
#11.列出薪金等于部门30中员工的薪金的所有员工的姓名和薪金。
select ename,sal from emp where sal in (select sal from emp where deptno =30);

#12.列出薪金高于在部门30工作的所有员工的薪金的员工姓名和薪金。
select ename,sal from emp where sal >(select max(sal) from emp where deptno =30);

#13.列出在每个部门工作的员工数量、平均工资和平均服务期限。
select count(*),avg(sal),avg(datediff(now(),hiredate)) from emp group by deptno;

#14.列出所有员工的姓名、部门名称和工资。
 select ename,dname,sal from emp,dept where emp.deptno=dept.deptno; 

#15.列出从事同一种工作但属于不同部门的员工的一种组合。
 select concat(a.ename,:,b.ename) from emp a,emp b where a.job=b.job and a.deptno!=b.deptno limit 1;

#16.列出所有部门的详细信息和部门人数。
select dept.deptno,dname,loc,count(ename) from emp,dept where emp.deptno=dept.deptno group by deptno;

#17.列出各种工作的最低工资。
select job,min(sal) from emp group by job;

#18.列出MANAGER(经理)的最低薪金。
select min(sal + comm)from emp where job='Manager';

#19.列出所有员工的年工资,按年薪从低到高排序。
select ename,sal*12+ifnull(comm,0) from emp order by sal*12+ifnull(comm,0);

#20. 列出前五位每个员工的名字,工资、涨薪后的的工资(涨幅为8%),以“元”为单位进行四舍五入。
select ename,sal,concat(round(sal*1.08),'元') from emp limit 0,5;

#21. 找出谁是最高领导,将名字按大写形式显示。【需要查阅一下如何把字符串变大写的函数】
select upper(ename) from emp order by mgr limit 0,1;

#22. 哪些员工的工资高于他直接上司的工资,列出员工的名字和工资,上司的名字和工资。
select a.ename 员工,a.sal 员工工资 ,b.ename 上司,b.sal 上司工资 from emp a,emp b where a.sal<b.sal and a.mgr=b.empno;

#23. 哪些员工跟Smith做不一样的职位。
 select ename from emp where job!=(select job from emp where ename='smith');

#24. 显示有提成的员工的信息:名字、提成、所在部门名称、所在地区的名称。
select ename,comm,dname,loc from emp,dept where comm>0 and emp.deptno=dept.deptno;

#25. 显示SALES部门有哪些职位。
select job from emp,dept where dname='sales' and emp.deptno=dept.deptno; 

#26. 整个公司中,最高工资和最低工资相差多少。
select max(sal)-min(sal) from emp ;

#27. 提成大于0 的人数。 
("IFNULL(expr1,expr2)
如果expr1不是NULL,IFNULL()返回expr1,否则它返回expr2。IFNULL()返回一个数字或字符串值")
select count(*) from emp where comm>0;

#28. 显示整个公司的最高工资、最低工资、工资总和、平均工资保留到整数位
select max(sal),min(sal),sum(sal),round(avg(sal)) from emp;

#29. 整个公司有多少个领导。(去重 distinct)
select count(distinct mgr) from emp;
select count(distinct mgr) from emp where mgr != 0;

#30. 列出在同一部门入职日期晚但工资高于其他同事的员工:名字、入职日期
select distinct a.ename,a.hiredate from emp a,emp b where a.hiredate>b.hiredate and a.sal>b.sal and a.deptno=b.deptno;

猜你喜欢

转载自blog.csdn.net/zztingfeng/article/details/80815763