多表查询经典练习

 

--编写多表查询语句的一般过程
--(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

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值