遇到的問題:
1.由於工位的機子上裝的是mysql5.5
版本,因此不支持開窗函數。第20題的查詢無法進行,需要更換mysql8
的版本。
--20.查詢每個部門薪資最高的前兩名員工信息及所在部門名稱
select
*
from
(
select
a.*,
b.dname,
/*使用開窗函數:對每組組內進行分區排序*/
dense_rank() over (partition by deptno order by salary desc) as nb
from
emp as a
join
dept as b
on
a.deptno = b.deptno
) a
where
a.nb < 3;
查詢結果如下:
+-------+---------+-----------+---------+------------+--------+------+--------+------------+-------+
| empno | empname | job | manager | hiredate | salary | comm | deptno | dname | rank1 |
+-------+---------+-----------+---------+------------+--------+------+--------+------------+-------+
| 7839 | king | president | NULL | 1981-11-17 | 5000 | NULL | 10 | accounting | 1 |
| 7782 | clark | manager | 7839 | 1981-06-09 | 2450 | NULL | 10 | accounting | 2 |
| 7788 | scott | analyst | 7566 | 1987-07-03 | 3000 | NULL | 20 | research | 1 |
| 7902 | ford | analyst | 7566 | 1981-12-03 | 3000 | NULL | 20 | research | 1 |
| 7566 | jones | manager | 7839 | 1981-04-02 | 2975 | NULL | 20 | research | 2 |
| 7698 | blake | manager | 7839 | 1981-05-01 | 2850 | NULL | 30 | sales | 1 |
| 7499 | allen | salesman | 7698 | 1981-02-20 | 1600 | 300 | 30 | sales | 2 |
+-------+---------+-----------+---------+------------+--------+------+--------+------------+-------+
2.21題中不能使用子查詢進行
--21.查詢每個工資等級的員工個數並按照個數降序排序
select grade,count(*) from salgrade where ( select salary from emp)>losal and ( select salary from emp)<hisal group by grade;
--ERROR 1242 (21000): Subquery returns more than 1 row
以下是常用的查詢語句練習,包含了表的創建以及要插入的數據。
--子表
create table emp(
empno int primary key,
empname varchar(10) not null,
job varchar(10) not null,
manager int,
hiredate date,
salary double,
comm double,
deptno int,
constraint empkey foreign key (deptno) references dept(deptno)
);
--父表
create table dept(
deptno int primary key,
dname varchar(20) not null,
loc varchar(20)
);
--工資等級表
create table salgrade(
grade int primary key,
losal double,
hisal double
);
insert into emp values(7369,'smith','clerk',7902,'1980-12-17',800,null,20);
insert into emp values(7499,'allen','salesman',7698,'1981-02-20',1600,300,30);
insert into emp values(7521,'ward','salesman',7698,'1981-02-22',1250,500,30);
insert into emp values(7566,'jones','manager',7839,'1981-04-02',2975,null,20);
insert into emp values(7654,'martin','salesman',7698,'1981-09-28',1250,1400,30);
insert into emp values(7698,'blake','manager',7839,'1981-05-01',2850,null,30);
insert into emp values(7782,'clark','manager',7839,'1981-06-09',2450,null,10);
insert into emp values(7788,'scott','analyst',7566,'1987-07-03',3000,null,20);
insert into emp values(7839,'king','president',null,'1981-11-17',5000,null,10);
insert into emp values(7844,'turner','salesman',7698,'1981-09-08',1500,null,30);
insert into emp values(7876,'adams','clerk',7788,'1987-07-13',1100,null,20);
insert into emp values(7900,'james','clerk',7698,'1981-12-03',950,null,30);
insert into emp values(7902,'ford','analyst',7566,'1981-12-03',3000,null,20);
insert into emp values(7934,'miller','clerk',7782,'1981-01-23',1300,null,10);
insert into dept values (10,'accounting','newyork');
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);
--6.查找部門編號爲30的員工的詳細信息
select * from emp where deptno = 30;
--7.查詢從事CLARK工作的員工的編號、姓名、部門編號
select empno,empname,deptno from emp where job = 'clerk';
--8.查詢獎金多於基本工資60%的員工信息
select * from emp where comm > salary*0.6;
--9.查詢獎金少於100或者沒有獲得獎金的員工的信息
select * from emp where comm < 400 or comm is null;
--10.查詢名字長度爲6個字符的員工信息
select * from emp where char_length(empname) = 6;
--11.查詢員工的信息,並按工作降序排序,如果工作相同按照工資升序排序
select * from emp order by job desc,salary asc;
--12.查詢每個工作崗位的員工人數並按照人數降序排序
select count(*) as '人數',job as '工作' from emp group by job order by count(*) desc;
--13.查詢每個工作崗位的最高薪資
select max(salary),job from emp group by job;
--14.查詢所有員工的信息及所在部門名稱
select a.*,b.dname from emp as a join dept as b on a.deptno = b.deptno;
--15.查詢工資高於smith的員工信息
select * from emp where salary >(select salary from emp where empname = 'smith') ;
--16.查詢銷售部(sales)所有員工的姓名
select *from emp where deptno = (select deptno from dept where dname = 'sales');
--17.查詢工資高於平均工資的員工信息
select *from emp where salary >(select avg(salary) from emp);
--18.查詢與scott從事相同工作的員工信息
select * from emp where job = (select job from emp where empname = 'scott');
--19.查詢每個部門的最高薪資、最低薪資、平均薪資並按照最高薪資降序排序
select max(salary),min(salary),avg(salary),deptno from emp group by deptno order by max(salary) desc;
--20.查詢每個部門薪資最高的前兩名員工信息及所在部門名稱
select
*
from
(
select
a.*,
b.dname,
dense_rank() over (partition by deptno order by salary desc) as nb
from
emp as a
join
dept as b
on
a.deptno = b.deptno
) a
where
a.nb < 3;
--這種方式錯誤
--select a.*,b.dname from emp a join dept b on a.deptno = b.deptno group by deptno order by salary desc limited 2;
--21.查詢每個工資等級的員工個數並按照個數降序排序
--select grade,count(*) from salgrade where ( select salary from emp)>losal and ( select salary from emp)<hisal group by grade;
--ERROR 1242 (21000): Subquery returns more than 1 row
select
b.grade,
count(a.empno)
from
emp a
join
salgrade b
on
a.salary > b.losal and a.salary <hisal
group by
b.grade
order by
count(a.empno) desc;