--编写多表查询语句的一般过程
--(1)、分析句子要涉及到哪些表
--(2)、对应的表中要查询哪些关联字段
--(3)、确定连接条件或筛选条件
--(4)、写成完整的SQL查询语句
--1、查询出每一位雇员的姓名、职位、以及领导的姓名。
SELECT e.ename 雇佣姓名,e.job 职位,m.ename 领导姓名 FROM EMP e,EMP m WHERE e.mgr = m.empno;
--结果
雇佣姓名 职位 领导姓名
---------- --------- ----------
FORD ANALYST JONES
SCOTT ANALYST JONES
TURNER SALESMAN BLAKE
ALLEN SALESMAN BLAKE
WARD SALESMAN BLAKE
JAMES CLERK BLAKE
MARTIN SALESMAN BLAKE
MILLER CLERK CLARK
ADAMS CLERK SCOTT
BLAKE MANAGER KING
JONES MANAGER KING
CLARK MANAGER KING
SMITH CLERK FORD
13 rows selected
--2、查询每个雇佣的雇佣编号,姓名、基本工资、职位、领导的姓名、部门名称及位置
select e.empno 编号,e.ename 姓名,e.sal 基本工资,e.job 职位,m.ename 领导姓名, d.dname 部门名称, d.loc 所在位置 from emp e LEFT OUTER JOIN emp m ON e.mgr = m.empno, dept d where d.deptno = e.deptno;
--结果
编号 姓名 工资 职位 领导姓名 部门名称 所在位置
----- ---------- --------- --------- ---------- -------------- -------------
7369 SMITH 800.00 CLERK FORD RESEARCH DALLAS
7499 ALLEN 1600.00 SALESMAN BLAKE SALES CHICAGO
7521 WARD 1250.00 SALESMAN BLAKE SALES CHICAGO
7566 JONES 2975.00 MANAGER KING ACCOUNTING NEW YORK
7654 MARTIN 1250.00 SALESMAN BLAKE SALES CHICAGO
7698 BLAKE 2850.00 MANAGER KING ACCOUNTING NEW YORK
7782 CLARK 2450.00 MANAGER KING ACCOUNTING NEW YORK
7788 SCOTT 3000.00 ANALYST JONES RESEARCH DALLAS
7844 TURNER 1500.00 SALESMAN BLAKE SALES CHICAGO
7876 ADAMS 1100.00 CLERK SCOTT RESEARCH DALLAS
7900 JAMES 950.00 CLERK BLAKE SALES CHICAGO
7902 FORD 3000.00 ANALYST JONES RESEARCH DALLAS
7934 MILLER 1300.00 CLERK CLARK ACCOUNTING NEW YORK
7839 KING 5000 PRESIDENT (null) ACCOUNTING NEW YORK
14 rows selected
--要求查询出每一个雇员的编号、姓名、工资、部门名称、工资在所在公司的工资等级
SELECT e.empno,e.ename,e.sal,d.dname,sg.grade FROM emp e,dept d,salgrade sg WHERE e.deptno = d.deptno AND sg.hisal >=e.sal AND sg.losal <=e.sal;
--结果
EMPNO ENAME SAL DNAME GRADE
----- ---------- --------- -------------- ----------
7369 SMITH 800.00 RESEARCH 1
7900 JAMES 950.00 SALES 1
7876 ADAMS 1100.00 RESEARCH 1
7654 MARTIN 1250.00 SALES 2
7521 WARD 1250.00 SALES 2
7934 MILLER 1300.00 ACCOUNTING 2
7844 TURNER 1500.00 SALES 3
7499 ALLEN 1600.00 SALES 3
7782 CLARK 2450.00 ACCOUNTING 4
7698 BLAKE 2850.00 SALES 4
7566 JONES 2975.00 RESEARCH 4
7902 FORD 3000.00 RESEARCH 4
7788 SCOTT 3000.00 RESEARCH 4
7839 KING 5000.00 ACCOUNTING 5
14 rows selected
--或者
SELECT e.empno,e.ename,e.sal,d.dname,sg.grade FROM emp e,dept d,salgrade sg WHERE e.deptno = d.deptno AND e.sal BETWEEN sg.losal AND sg.hisal;
--结果
EMPNO ENAME SAL DNAME GRADE
----- ---------- --------- -------------- ----------
7839 KING 5000.00 ACCOUNTING 5
7902 FORD 3000.00 RESEARCH 4
7788 SCOTT 3000.00 RESEARCH 4
7566 JONES 2975.00 RESEARCH 4
7698 BLAKE 2850.00 SALES 4
7782 CLARK 2450.00 ACCOUNTING 4
7499 ALLEN 1600.00 SALES 3
7844 TURNER 1500.00 SALES 3
7934 MILLER 1300.00 ACCOUNTING 2
7521 WARD 1250.00 SALES 2
7654 MARTIN 1250.00 SALES 2
7876 ADAMS 1100.00 RESEARCH 1
7900 JAMES 950.00 SALES 1
7369 SMITH 800.00 RESEARCH 1
--还或者
SELECT e.empno,e.ename,e.sal,d.dname,sg.grade,DECODE(sg.grade,'1','第一等级工资','2','第二等级工资','3','第三等级工资','4','第四等级工资','5','第五等级工资') 等级 FROM emp e,dept d,salgrade sg WHERE e.deptno = d.deptno AND e.sal BETWEEN sg.losal AND sg.hisal;
--结果
EMPNO ENAME SAL DNAME GRADE 等级
----- ---------- --------- -------------- ---------- ------------
7839 KING 5000.00 ACCOUNTING 5 第五等级工资
7902 FORD 3000.00 RESEARCH 4 第四等级工资
7788 SCOTT 3000.00 RESEARCH 4 第四等级工资
7566 JONES 2975.00 RESEARCH 4 第四等级工资
7698 BLAKE 2850.00 SALES 4 第四等级工资
7782 CLARK 2450.00 ACCOUNTING 4 第四等级工资
7499 ALLEN 1600.00 SALES 3 第三等级工资
7844 TURNER 1500.00 SALES 3 第三等级工资
7934 MILLER 1300.00 ACCOUNTING 2 第二等级工资
7521 WARD 1250.00 SALES 2 第二等级工资
7654 MARTIN 1250.00 SALES 2 第二等级工资
7876 ADAMS 1100.00 RESEARCH 1 第一等级工资
7900 JAMES 950.00 SALES 1 第一等级工资
7369 SMITH 800.00 RESEARCH 1 第一等级工资
14 rows selected
--左右连接
--当(+)在连接条件的左边的时候,表示的是右连接
--当(+)在连接条件的右边的时候,表示的是左连接
--3、查询每个雇员的姓名和领导的姓名
SELECT e.ename 雇员姓名,m.ename 领导姓名 FROM emp e,emp m WHERE m.empno(+) = e.mgr;
--结果
雇员姓名 领导姓名
---------- ----------
FORD JONES
SCOTT JONES
JAMES BLAKE
TURNER BLAKE
MARTIN BLAKE
WARD BLAKE
ALLEN BLAKE
MILLER CLARK
ADAMS SCOTT
CLARK KING
BLAKE KING
JONES KING
SMITH FORD
KING
14 rows selected
--4、统计出领取佣金和不领取佣金的雇员人数和平均工资
SELECT comm,COUNT(empno),AVG(sal) FROM emp GROUP BY comm;--(此语句不完善,那位看了之后又什么想法的话欢迎大家回复)
--结果
COMM COUNT(EMPNO) AVG(SAL)
--------- ------------ ----------
10 2342.5
1400.00 1 1250
500.00 1 1250
300.00 1 1600
0.00 1 1500
--5、按照职位分组,求出每个职位的最高工资、最低工资以及平均工资
SELECT job ,COUNT(empno),MAX(sal),MIN(sal),AVG(sal) FROM emp GROUP BY job;
--结果
JOB COUNT(EMPNO) MAX(SAL) MIN(SAL) AVG(SAL)
--------- ------------ ---------- ---------- ----------
CLERK 4 1300 800 1037.5
SALESMAN 4 1600 1250 1400
PRESIDENT 1 5000 5000 5000
MANAGER 3 2975 2450 2758.33333
ANALYST 2 3000 3000 3000
--6、统计平均工资最高和最低
SELECT MAX(AVG(sal)),MIN(AVG(sal)) FROM EMP GROUP BY job;
--结果
MAX(AVG(SAL)) MIN(AVG(SAL))
------------- -------------
5000 1037.5
--7、查询出每个部门的名称、部门人数、平均工资
SELECT d.dname,COUNT(e.empno),NVL(AVG(e.sal),0) FROM emp e,dept d WHERE d.deptno = e.deptno(+) GROUP BY d.dname;
--结果
DNAME COUNT(E.EMPNO) NVL(AVG(E.SAL),0)
-------------- -------------- -----------------
ACCOUNTING 3 2916.66666666667
OPERATIONS 0 0
RESEARCH 5 2175
SALES 6 1566.66666666667
--8、查询出每个部门的名称、位置、部门人数、平均工资(这是一个多字段分组查询)
SELECT d.deptno,d.dname,d.loc,COUNT(e.empno),NVL(AVG(sal),0) FROM emp e, dept d WHERE d.deptno = e.deptno(+) GROUP BY d.deptno,d.dname,d.loc ;
DEPTNO DNAME LOC COUNT(E.EMPNO) NVL(AVG(SAL),0)
------ -------------- ------------- -------------- ---------------
20 RESEARCH DALLAS 5 2175
40 OPERATIONS BOSTON 0 0
10 ACCOUNTING NEW YORK 3 2916.6666666666
30 SALES CHICAGO 6 1566.6666666666
--9、统计平均工资大于2000的部门的详细信息
SELECT d.*,AVG(e.sal) FROM emp e,dept d WHERE d.deptno = e.deptno GROUP BY d.deptno,d.dname,d.loc HAVING AVG(e.sal)>2000;
--结果
DEPTNO DNAME LOC AVG(E.SAL)
------ -------------- ------------- ----------
20 RESEARCH DALLAS 2175
10 ACCOUNTING NEW YORK 2916.66666
--10、显示非销售人员工资名称及从事同一工作雇员的月工资的总和,并且要满足从事同一工作的雇员的月工资合计大于5000,
--给出的结果按月工资的合计升序排序:
SELECT job,SUM(sal) FROM emp GROUP BY job HAVING SUM(sal)>5000 ORDER BY SUM(sal);
--结果
JOB SUM(SAL)
--------- ----------
SALESMAN 5600
ANALYST 6000
MANAGER 8275
--11、计算出工资比SMITH的要高的员工详细信息
SELECT * FROM EMP WHERE sal > (SELECT sal FROM EMP WHERE ename='SMITH');
--结果
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7499 ALLEN SALESMAN 7698 20-二月-81 1600.00 300.00 30
7521 WARD SALESMAN 7698 22-二月-81 1250.00 500.00 30
7566 JONES MANAGER 7839 02-四月-81 2975.00 20
7654 MARTIN SALESMAN 7698 28-九月-81 1250.00 1400.00 30
7698 BLAKE MANAGER 7839 01-五月-81 2850.00 30
7782 CLARK MANAGER 7839 09-六月-81 2450.00 10
7788 SCOTT ANALYST 7566 19-四月-87 3000.00 20
7839 KING PRESIDENT 17-十一月-81 5000.00 10
7844 TURNER SALESMAN 7698 08-九月-81 1500.00 0.00 30
7876 ADAMS CLERK 7788 23-五月-87 1100.00 20
7900 JAMES CLERK 7698 03-十二月-81 950.00 30
7902 FORD ANALYST 7566 03-十二月-81 3000.00 20
7934 MILLER CLERK 7782 23-一月-82 1300.00 10
13 rows selected
--12、查询出工资高于公司平均工资的员工详细信息
SELECT * FROM EMP WHERE sal >(SELECT AVG(sal) FROM EMP);
--结果
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7566 JONES MANAGER 7839 02-四月-81 2975.00 20
7698 BLAKE MANAGER 7839 01-五月-81 2850.00 30
7782 CLARK MANAGER 7839 09-六月-81 2450.00 10
7788 SCOTT ANALYST 7566 19-四月-87 3000.00 20
7839 KING PRESIDENT 17-十一月-81 5000.00 10
7902 FORD ANALYST 7566 03-十二月-81 3000.00 20
6 rows selected