catalogue
--01 list the names of all departments with at least 3 employees
--03 list the names of all employees and their immediate supervisors
--04 list employees whose employment date is earlier than their direct supervisor
--06 list the names of all employees whose job s are clerk and the names of their departments
--07 list all kinds of jobs with a minimum salary of more than 1500
--09 list all employees whose salary is higher than the average salary of the company
--10 list people who do the same work as employee 'SCOTT'
--14 list the names, Department names and wages of all employees
--15 list a combination of employees who work in the same job but belong to different departments,
--16 list details of all departments
--17 list the minimum wage for various jobs
--18 list the minimum salary of managers in each department
--20 list the average salary of employees whose position is clerk
--21 list the average salary of clerk, grouped by department
object
scott.sql file - other document resources - CSDN Library
This problem set is based on the table
dept table:
DNAME | LOC | DEPTNO |
ACCOUNTING | NEW YORK | 10 |
RESEARCH | DALLAS | 20 |
SALES | CHICAGO | 30 |
OPERATIONS | BOSTON | 40 |
emp table:
salgrade table:
Problem set:
List the names of all departments with at least 3 employees
--Analysis: there are department numbers and detailed data in emp table and department numbers and names in dept table. Therefore, they need to be connected through Department numbers first; Then they need to be divided into groups; Finally, count the data divided into groups and compare with 3. (Note: after grouping, use having for group level filtering)
select d.dname from emp e join dept d on(e.deptno = d.deptno) group by d.dname having count(d.dname) >= 3;
List all employees whose salary is more than 'SMITH'. A sub query is used here (that is, the sub query of SMITH's salary)
select * from emp e where sal > (select sal from emp where ename = 'SMITH');
List the names of all employees and their immediate supervisors
select e.ename,m.ename from emp e,emp m where e.mgr = m.empno;
List employees whose employment date is earlier than their immediate supervisor
select e.ename staff,m.ename superior,e.hiredate Employee entry date,m.hiredate Entry date of its superior from emp e,emp m where e.mgr = m.empno and m.hiredate > e.hiredate;
List Department names and employee information of these departments, including those without employees
select d.dname,e.ename from emp e right join dept d using(deptno);
List the names of all employees whose job s are clerk and the names of their departments
--using(deptno) is synonymous with where(e.deptno=d.deptno)
select d.dname,e.ename from emp e join dept d using(deptno) where e.job = 'CLERK'; select d.dname,e.ename from emp e join dept d where(e.deptno=d.deptno) and e.job like 'CLERK';
List jobs with a minimum salary of more than 1500
select e.job from emp e group by e.job having min(sal) > 1500;
List the names of employees working in the SALES department, assuming they do not know the department number of the SALES department
select e.ename from emp e join dept d using(deptno) where d.dname = 'sales';
List all employees whose salary is higher than the average salary of the company
select * from emp e where sal > (select avg(sal) from emp);
List people who do the same work as employee 'SCOTT'
select * from emp e where job = (select job from emp where ename = 'scott') and ename<>'scott';
List the names and salaries of all employees whose salary is equal to the salary of employees in 30 departments,
When there are multiple targets, you can't only use "=", but use "= any" and the latter "in"
select * from emp where sal = any(select sal from emp where deptno = 30) and deptno <> 30; select * from emp where sal in (select sal from emp where deptno = 30) and deptno <> 30;
List employees whose salary is higher than that of all employees in department 30 and their salary
select * from emp where sal > all(select sal from emp where deptno = 30) and deptno <> 30;
List the number of employees working in each department, average salary and average length of service
select deptno,count(ename),avg(sal),avg(TO_DAYS(now()-hiredate)) from emp group by deptno;
--In fact, there is a lack of 40 departments without employees. In order to count to 40 departments, connect the dept table
select deptno,count(ename),avg(sal),avg(TO_DAYS(now()-hiredate)) from emp right join dept d using(deptno) group by deptno;
List the names, Department names and salaries of all employees
select ename full name,deptno Department name,sal wages from emp right join dept using(deptno);
List a combination of employees who work in the same job but belong to different departments,
select e.empno,e.ename,m.empno,m.ename from emp e ,emp m where e.job = m.job and e.deptno<>m.deptno;
In this case, there are repeated calculations, such as Miller & Smith and Smith & Miller. To avoid this situation, just change e.deptno < > m.deptno to e.deptno > m.deptno or e.deptno < m.deptno, so as to avoid the problem of repeated statistics
select e.empno,e.ename,m.empno,m.ename from emp e ,emp m where e.job = m.job and e.deptno<m.deptno;
List details of all departments
select * from emp e join dept d using(deptno) group by d.dname;
List the minimum wage for various jobs
select job,min(sal) minimum wage from emp group by deptno;
List the minimum salary of managers in each department
select min(sal) from emp where job = 'manager' group by deptno;
List the annual salary (including allowance) of all employees, arranged from low to high,
order by sal/order by sal desc,
To avoid comm being empty, an ifnull(comm,0) can be added,
ifnull(a,b) usage: if it is not empty, return a; if it is empty, return B
Here, the second generation refers to (sal+ifnull(comm,0))*12; If 1 means ename
select ename,(sal+ifnull(comm,0))*12 from emp e order by 2;
List the average salary of employees whose position is clerk
select avg(sal) from emp e where e.job = 'clerk';
List the average salary of clerk, grouped by department
select deptno,avg(sal) from emp e where e.job = 'clerk' group by deptno;
List the average salary of clerk, grouped by department, with department number in(20,30) and number of department employees > = 2, in descending order according to the average salary,
in(10,30) means only 10,30
select deptno,avg(sal) from emp e where e.job = 'clerk' and deptno in (20,30) group by deptno having count(empno) >=2 order by avg(sal) desc;