一.
创建一个员工表和部门表的交叉连接。
select e.empno, e.ename, d.dname
from emp e cross join dept d;
二.
使用自然连接,显示入职日期在80年5月1日之后的员工姓名,部门名称,入职日期
select e.ename, d.dname,e.hiredate
from emp e natural join dept d
where
e.hiredate>'1980-05-21';
三.
使用左连接,查询每个员工的姓名,经理姓名,没有经理的King也要显示出来。
select e.ename,m.ename
from emp e left outer join emp m on(e.mgr = m.empno);
四.
使用右连接,查询每个员工的姓名,经理姓名,没有经理的King也要显示出来
select e.ename,m.ename
from emp e right outer join emp m on(e.mgr = m.empno);
五.
显示员工SMITH的姓名,部门名称,直接上级名称
select e.ename 员工姓名 ,d.dname 部门名称 ,m.ename 上级经理
from emp e,emp m,dept d
where e.mgr = m.empno and e.deptno=d.deptno and e.ename='SMITH';
六.
显示员工姓名,部门名称,工资,工资级别,要求工资级别大于4级。
select e.ename 员工姓名, e.sal 工资 , s.grade 工资等级 ,d.dname 部门
from emp e, salgrade s,dept d
where e.deptno=d.deptno and e.sal between s.losal and s.hisal and s.grade>4;
七.
显示员工KING和FORD管理的员工姓名及其经理姓名。
mysql> select e.ename 员工,m.ename 领导
from emp e,emp m
where m.empno=e.mgr and m.ename in('FORD','KING');
八.
显示员工姓名,参加工作时间,经理名,参加工作时间,要求参加时间比经理早。
select e.ename 员工,e.hiredate 参加工作时间 ,m.ename 经理,m.hiredate 参加工作时间
from emp e,emp m
where m.empno=e.mgr and e.hiredate>m.hiredate;
九.
查询入职日期比10部门任意一个员工晚的员工姓名、入职日期,不包括10部门员工
SELECT
ename,
HIREDATE
FROM
emp
WHERE
HIREDATE > ANY (
SELECT
HIREDATE
FROM
emp
WHERE
DEPTNO = 10
)
AND DEPTNO <> 10;
十.
查询入职日期比10部门所有员工晚的员工姓名、入职日期,不包括10部门员工
SELECT
ename,
HIREDATE
FROM
emp
WHERE
HIREDATE > ALL (
SELECT
HIREDATE
FROM
emp
WHERE
DEPTNO = 10
)
AND DEPTNO <> 10;
十一.
查询职位和10部门任意一个员工职位相同的员工姓名,职位,不包括10部门员
工
SELECT
ename,
JOB
FROM
emp
WHERE
JOB = ANY (
SELECT
JOB
FROM
emp
WHERE
DEPTNO = 10
)
AND DEPTNO <> 10;
十二.
查询部门平均工资在2500元以上的部门名称及平均工资。
SELECT
d.dname,
avg(sal)
FROM
emp e,
dept d
WHERE
e.DEPTNO = d.DEPTNO
GROUP BY
e.DEPTNO
HAVING
avg(sal) > 2500;
十三.
查询员工岗位中不是以“SA”开头并且平均工资在2500元以上的岗位及平均工资,并按平均工资降序排序。
SELECT
job,
avg(sal)
FROM
emp
WHERE
JOB NOT LIKE 'SA%'
GROUP BY
JOB
HAVING
avg(sal) > 2500
ORDER BY
avg(sal);
十四.
查询部门人数在2人以上的部门名称、最低工资、最高工资。
SELECT
d.dname,
min(e.sal),
max(e.sal),
COUNT(*)
FROM
emp e,
dept d
WHERE
d.deptno = e.deptno
GROUP BY
d.dname
HAVING
COUNT(*) > 2;
十五.
查询岗位不为SALESMAN,工资和大于等于2500的岗位及每种岗位的工资和。
SELECT
job,
sum(sal)
FROM
emp
WHERE
job <> 'SALESMAN'
GROUP BY
job
HAVING
sum(sal) >= 2500;
十六.
显示经理号码和经理姓名,这个经理所管理员工的最低工资,没有经理的KING也要显示,不包括最低工资小于3000的,按最低工资由高到低排序
SELECT
e.mgr 经理号码,
m.ename 经理姓名,
MIN(e.sal) 管理员工最低工资
FROM
emp e
LEFT JOIN emp m ON (e.mgr = m.empno)
GROUP BY
e.mgr,
m.ename
HAVING
MIN(e.sal) >= 3000
ORDER BY
MIN(m.sal) DESC;
SELECT
mgr
FROM
emp
GROUP BY
mgr;
十七.
查询工资高于编号为7782的员工工资,并且和7369号员工从事相同工作的员工的编号、姓名及工资。
SELECT
e.EMPNO,
e.ENAME,
e.SAL
FROM
emp e
WHERE
e.SAL > (
SELECT
SAL
FROM
emp
WHERE
EMPNO = 7782
)
AND (
SELECT
JOB
FROM
emp
WHERE
EMPNO = 7369
十八.
查询工资最高的员工姓名和工资。
SELECT
ename,
SAL
FROM
emp
WHERE
SAL = (SELECT MAX(SAL) FROM emp);
十九.
查询部门最低工资高于10号部门最低工资的部门的编号、名称及部门最低工资。
SELECT
e.DEPTNO,
d.dname,
MIN(e.SAL)
FROM
emp e,
dept d
WHERE
e.DEPTNO = d.deptno
GROUP BY
e.DEPTNO,
d.dname
HAVING
MIN(e.SAL) > (
SELECT
MIN(SAL)
FROM
emp
WHERE
DEPTNO = 10
GROUP BY
DEPTNO
);
二十.
查询员工工资为其部门最低工资的员工的编号和姓名及工资。
SELECT
EMPNO,
ENAME,
SAL
FROM
emp
WHERE
sal = ANY (
SELECT
MIN(SAL)
FROM
emp
GROUP BY
DEPTNO
);
二十一.
显示经理是KING的员工姓名,工资。
SELECT
ENAME,
SAL
FROM
emp
WHERE
MGR = (
SELECT
EMPNO
FROM
emp
WHERE
ENAME = 'KING'
);
二十二.
显示比员工SMITH参加工作时间晚的员工姓名,工资,参加工作时间。
SELECT
ENAME,
SAL,
HIREDATE
FROM
emp
WHERE
HIREDATE > ANY (
SELECT
HIREDATE
FROM
emp
WHERE
ENAME = 'SMITH'
);