1. 程式人生 > >mysql 綜合練習題

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;