目录
查询每个员工的编号、姓名、职位、基本工资、部门名称、部门位置
确定要使用的数据表
确定已知的关联字段
查询每个员工的编号、姓名、职位、基本工资、工资等级
确定要使用的数据表
确定已知的关联字段
查询每个员工的编号、姓名、职位、基本工资、部门名称、工资等级
确定所需要的数据表
确定已知的关联字段
Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645
前面介绍了多表查询,实际上就是在 from子句之后增加新的数据表,每增加一张数据表就必须消除笛卡尔积(没有关联字段的表不能够进行多表查询)
需要注意:不管你怎么优化,笛卡尔积永远存在,数据量都会很大,现在来巩固一下前面学习的知识点
查询每个员工的编号、姓名、职位、基本工资、部门名称、部门位置
确定要使用的数据表
emp 表:员工的编号、姓名、职位、基本工资
dept 表:部门名称、部门位置
确定已知的关联字段
员工与部门: emp.deptno=dept.deptno
第一步:查询出每个员工的编号、姓名、职位、基本工资。现在只需要使用 emp 一张数据表即可
SQL> select e.empno,e.ename,e.job,e.sal2  from emp e;EMPNO ENAME                JOB                       SAL
---------- -------------------- ------------------ ----------7369 SMITH                CLERK                     8007499 ALLEN                SALESMAN                 16007521 WARD                 SALESMAN                 12507566 JONES                MANAGER                  29757654 MARTIN               SALESMAN                 12507698 BLAKE                MANAGER                  28507782 CLARK                MANAGER                  24507839 KING                 PRESIDENT                50007844 TURNER               SALESMAN                 15007900 JAMES                CLERK                     9507902 FORD                 ANALYST                  30007934 MILLER               CLERK                    13008989 HELLO已选择 13 行。此时数据表 emp 别名命名为 e,并显示出该表每个员工的编号、姓名、职位和基本工资
第二步:查询出每个员工对应的部门信息,需要引入 dept 表(引入表的时候一定要考虑关联) 。这两张表直接可以利用 deptno 字段关联,利用 where子句来消除笛卡尔积
SQL> select e.empno,e.ename,e.job,e.sal,d.dname,d.loc2  from emp e,dept d3  where e.deptno=d.deptno;EMPNO ENAME                JOB                       SAL DNAME                        LOC
---------- -------------------- ------------------ ---------- ---------------------------- --------------------------7839 KING                 PRESIDENT                5000 ACCOUNTING                   NEW YORK7782 CLARK                MANAGER                  2450 ACCOUNTING                   NEW YORK7934 MILLER               CLERK                    1300 ACCOUNTING                   NEW YORK7902 FORD                 ANALYST                  3000 RESEARCH                     DALLAS7369 SMITH                CLERK                     800 RESEARCH                     DALLAS7566 JONES                MANAGER                  2975 RESEARCH                     DALLAS7900 JAMES                CLERK                     950 SALES                        CHICAGO7844 TURNER               SALESMAN                 1500 SALES                        CHICAGO7654 MARTIN               SALESMAN                 1250 SALES                        CHICAGO7521 WARD                 SALESMAN                 1250 SALES                        CHICAGO7499 ALLEN                SALESMAN                 1600 SALES                        CHICAGO7698 BLAKE                MANAGER                  2850 SALES                        CHICAGO已选择 12 行。二张表通过“e.deptno=d.deptno”进行关联,显示的数据字段增加数据表 dept 中的 dname 和 loc 字段
以上的操作属于之前基本概念的加强,并且给出了明确的关联字段。很多查询是不会明确给出关联字段的
查询每个员工的编号、姓名、职位、基本工资、工资等级
SQL> select * from salgrade;GRADE      LOSAL      HISAL
---------- ---------- ----------1        700       12002       1201       14003       1401       20004       2001       30005       3001       9999确定要使用的数据表
emp 表:员工的编号、姓名、职位、基本工资
salgrade 表:工资等级
确定已知的关联字段
尽管 emp 表中没有确定的字段与 salgrade 表中的字段一样,但仍然可以通过其他关系进行关联。
通过 salgrade 表中的两个字段形成范围进行管理,即员工表的 sal 字段的值落在 salgrade 表中的两个字段形成范围中,这时关联关系可以写成 emp.sal BETWEEN salgrade.losal AND salgrade.hisal
第一步:查询出每个员工的编号、姓名、职位、基本工资。现在只需要使用 emp 一张数据表即可
SQL> select e.empno,e.ename,e.job,e.sal2  from emp e;EMPNO ENAME                JOB                       SAL
---------- -------------------- ------------------ ----------7369 SMITH                CLERK                     8007499 ALLEN                SALESMAN                 16007521 WARD                 SALESMAN                 12507566 JONES                MANAGER                  29757654 MARTIN               SALESMAN                 12507698 BLAKE                MANAGER                  28507782 CLARK                MANAGER                  24507839 KING                 PRESIDENT                50007844 TURNER               SALESMAN                 15007900 JAMES                CLERK                     9507902 FORD                 ANALYST                  30007934 MILLER               CLERK                    13008989 HELLO已选择 13 行。第二步:增加 salgrade 表,增加了数据表之后就需要引入 where子句消除笛卡尔积
SQL> select e.empno,e.ename,e.job,e.sal,s.grade2  from emp e,salgrade s3  where e.sal between s.losal and s.hisal;EMPNO ENAME                JOB                       SAL      GRADE
---------- -------------------- ------------------ ---------- ----------7369 SMITH                CLERK                     800          17900 JAMES                CLERK                     950          17521 WARD                 SALESMAN                 1250          27654 MARTIN               SALESMAN                 1250          27934 MILLER               CLERK                    1300          27844 TURNER               SALESMAN                 1500          37499 ALLEN                SALESMAN                 1600          37782 CLARK                MANAGER                  2450          47698 BLAKE                MANAGER                  2850          47566 JONES                MANAGER                  2975          47902 FORD                 ANALYST                  3000          47839 KING                 PRESIDENT                5000          5已选择 12 行。查询每个员工的编号、姓名、职位、基本工资、部门名称、工资等级
确定所需要的数据表
emp 表:编号、姓名、职位、基本工资
dept 表:部门名称
salgrade 表:工资等级
确定已知的关联字段
员工与部门: emp.deptno=dept.deptno
员工与工资等级: emp.sal BETWEEN salgrade.losal AND salgrade.hisal
第一步:查询出每个员工的编号、姓名、职位、基本工资
SQL> select e.empno,e.ename,e.job,e.sal2  from emp e;EMPNO ENAME                JOB                       SAL
---------- -------------------- ------------------ ----------7369 SMITH                CLERK                     8007499 ALLEN                SALESMAN                 16007521 WARD                 SALESMAN                 12507566 JONES                MANAGER                  29757654 MARTIN               SALESMAN                 12507698 BLAKE                MANAGER                  28507782 CLARK                MANAGER                  24507839 KING                 PRESIDENT                50007844 TURNER               SALESMAN                 15007900 JAMES                CLERK                     9507902 FORD                 ANALYST                  30007934 MILLER               CLERK                    13008989 HELLO已选择 13 行。第二步:加入部门名称,增加一张表就增加一个条件消除笛卡尔积
SQL> select e.empno,e.ename,e.job,e.sal,d.dname2  from emp e,dept d3  where e.deptno=d.deptno;EMPNO ENAME                JOB                       SAL DNAME
---------- -------------------- ------------------ ---------- ----------------------------7839 KING                 PRESIDENT                5000 ACCOUNTING7782 CLARK                MANAGER                  2450 ACCOUNTING7934 MILLER               CLERK                    1300 ACCOUNTING7902 FORD                 ANALYST                  3000 RESEARCH7369 SMITH                CLERK                     800 RESEARCH7566 JONES                MANAGER                  2975 RESEARCH7900 JAMES                CLERK                     950 SALES7844 TURNER               SALESMAN                 1500 SALES7654 MARTIN               SALESMAN                 1250 SALES7521 WARD                 SALESMAN                 1250 SALES7499 ALLEN                SALESMAN                 1600 SALES7698 BLAKE                MANAGER                  2850 SALES已选择 12 行。第三步:加入工资等级信息,与原始的消除笛卡尔积条件应该同时满足,所以使用 AND 连接
SQL> select e.empno,e.ename,e.job,e.sal,d.dname,s.grade2  from emp e,dept d,salgrade s3  where e.deptno=d.deptno and e.sal between s.losal and s.hisal;EMPNO ENAME                JOB                       SAL DNAME                             GRADE
---------- -------------------- ------------------ ---------- ---------------------------- ----------7839 KING                 PRESIDENT                5000 ACCOUNTING                            57902 FORD                 ANALYST                  3000 RESEARCH                              47566 JONES                MANAGER                  2975 RESEARCH                              47698 BLAKE                MANAGER                  2850 SALES                                 47782 CLARK                MANAGER                  2450 ACCOUNTING                            47499 ALLEN                SALESMAN                 1600 SALES                                 37844 TURNER               SALESMAN                 1500 SALES                                 37934 MILLER               CLERK                    1300 ACCOUNTING                            27654 MARTIN               SALESMAN                 1250 SALES                                 27521 WARD                 SALESMAN                 1250 SALES                                 27900 JAMES                CLERK                     950 SALES                                 17369 SMITH                CLERK                     800 RESEARCH                              1已选择 12 行。在 emp 基本信息表中,有员工姓名、员工职位、入职日期等。如果现在把这 3 个 字段显示在同一个字段中,并且中间有分割符。
例如,现在想显示的结果为“SMITH 的岗位是 CLERK, 入职日期是 1980-12-27”
其实,这是比较简单的,我们可以在 select查询语句中,利用连接符把这些字段连接起来
SQL> select ename || '的岗位是' ||job||'入职日期是'||to_char(hiredate,'yyyy-mm-dd')2  from emp;ENAME||'的岗位是'||JOB||'入职日期是'||TO_CHAR(HIREDATE,'YYYY-MM-DD')
----------------------------------------------------------------------------------------------------------------
SMITH的岗位是CLERK入职日期是1980-12-17
ALLEN的岗位是SALESMAN入职日期是1981-02-20
WARD的岗位是SALESMAN入职日期是1981-02-22
JONES的岗位是MANAGER入职日期是1981-04-02
MARTIN的岗位是SALESMAN入职日期是1981-09-28
BLAKE的岗位是MANAGER入职日期是1981-05-01
CLARK的岗位是MANAGER入职日期是1981-06-09
KING的岗位是PRESIDENT入职日期是1981-11-17
TURNER的岗位是SALESMAN入职日期是1981-09-08
JAMES的岗位是CLERK入职日期是1981-12-03
FORD的岗位是ANALYST入职日期是1981-12-03
MILLER的岗位是CLERK入职日期是1982-01-23
HELLO的岗位是入职日期是已选择 13 行。也就是说,我们在平时查询中,可以利用“||”连接符把一些相关的字段连接起来。这在报表视图中非常有用。而且,利用连接符还可以在字段中间加入一些说明性的文字,以方便大家阅读。这些使用连接符的方法可以大大提高内容的可读性。这也是我们在数据库设计过程中需要关注的一个内容
