Oracle学习(五):多表查询

1.知识点:能够对比以下的录屏进行阅读

SQL> --等值连接
SQL> --查询员工信息: 员工号 姓名 月薪  部门名称
SQL> select empno,ename,sal,dname
  2  from emp,dept
  3  where emp.deptno=dept.deptno;

SQL> --不等值连接
SQL> --查询员工信息: 姓名 月薪  工资级别
SQL> select ename,sal,grade
  2  from emp e,salgrade s
  3  where e.sal between s.losal and s.hisal;

SQL> --外连接
SQL> -- 外连接解决的问题:当条件不成立时。任然希望在结果中包括不成立的记录
SQL> -- 左外连接: where d.deptno=e.deptno 当不成立时,等号左边代表的表的信息任然被包括
SQL> --         写法: where d.deptno=e.deptno(+)
SQL> -- 右外连接: where d.deptno=e.deptno 当不成立时,等号右边代表的表的信息任然被包括
SQL> --         写法:where d.deptno(+)=e.deptno
SQL> --按部门统计员工人数: 部门号  部门名称  人数
SQL> --错误的列子:没有员工的部门,没有显示
SQL> select d.deptno,d.dname,count(e.empno)
  2  from dept d,emp e
  3  where d.deptno=e.deptno
  4  group by d.deptno,d.dname;
SQL> --上面这个样例改正版:使用了左外连接
SQL> select d.deptno,d.dname,count(e.empno)
  2  from dept d,emp e
  3  where d.deptno=e.deptno(+)
  4  group by d.deptno,d.dname;

SQL> --自连接
SQL> --查询员工信息:***的老板是***
SQL> select e.ename||‘的老板是‘||b.ename
  2  from emp e,emp b
  3  where e.mgr=b.empno;
SQL> --核心:利用表的别名。将同一张表视为多张表

SQL> --使用层次查询的原因:自连接不太适合操作大表
SQL> --层次查询:对同一张表的前后两次操作,进行连接
SQL> --层次查询:遍历一棵树
SQL> select level,empno,ename,mgr	--level:伪列,Oracle自己主动加上的列。在层次查询中表示节点的深度
  2  from emp
  3  connect by prior empno=mgr	--连接条件:上一次查询的empno = 下一次查询的mgr
  4  start with mgr is null	--从根開始遍历整个树(在这个样例中,根即为老板号为空)
  5  order by 1;

2.在Sqlplus下实际运行的结果录屏:

SQL> host cls

SQL> --等值连接
SQL> --查询员工信息: 员工号 姓名 月薪  部门名称
SQL> desc dept
 名称                                                                                是否为空? 类型
 ----------------------------------------------------------------------------------- -------- --------------------------------------------------------
 DEPTNO                                                                              NOT NULL NUMBER(2)
 DNAME                                                                                        VARCHAR2(14)
 LOC                                                                                          VARCHAR2(13)

SQL> select empno,ename,sal,dname
  2  from emp,dept
  3  where emp.deptno=dept.deptno;

     EMPNO ENAME        SAL DNAME
---------- ---------- ----- --------------
      7369 SMITH        800 RESEARCH
      7499 ALLEN       1600 SALES
      7521 WARD        1250 SALES
      7566 JONES       2975 RESEARCH
      7654 MARTIN      1250 SALES
      7698 BLAKE       2850 SALES
      7782 CLARK       2450 ACCOUNTING
      7788 SCOTT       3000 RESEARCH
      7839 KING        5000 ACCOUNTING
      7844 TURNER      1500 SALES
      7876 ADAMS       1100 RESEARCH                                                                                                                  

     EMPNO ENAME        SAL DNAME
---------- ---------- ----- --------------
      7900 JAMES        950 SALES
      7902 FORD        3000 RESEARCH
      7934 MILLER      1300 ACCOUNTING                                                                                                                

已选择14行。

SQL> ed
已写入 file afiedt.buf

  1  select empno,ename,sal,dname
  2  from emp e,dept d
  3* where e.deptno=d.deptno
SQL> /

     EMPNO ENAME        SAL DNAME
---------- ---------- ----- --------------
      7369 SMITH        800 RESEARCH
      7499 ALLEN       1600 SALES
      7521 WARD        1250 SALES
      7566 JONES       2975 RESEARCH
      7654 MARTIN      1250 SALES
      7698 BLAKE       2850 SALES
      7782 CLARK       2450 ACCOUNTING
      7788 SCOTT       3000 RESEARCH
      7839 KING        5000 ACCOUNTING
      7844 TURNER      1500 SALES
      7876 ADAMS       1100 RESEARCH                                                                                                                  

     EMPNO ENAME        SAL DNAME
---------- ---------- ----- --------------
      7900 JAMES        950 SALES
      7902 FORD        3000 RESEARCH
      7934 MILLER      1300 ACCOUNTING                                                                                                                

已选择14行。

SQL> host cls

SQL> --不等值连接
SQL> --查询员工信息: 姓名 月薪  工资级别
SQL> select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
DEPT                           TABLE
EMP                            TABLE
BONUS                          TABLE
SALGRADE                       TABLE                                                                                                                  

SQL> select * from salgrade;

     GRADE      LOSAL      HISAL
---------- ---------- ----------
         1        700       1200
         2       1201       1400
         3       1401       2000
         4       2001       3000
         5       3001       9999                                                                                                                      

SQL> select ename,sal,grade
  2  from emp e,salgrade s
  3  where e.sal between s.losal and s.hisal;

ENAME        SAL      GRADE
---------- ----- ----------
SMITH        800          1
JAMES        950          1
ADAMS       1100          1
WARD        1250          2
MARTIN      1250          2
MILLER      1300          2
TURNER      1500          3
ALLEN       1600          3
CLARK       2450          4
BLAKE       2850          4
JONES       2975          4                                                                                                                           

ENAME        SAL      GRADE
---------- ----- ----------
SCOTT       3000          4
FORD        3000          4
KING        5000          5                                                                                                                           

已选择14行。

SQL> host cls

SQL> --外连接
SQL> --按部门统计员工人数: 部门号  部门名称  人数
SQL> select d.deptno,d.dname,count(e.empno)
  2  from dept d,emp e
  3  where d.deptno=e.deptno
  4  group by d.deptno,d.dname;

    DEPTNO DNAME          COUNT(E.EMPNO)
---------- -------------- --------------
        10 ACCOUNTING                  3
        20 RESEARCH                    5
        30 SALES                       6                                                                                                              

SQL> select * from dept;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON                                                                                                                      

SQL> select * from emp where deptno=40;

未选定行

SQL> /*
SQL> 外连接解决的问题:当条件不成立时。任然希望在结果中包括不成立的记录
SQL> 左外连接: where d.deptno=e.deptno 当不成立时,等号左边代表的表的信息任然被包括
SQL>          写法: where d.deptno=e.deptno(+)
SQL> 右外连接: where d.deptno=e.deptno 当不成立时。等号右边代表的表的信息任然被包括
SQL>          写法:where d.deptno(+)=e.deptno
SQL> */
SQL> select d.deptno,d.dname,count(e.empno)
  2  from dept d,emp e
  3  where d.deptno=e.deptno(+)
  4  group by d.deptno,d.dname;

    DEPTNO DNAME          COUNT(E.EMPNO)
---------- -------------- --------------
        10 ACCOUNTING                  3
        40 OPERATIONS                  0
        20 RESEARCH                    5
        30 SALES                       6                                                                                                              

SQL> ed
已写入 file afiedt.buf

  1  select d.deptno,d.dname,count(e.empno)
  2  from dept d,emp e
  3  where d.deptno=e.deptno(+)
  4  group by d.deptno,d.dname
  5* order by 1
SQL> /

    DEPTNO DNAME          COUNT(E.EMPNO)
---------- -------------- --------------
        10 ACCOUNTING                  3
        20 RESEARCH                    5
        30 SALES                       6
        40 OPERATIONS                  0                                                                                                              

SQL> host cls

SQL> --自连接
SQL> --查询员工信息:***的老板是***
SQL> select * from emp;

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ----- ---------- ----------
      7369 SMITH      CLERK           7902 17-12月-80       800                    20
      7499 ALLEN      SALESMAN        7698 20-2月 -81      1600        300         30
      7521 WARD       SALESMAN        7698 22-2月 -81      1250        500         30
      7566 JONES      MANAGER         7839 02-4月 -81      2975                    20
      7654 MARTIN     SALESMAN        7698 28-9月 -81      1250       1400         30
      7698 BLAKE      MANAGER         7839 01-5月 -81      2850                    30
      7782 CLARK      MANAGER         7839 09-6月 -81      2450                    10
      7788 SCOTT      ANALYST         7566 13-7月 -87      3000                    20
      7839 KING       PRESIDENT            17-11月-81      5000                    10
      7844 TURNER     SALESMAN        7698 08-9月 -81      1500          0         30
      7876 ADAMS      CLERK           7788 13-7月 -87      1100                    20                                                                 

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- -------------- ----- ---------- ----------
      7900 JAMES      CLERK           7698 03-12月-81       950                    30
      7902 FORD       ANALYST         7566 03-12月-81      3000                    20
      7934 MILLER     CLERK           7782 23-1月 -82      1300                    10                                                                 

已选择14行。

SQL> select e.ename||‘的老板是‘||b.ename
  2  from emp e,emp b
  3  where e.mgr=b.empno;

E.ENAME||‘的老板是‘||B.ENAME
----------------------------
FORD的老板是JONES
SCOTT的老板是JONES
JAMES的老板是BLAKE
TURNER的老板是BLAKE
MARTIN的老板是BLAKE
WARD的老板是BLAKE
ALLEN的老板是BLAKE
MILLER的老板是CLARK
ADAMS的老板是SCOTT
CLARK的老板是KING
BLAKE的老板是KING                                                                                                                                     

E.ENAME||‘的老板是‘||B.ENAME
----------------------------
JONES的老板是KING
SMITH的老板是FORD                                                                                                                                     

已选择13行。

SQL> --自连接:利用表的别名,将同一张表视为多张表
SQL> --层次查询
SQL> --自连接不太适合操作大表
SQL>
SQL>
SQL>
SQL> --层次查询:  对同一张表的前后两次操作,进行连接
SQL> select level,empno,ename,mgr
  2  from emp
  3  connect by prior empno=mgr
  4  start with mgr is null
  5  order by 1;

     LEVEL      EMPNO ENAME             MGR
---------- ---------- ---------- ----------
         1       7839 KING
         2       7566 JONES            7839
         2       7698 BLAKE            7839
         2       7782 CLARK            7839
         3       7902 FORD             7566
         3       7521 WARD             7698
         3       7900 JAMES            7698
         3       7934 MILLER           7782
         3       7499 ALLEN            7698
         3       7788 SCOTT            7566
         3       7654 MARTIN           7698                                                                                                           

     LEVEL      EMPNO ENAME             MGR
---------- ---------- ---------- ----------
         3       7844 TURNER           7698
         4       7876 ADAMS            7788
         4       7369 SMITH            7902                                                                                                           

已选择14行。

SQL> spool off
时间: 2024-10-17 05:45:42

Oracle学习(五):多表查询的相关文章

oracle学习之多表查询,子查询以及事务处理

多表查询的基础是采用笛卡尔集: 最终的行数 = 表1的行数 * 表2的行数 最终的列数 = 表1的列数 + 表2的列数 过滤笛卡尔集的关键是写连接条件,N张表至少需要N-1个条件. 多表查询例子1,等值与不等值连接,查询员工信息,员工号,姓名,月薪 和部门名称 注意,有歧义的字段必须指定是哪个表,否则将会报错. 当等值连接不成立的时候,想要保留一边的数据,这时需要使用外连接技术! 左外连接的写法,即想保留等号左边的数据,那么在等号右侧添加(+) 自连接,比如查询员工信息,显示为:xxx's bo

Oracle学习(六):子查询

1.知识点:可以对照下面的录屏进行阅读 SQL> --子查询所要解决的问题:问题不能一步求解 SQL> --查询工资比SCOTT高的员工信息 SQL> --(1)使用普通方法 SQL> --1. SCOTT的工资 SQL> select sal from emp where ename='SCOTT'; SQL> --2. 查询比3000高的员工 SQL> select * 2 from emp 3 where sal>3000; SQL> --(2)

Oracle EBS-SQL (SYS-10):锁定表查询.sql

/*死锁查询-1*/ SELECT o.object_name, l.session_id,l.process, l.locked_mode FROM v$locked_object l , dba_objects o WHERE o.object_id=l.object_id ------------------------------------------------ /*死锁查询-2*/ select GL.SESSION_ID,         do.object_name,     

oracle 常用的系统表查询

(转自:http://blog.csdn.net/marshalchen/article/details/6552103) select * from user_tab_cols where column_name=upper('xxxxx');查询哪些表中有某一列 select status from user_objects where object_name=upper('f_get_multicountry_from_code')  查询过程或函数是否编译完成 alter procedu

Oracle中的多表查询(笛卡尔积原理)

本次预计讲解的知识点 1. 多表查询的操作.限制.笛卡尔积的问题: 2. 统计函数及分组统计的操作: 3. 子查询的操作,并且结合限定查询.数据排序.多表查询.统计查询一起完成各个复杂查询的操作: 一.多表查询的基本概念 在之前所使用的查询操作之中,都是从一张表之中查询出所需要的内容,那么如果现在一个查询语句需要显示多张表的数据,则就必须应用到多表查询的操作,而多表查询的语法如下: SELECT [DISTINCT] * | 字段 [别名] [,字段 [别名] ,-] FROM 表名称 [别名]

oracle数据库之单表查询

作为一合格的测试人员对数据库的单表查询.多表查询.分组查询.子查询等等这些基本查询方法还是要会的.不然到企业中,容易被一些人鄙视,或者说如果数据库学不好,表查不明白,那么对自己能力来说也是一种侮辱,因为你可以证明自己,你是可以的,尤其是你在面试的时候面对面试官的给你出的一道sql语句题目,你能马上用你的套路把这道题做出了,那么恭喜你过了第一个小关卡.ok,我们今天学习一下数据库中的第一个查询,也是最简单,容易入门的查看----单表查询. 我们在上一篇中创建了一个classinfo和student

Oracle学习笔记八 表空间

表空间 表空间是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表, 所以称作表空间 . 分区表 当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区.表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表. 注意:已经存在的表没有方法可以直接转化为分区表 Oracle允许用户将一个表分成多个分区,用户可以执行查询,只访问表中的特定分区,也

Oracle学习——dmp文件(表)导入与导出

前言 关于dmp文件我们用的还是比较多的,dmp文件它是作为oracle导入和导出表使用的文件格式,今天就将dmp文件导出和导入进行学习. dmp文件导出 dmp文件导出用的比较多的一般是三种,他们分别是:导出整个数据库实例下的所有数据.导出指定用户的所有表.导出指定表. 这里已我的数据库为例,进行介绍,我的Oracle数据库实例为"ORACLE",查看自己数据库实例可以从"任务管理器-->服务"中进行查看,如下图 打开命令行: 1,将数据库ORACLE完全导

oracle中的多表查询和子查询以及一些注意事项

多表查询就是使用两张表及其以上的查询.首先需要知道几个名词,笛卡尔积,内连接,外连接,子查询. 1)笛卡尔积 所谓笛卡尔积其实就是两张表数据的条数相乘得到的最后结果,例如表1有10条数据,表2有4条数据,那么经过笛卡尔积之后最后的结果为40条数据,使用笛卡尔积缺点比较多,会产生很多没有用的数据. 2)内连接 内连接分为隐式和显示两种,显示就是使用inner join关键字,而隐式就是使用where关键字,根据关联字段建立的条件,例如where t1.id=t2.id 这就是隐式. 3)外连接 外

Oracle中的多表查询

多表查询 l 笛卡尔积: N*M l 使用关联字段消除笛卡尔积的多余数据: SELECT EMP.*,DEPT.DNAME,DEPT.LOC FROM EMP, DEPT WHERE EMP.DEPTNO=DEPT.DEPTNO; l 多表查询一定要有关联字段 SELECT E.ENAME,E.JOB,E.HIREDATE,D.DEPTNO,D.LOC FROM EMP  E ,DEPT D WHERE E.DEPTNO = D.DEPTNO; l UNION-集合操作 UNION将两个或两个以