综合练习

目录

查询每个员工的编号、姓名、职位、基本工资、部门名称、部门位置

确定要使用的数据表

确定已知的关联字段

查询每个员工的编号、姓名、职位、基本工资、工资等级

确定要使用的数据表

确定已知的关联字段 

查询每个员工的编号、姓名、职位、基本工资、部门名称、工资等级

确定所需要的数据表

 确定已知的关联字段


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 行。

也就是说,我们在平时查询中,可以利用“||”连接符把一些相关的字段连接起来。这在报表视图中非常有用。而且,利用连接符还可以在字段中间加入一些说明性的文字,以方便大家阅读。这些使用连接符的方法可以大大提高内容的可读性。这也是我们在数据库设计过程中需要关注的一个内容

相关推荐

  1. Sql综合练习

    2024-02-19 14:44:02       11 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-19 14:44:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-19 14:44:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-19 14:44:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-19 14:44:02       18 阅读

热门阅读

  1. 我的创作纪念日

    2024-02-19 14:44:02       28 阅读
  2. P1106 删数问题题解

    2024-02-19 14:44:02       27 阅读
  3. K8S更新部署docker的两种方法举例

    2024-02-19 14:44:02       30 阅读
  4. 设计模式三大原则

    2024-02-19 14:44:02       26 阅读
  5. 设计模式学习笔记 - 学前简述

    2024-02-19 14:44:02       25 阅读
  6. 设计模式的目的

    2024-02-19 14:44:02       28 阅读