Oracle学习(5):多表查询

多表查询

连接的类型:

等值连接,不等值连接,外连接,自连接

等值连接

SQL> --等值连接: 查询员工信息:员工号,姓名,薪水和部门名称

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

7900 JAMES      950 SALES

7902 FORD      3000 RESEARCH

7934 MILLER    1300 ACCOUNTING

已选择14行。

SQL> --等值连接: 查询员工信息:员工号,姓名,薪水,部门名称,部门号(两张表都有部门号,会出错)

SQL> ed

已写入 file afiedt.buf

1  select empno,ename,sal,dname,deptno

2  from emp,dept

3* where emp.deptno=dept.deptno

SQL> /

select empno,ename,sal,dname,deptno

*

第 1 行出现错误:

ORA-00918: 未明确定义列

SQL> ed

已写入 file afiedt.buf

1  select e.empno,e.ename,e.sal,d.dname,d.deptno

2  from emp e,dept d

3* where emp.deptno=dept.deptno

SQL> /

where emp.deptno=dept.deptno

*

第 3 行出现错误:

ORA-00904: "DEPT"."DEPTNO": 标识符无效

(解决办法:给每张表起一个别名,然后表明数据是哪一个别名的)

SQL> ed

已写入 file afiedt.buf

1  select e.empno,e.ename,e.sal,d.dname,d.deptno

2  from emp e,dept d

3* where e.deptno=d.deptno

SQL> /

EMPNO ENAME      SAL DNAME              DEPTNO

---------- -------- ----- -------------- ----------

7369 SMITH      800 RESEARCH               20

7499 ALLEN     1600 SALES                  30

7521 WARD      1250 SALES                  30

7566 JONES     2975 RESEARCH               20

7654 MARTIN    1250 SALES                  30

7698 BLAKE     2850 SALES                  30

7782 CLARK     2450 ACCOUNTING             10

7788 SCOTT     3000 RESEARCH               20

7839 KING      5000 ACCOUNTING             10

7844 TURNER    1500 SALES                  30

7876 ADAMS     1100 RESEARCH               20

7900 JAMES      950 SALES                  30

7902 FORD      3000 RESEARCH               20

7934 MILLER    1300 ACCOUNTING             10

已选择14行。

不等值连接

SQL> --不等值连接:查询员工的工资级别

SQL> select * from salgrade;

GRADE      LOSAL      HISAL

---------- ---------- ----------

1        700       1200

2       1201       1400

3       1401       2000

4       2001       3000

5       3001       9999

SQL> select e.ename,e.sal,s.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

SCOTT     3000          4

FORD      3000          4

KING      5000          5

已选择14行。

SQL> host cls

外链接

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                人数

---------- -------------- ----------

10 ACCOUNTING              3

20 RESEARCH                5

30 SALES                   6

(上述结果少一个人数为null的值)

SQL> select count(*) from emp where deptno=10;

COUNT(*)

----------

3

SQL> select count(*) from emp where deptno=20;

COUNT(*)

----------

5

SQL> select count(*) from emp where deptno=30;

COUNT(*)

----------

6

SQL> select * from dept;

DEPTNO DNAME          LOC

---------- -------------- -------------

10 ACCOUNTING     NEW YORK

20 RESEARCH       DALLAS

30 SALES          CHICAGO

40 OPERATIONS     BOSTON

SQL> select count(*) from emp where deptno=40;

COUNT(*)

----------

0

SQL> --希望:在结果中包含某些不成立时的记录

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> 全外连接: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

5  order by 1;

DEPTNO DNAME                人数

---------- -------------- ----------

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

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

JONES的老板是KING

SMITH的老板是FORD

已选择13行。

SQL> --自连接:通过表的别名,将同一张表视为不同的表,再利用别的连接操作

SQL> --自连接一般只适用于小表(因为产生的笛卡尔表数据量太过庞大)

SQL> host cls

层次查询

SQL> --层次查询:只有一张表

SQL> --          同一张表的前后两次操作进行连接

SQL> select level,empno,ename,mgr

2  from emp

3  connect by prior empno=mgr

4  start with mgr is null;

LEVEL      EMPNO ENAME           MGR

---------- ---------- -------- ----------

1       7839 KING

2       7566 JONES          7839

3       7788 SCOTT          7566

4       7876 ADAMS          7788

3       7902 FORD           7566

4       7369 SMITH          7902

2       7698 BLAKE          7839

3       7499 ALLEN          7698

3       7521 WARD           7698

3       7654 MARTIN         7698

3       7844 TURNER         7698

3       7900 JAMES          7698

2       7782 CLARK          7839

3       7934 MILLER         7782

已选择14行。

SQL> ed

已写入 file afiedt.buf

1  select level,empno,ename,mgr

2  from emp

3  connect by prior empno=mgr

4  start with mgr is null

5* order by 1

SQL> /

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

3       7844 TURNER         7698

4       7876 ADAMS          7788

4       7369 SMITH          7902

已选择14行。

SQL> /*

SQL> 第一次:7839

SQL> 第二次:where mgr=7839

SQL>        7566 7698 7782

SQL> 第三次:where mgr in (7566 7698 7782)

SQL> */

SQL> spool off

时间: 2024-08-10 23:17:05

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

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数据库之单表查询

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

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

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

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将两个或两个以