目录
查询每个员工的编号、姓名、职位、基本工资、部门名称、部门位置
确定要使用的数据表
确定已知的关联字段
查询每个员工的编号、姓名、职位、基本工资、工资等级
确定要使用的数据表
确定已知的关联字段
查询每个员工的编号、姓名、职位、基本工资、部门名称、工资等级
确定所需要的数据表
确定已知的关联字段
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.sal
2 from emp e;
EMPNO ENAME JOB SAL
---------- -------------------- ------------------ ----------
7369 SMITH CLERK 800
7499 ALLEN SALESMAN 1600
7521 WARD SALESMAN 1250
7566 JONES MANAGER 2975
7654 MARTIN SALESMAN 1250
7698 BLAKE MANAGER 2850
7782 CLARK MANAGER 2450
7839 KING PRESIDENT 5000
7844 TURNER SALESMAN 1500
7900 JAMES CLERK 950
7902 FORD ANALYST 3000
7934 MILLER CLERK 1300
8989 HELLO
已选择 13 行。
此时数据表 emp 别名命名为 e,并显示出该表每个员工的编号、姓名、职位和基本工资
第二步:查询出每个员工对应的部门信息,需要引入 dept 表(引入表的时候一定要考虑关联) 。这两张表直接可以利用 deptno 字段关联,利用 where子句来消除笛卡尔积
SQL> select e.empno,e.ename,e.job,e.sal,d.dname,d.loc
2 from emp e,dept d
3 where e.deptno=d.deptno;
EMPNO ENAME JOB SAL DNAME LOC
---------- -------------------- ------------------ ---------- ---------------------------- --------------------------
7839 KING PRESIDENT 5000 ACCOUNTING NEW YORK
7782 CLARK MANAGER 2450 ACCOUNTING NEW YORK
7934 MILLER CLERK 1300 ACCOUNTING NEW YORK
7902 FORD ANALYST 3000 RESEARCH DALLAS
7369 SMITH CLERK 800 RESEARCH DALLAS
7566 JONES MANAGER 2975 RESEARCH DALLAS
7900 JAMES CLERK 950 SALES CHICAGO
7844 TURNER SALESMAN 1500 SALES CHICAGO
7654 MARTIN SALESMAN 1250 SALES CHICAGO
7521 WARD SALESMAN 1250 SALES CHICAGO
7499 ALLEN SALESMAN 1600 SALES CHICAGO
7698 BLAKE MANAGER 2850 SALES CHICAGO
已选择 12 行。
二张表通过“e.deptno=d.deptno”进行关联,显示的数据字段增加数据表 dept 中的 dname 和 loc 字段
以上的操作属于之前基本概念的加强,并且给出了明确的关联字段。很多查询是不会明确给出关联字段的
查询每个员工的编号、姓名、职位、基本工资、工资等级
SQL> select * from salgrade;
GRADE LOSAL HISAL
---------- ---------- ----------
1 700 1200
2 1201 1400
3 1401 2000
4 2001 3000
5 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.sal
2 from emp e;
EMPNO ENAME JOB SAL
---------- -------------------- ------------------ ----------
7369 SMITH CLERK 800
7499 ALLEN SALESMAN 1600
7521 WARD SALESMAN 1250
7566 JONES MANAGER 2975
7654 MARTIN SALESMAN 1250
7698 BLAKE MANAGER 2850
7782 CLARK MANAGER 2450
7839 KING PRESIDENT 5000
7844 TURNER SALESMAN 1500
7900 JAMES CLERK 950
7902 FORD ANALYST 3000
7934 MILLER CLERK 1300
8989 HELLO
已选择 13 行。
第二步:增加 salgrade 表,增加了数据表之后就需要引入 where子句消除笛卡尔积
SQL> select e.empno,e.ename,e.job,e.sal,s.grade
2 from emp e,salgrade s
3 where e.sal between s.losal and s.hisal;
EMPNO ENAME JOB SAL GRADE
---------- -------------------- ------------------ ---------- ----------
7369 SMITH CLERK 800 1
7900 JAMES CLERK 950 1
7521 WARD SALESMAN 1250 2
7654 MARTIN SALESMAN 1250 2
7934 MILLER CLERK 1300 2
7844 TURNER SALESMAN 1500 3
7499 ALLEN SALESMAN 1600 3
7782 CLARK MANAGER 2450 4
7698 BLAKE MANAGER 2850 4
7566 JONES MANAGER 2975 4
7902 FORD ANALYST 3000 4
7839 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.sal
2 from emp e;
EMPNO ENAME JOB SAL
---------- -------------------- ------------------ ----------
7369 SMITH CLERK 800
7499 ALLEN SALESMAN 1600
7521 WARD SALESMAN 1250
7566 JONES MANAGER 2975
7654 MARTIN SALESMAN 1250
7698 BLAKE MANAGER 2850
7782 CLARK MANAGER 2450
7839 KING PRESIDENT 5000
7844 TURNER SALESMAN 1500
7900 JAMES CLERK 950
7902 FORD ANALYST 3000
7934 MILLER CLERK 1300
8989 HELLO
已选择 13 行。
第二步:加入部门名称,增加一张表就增加一个条件消除笛卡尔积
SQL> select e.empno,e.ename,e.job,e.sal,d.dname
2 from emp e,dept d
3 where e.deptno=d.deptno;
EMPNO ENAME JOB SAL DNAME
---------- -------------------- ------------------ ---------- ----------------------------
7839 KING PRESIDENT 5000 ACCOUNTING
7782 CLARK MANAGER 2450 ACCOUNTING
7934 MILLER CLERK 1300 ACCOUNTING
7902 FORD ANALYST 3000 RESEARCH
7369 SMITH CLERK 800 RESEARCH
7566 JONES MANAGER 2975 RESEARCH
7900 JAMES CLERK 950 SALES
7844 TURNER SALESMAN 1500 SALES
7654 MARTIN SALESMAN 1250 SALES
7521 WARD SALESMAN 1250 SALES
7499 ALLEN SALESMAN 1600 SALES
7698 BLAKE MANAGER 2850 SALES
已选择 12 行。
第三步:加入工资等级信息,与原始的消除笛卡尔积条件应该同时满足,所以使用 AND 连接
SQL> select e.empno,e.ename,e.job,e.sal,d.dname,s.grade
2 from emp e,dept d,salgrade s
3 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 5
7902 FORD ANALYST 3000 RESEARCH 4
7566 JONES MANAGER 2975 RESEARCH 4
7698 BLAKE MANAGER 2850 SALES 4
7782 CLARK MANAGER 2450 ACCOUNTING 4
7499 ALLEN SALESMAN 1600 SALES 3
7844 TURNER SALESMAN 1500 SALES 3
7934 MILLER CLERK 1300 ACCOUNTING 2
7654 MARTIN SALESMAN 1250 SALES 2
7521 WARD SALESMAN 1250 SALES 2
7900 JAMES CLERK 950 SALES 1
7369 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 行。
也就是说,我们在平时查询中,可以利用“||”连接符把一些相关的字段连接起来。这在报表视图中非常有用。而且,利用连接符还可以在字段中间加入一些说明性的文字,以方便大家阅读。这些使用连接符的方法可以大大提高内容的可读性。这也是我们在数据库设计过程中需要关注的一个内容