目录
查询每个员工的编号、姓名、职位、基本工资、部门名称、部门位置
确定要使用的数据表
确定已知的关联字段
查询每个员工的编号、姓名、职位、基本工资、工资等级
确定要使用的数据表
确定已知的关联字段
查询每个员工的编号、姓名、职位、基本工资、部门名称、工资等级
确定所需要的数据表
确定已知的关联字段
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 行。
也就是说,我们在平时查询中,可以利用“||”连接符把一些相关的字段连接起来。这在报表视图中非常有用。而且,利用连接符还可以在字段中间加入一些说明性的文字,以方便大家阅读。这些使用连接符的方法可以大大提高内容的可读性。这也是我们在数据库设计过程中需要关注的一个内容