`

Oracle数据库之SQL语句关联查询

阅读更多
--===========表连接=================

drop table a purge;
drop table b purge;
create table a(
 c1 number(4),
 c2 varchar(4)
);
create table b(
 c3 number(4),
 c4 varchar2(10),
 c5 number(4) -- 关联a表
);
insert into a values ( 1,'a');
insert into a values ( 2, '2a');
insert into a values ( 3,'3a');
insert into b values ( 4,'b',1);
insert into b values ( 5, '2b',1);
insert into b values ( 6, '3b',2);
commit;

 

SQL> select * from a;
        C1             C2
        ------    - ----
         1             a
         2             2a
         3             3a
SQL> select * from b;
        C3        C4      C5
        ----- -------  -------
         4           b         1
         5          2b        1
         6          3b        2

 
         
--=========   笛卡尔乘积 :第一个表中的所有行与第二个表中的所有行相连接
-- 笛卡尔集的产生条件:
--省略连接条件
--连接条件无效

 select aa.c1,aa.c2 ,bb.c3,bb.c4,bb.c5 from a aa , b bb ;    -- 结果: 3 * 3 = 9;     
 select aa.c1,aa.c2, bb.c3 ,bb.c4 from a aa cross join  b bb;-- (SQL 99的写法)

 
 --查询每个员工的工号,姓名,工资,部门名和工作地点

select deptno,loc from emp,dept where emp.deptno=dept.deptno order by emp.deptno; -- error deptno 不知道是那个表的列

 
-- 查询时列名前,加表名或表别名前辍(如果字段在两个表中是唯一的可以不加)

select e.deptno,d.loc from emp e,dept d where e.deptno=d.deptno order by e.deptno;--ok
select c1 ,c2 ,c3, c4 from a, b where a.c1 = b.c5;-- ok

 

--借此 提下where字句的执行顺序, where 子句的执行顺序 : 右到左 ,但更深层次的执行顺序是oracle的CBD控制的

Select 'ok' From Dual Where 1 / 0 = 1 And 1 = 2; -- ok
Select 'ok' From Dual Where 1 = 2 And 1 / 0 = 1; -- error

 

--从数据显示方式来讲有:内连接和外连接。
--内连接:只返回满足连接条件的数据。
--外连接:除了返回满足连接条的行以外,还返回左(右)表中,不满足条件的行,称为左(右)连接

--内连接

   

select empno,ename,sal,dname,loc from emp,dept  where emp.deptno=dept.deptno;  --(Oracle 8i 及以前的写法)
 select aa.c1,aa.c2, bb.c3,bb.c4 ,bb.c4 from a aa, b bb where aa.c1 = bb.c5;

 
 --测试语句: a中的c5, b中的c6都不存在,执行下面的语句出现 bb.c6不存在
  

  select aa.c1,aa.c2, bb.c3,bb.c4 ,bb.c4 from a aa, b bb where aa.c5 = bb.c6;

   
--内连接(等值连接)的另一种写法:不支持 as 即使:a as aa 是错误的
   

select aa.c1,aa.c2,aa.b1 , bb.c3,bb.c4 from a1 aa join  b1 bb on aa.b1 = bb.c3;-- ok (SQL 99的写法)
 select aa.c1,aa.c2,aa.b1 , bb.c3,bb.c4 from a1 as  aa join  b1 as  bb on aa.b1 = bb.c3;--(不支持 as )

 
--内连接的执行顺序:
-- on t1.c1 = t2.c2; t1驱动,t2匹配(t1匹配,t2驱动结果一样)
--1.从t1读取一条记录,如c1的值r1
--2.根据c1的值到t2表中进行匹配记录,需要编列t2表(第一条记录开始).
----如t2的值r2等于r1.表示两条记录能否匹配上。t1的r1和t2的r2组合起来.
----作为结果集的一条记录,否则检测t2的下一条记录.

--3.按照方法2一次将t2表所有的记录检测一遍,只要匹配就放入结果集中.

--4.从t1表中读取第二条记录,依次重复2,3.产生最终的结果集.
-- 如果内连接有多个记录需要匹配 ,用and连接   on t1.c1 = t2.c1 and t1.c2 = t2.c2;   


    --左外连接      

SELECT table1.column, table2.column   FROM table1, table2 WHERE table1.column = table2.column(+);

 
-- 说明:我们认为 a是驱动表, b是匹配表

select  aa.c1,aa.c2,bb.c3 ,bb.c4 from a aa left join b bb on aa.c1 = bb.c5;--(SQL 99的写法)

 
--执行顺序
--1.从a读取一条记录,如c1的值r1
--2.根据c1的值到b表中进行匹配记录,需要编列b表(第一条记录开始).
--- 如果c5的值r2等于r1.表示两条记录能否匹配上。a的c1,c2 和 b的c3,c4 组合起来.作为结果---集的一条记录,否则检测b的下一条记录.
---按照方法2一次将b表所有的记录检测一遍,只要匹配就放入结果集中.

-- 3.如果 a.的r1记录在b中找不到任何匹配的记录,b表中模拟一条null记录 与a 表中的r1组合起来,放入结果集中.

-- 4.从a表中读取第二条记录,依次重复2,3.产生最终的结果集.


--右外连接

 

--   " + " 在那边 那边就是匹配表.即aa是匹配表

SELECT table1.column, table2.column    FROM table1, table2 WHERE table1.column(+) = table2.column;
select aa.c1,aa.c2,bb.c3,bb.c4 from a aa, b bb where aa.c1(+) = bb.c5; -- (Oracle 8i 及以前的写法)

 

select aa.c1,aa.c2,bb.c3 ,bb.c4 from a aa right join b bb on aa.c1 = bb.c5;--(SQL 99的写法)

--执行分析同上


 --全连接(满连接):结果集= 内连接的结果 + 两个表中不匹配的记录

 select  aa.c1,aa.c2,bb.c3 ,bb.c4 from a aa  full  join b bb on aa.c1 = bb.c5;--(SQL 99的写法)

-- Notice:
-- 如果想增加过滤条件 用  on  xxx  and  xx  = xx;

 select  aa.c1,aa.c2,bb.c3 ,bb.c4 from a aa  lef join b bb on aa.c1 = bb.c5 and bb.c3 = 6;

 
 --执行顺序:
-- 1.先进行on, and 进行过滤.
-- 2. join , on 连接.
-- 3.select结果集

-- 如果想对最终的结果增加过滤,用where字句

select  aa.c1,aa.c2,bb.c3 ,bb.c4 from a aa  lef join b bb on aa.c1 = bb.c5  where aa.c1 != 1;

 --执行顺序:
-- 1.先进行on进行过滤.
-- 2. join , on 连接.
-- 3.where过滤
-- 4select结果集

--综合

select  aa.c1,aa.c2,bb.c3 ,bb.c4 from a aa  lef join b bb on aa.c1 = bb.c5  and bb.c3 = 5 where aa.c1 != 1;

 
 --执行顺序:
-- 1.先进行on,and 进行过滤.
-- 2. join , on 连接.
-- 3.where过滤
-- 4select结果集

 

 

参考:乐沙弥的世界
        

 

分享到:
评论

相关推荐

    Oracle数据库Sql语句详解大全

    写一条SELECT查询语句 在查询中使用表达式、运算符 对空值的处理 对查询字段起别名 查询字段的连接 第二章 条件查询 WHERE条件查询 在查询中使用表达式、运算符 使用LIKE、BETWEEN、IN进行模糊查询 第三章 单行...

    Oracle数据库、SQL

    三、 SQL语句的处理过程 7 3.1 SQL语句处理过程 7 3.2处理一条select语句 7 四、 where子句 8 4.1 where子句后面可以跟什么 8 4.2语法和执行顺序 8 4.3字符串是大小写敏感的,在比较时严格区分大小写 8 4.4 where...

    数据库开发 Oracle数据库 SQL开发教程 第05章 多表连接(共48页).pdf

    数据库开发 Oracle数据库 SQL开发教程 第02章 编写简单的查询语句(共34页).pdf 数据库开发 Oracle数据库 SQL开发教程 第03章 限制数据和对数据排序(共37页).pdf 数据库开发 Oracle数据库 SQL开发教程 第04章 ...

    ORACLE_多表关联_UPDATE_语句

    把其它表作为条件和更新值的更新语句;例如: 两表(多表)关联update -- 仅在where字句中的连接 --这次提取的数据都是VIP,且包括新增的,所以顺便更新客户类别 update customers a -- 使用别名 set customer_type=...

    ORACLE数据库智能化管理系统2012

    本系统可执行SQL分组语句后,再对结果某值代码变为相对应名称,从而提高了数据库对SQL语句执行性能,减轻了因关联表太多查询,造成数据库性能下降带来的负担。 本系统可对执行SQL语句的结果集批量逐行处理多字段值...

    ORACLE数据库智能化管理系统2008演示

    9. 还在为达到求某种数据值需要多表数据关联起来后得到结果重复,想去除多余行值,单独书写的SQL语句又无法解决而频繁手工操作或通过编写软件才能实现想要的结果而烦恼吗? 10. 还在为查看数据库会话情况及死锁情况...

    Oracle数据库优化培训.ppt

    主要介绍与SQL调整有关的内容,内容涉及多个方面: 1.SQL语句执行的过程 2.ORACLE优化器 3.表之间的关联 4.如何得到SQL执行计划 5.如何分析执行计划等内容

    C# 写的数据库查看器 支持SQL2000和oracle10g 高亮语法输入提醒

    6、点击【执行】,进行查询,原则上支持复杂SQL语句,和关联表查询。 7、点击登陆,可以重新指定数据库连接。 8,查询菜单下有个【清理垃圾表】,是针对oracle中的回收站功能设定的,可以删去此方案中回收站中的表...

    Object Browser7.0中文版(ORACLE数据库的开发工具)

    Browser对ORACLE数据库提供了大量图形界面,通过各种充实的功能向ORACLE的开发,维护人员提供非常专业的支持.优良的设计,使其特别适合于大型应用系统的开发,维护及性能优化,提高工作效率. 下面将介绍一些Object&...

    关于Oracle多表连接,提高效率,性能优化操作

    执行路径:ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用:我们发现,单...当你向ORACLE提交一个SQL语句,ORACLE会首先在这块内存中查找相同的语句. 这里需要注明的是,ORACLE对两者采取的是一种严格匹配,要

    经典SQL语句大全

    10、说明:几个简单的基本的sql语句 选择:select * from table1 where 范围 插入:insert into table1(field1,field2) values(value1,value2) 删除:delete from table1 where 范围 更新:update table1 set field1...

    数据库操作语句大全(sql)

    10、说明:几个简单的基本的sql语句 选择:select * from table1 where 范围 插入:insert into table1(field1,field2) values(value1,value2) 删除:delete from table1 where 范围 更新:update table1 set field1...

    经典全面的SQL语句大全

    随机选择数据库记录的方法(使用Randomize函数,通过SQL语句实现)  对存储在数据库中的数据来说,随机数特性能给出上面的效果,但它们可能太慢了些。你不能要求ASP“找个随机数”然后打印出来。实际上常见的解决...

    SQL 优化之 oracle物化视图

    物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。物化视图存储基于远程表的数据,也可以称为快照。

    oracle实验报告

    三、 Oracle数据库数据查询 1、单表查询 2、多表查询 四、 SQL*PLUS常用命令 表1 常用报表格式化名命令 命令 定义 Btitle 为报表的每一页设置底端标题 Column 设置列的标题和格式 Compute 让SQL*PLUS计算各种值 ...

    在oracle 数据库查询的select 查询字段中关联其他表的方法

    在实际开发过程中,特别是在做数据查询的时候,能够根据动态生成的sql语句将查询的结果转化并返回到业务处理逻辑(或页面展示出来)能大大的减轻业务逻辑的处理复杂度。

    oracle查询分页条件通用存储过程

    oracle数据库的查询分页加条件和排序的通用型存储过程,通过将表名以参数的形式传入到存储过程中做到多表通用,也可以是多表关联的sql语句 将其看作一个表也能调用该存储过程,分页只需要传与页数,和每页显示的行数...

    oracle语句优化.docx

    oracle语句优化:多表关联,exists ,in ORACLE对每个SQL都会对其进行分析,占用共享内存,服务器当前性能(共享内存、磁盘文件碎片)、数据库对象(表、索引)统计信息

    基于Oracle的数据库性能优化研究

    通过优化SQL语句效率、扩充高级缓冲区和配置重做日志缓冲区等几个方面介绍了Oracle数据库优化方法,探讨了Oracle如何提高性能优化的措施。通过测试Oracle查询结果表明,经过优化后的Oracle数据库缩短了响应时间,...

    oracle SQL性能优化

    ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等; (5) 在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量 ,建议值为200 (6) ...

Global site tag (gtag.js) - Google Analytics