`

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语句的基本操作详解

    Oracle数据库的SQL语句是数据库管理员和开发人员日常工作中不可或缺的一部分。本文将深入解析Oracle SQL语句的基本操作,帮助初学者更好地理解和应用这些技巧,从而提高数据库查询效率。 首先,理解选择最有效率的...

    基于Oracle数据库的SQL语句优化

    ### 基于Oracle数据库的SQL语句优化 #### 引言 Oracle数据库是由甲骨文公司开发的一款关系型数据库管理系统,在当前的数据库市场中占据着重要的地位。它广泛应用于商业、政府等领域,具备强大的数据处理能力和高效...

    oracle数据库复杂sql语句

    在Oracle数据库中,复杂的SQL语句是处理大量数据、执行高级查询和实现各种业务需求的关键技术之一。本文将根据提供的内容介绍几个典型的复杂SQL应用场景及其具体实现方法。 #### 一、子查询(Subquery) 子查询是...

    Oracle数据库Sql语句详解大全

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

    oracle 查看当前会话执行的sql语句

    在Oracle数据库管理中,有时我们需要了解某个特定会话(Session)正在执行哪些SQL语句。这在性能调优、问题诊断等场景下尤为重要。以下将详细介绍如何通过不同的方法来查看当前会话所执行的SQL语句及相关信息。 ###...

    oracle监听执行sql语句

    在Oracle数据库管理与维护过程中,有时候我们需要了解应用程序正在执行哪些SQL语句,这不仅有助于性能优化,还可以帮助我们诊断潜在的问题。通过监听执行SQL语句的方式,我们可以获取到当前会话正在执行的具体SQL...

    Oracle sql语句多表关联查询

    Oracle SQL 语句多表关联查询是数据库管理系统中的一种常见查询方式,通过了解字符串和数字的比较、分组查询、HAVING 子句、查询顺序、Oracle 中的伪列、子查询和表连接等知识点,可以帮助我们更好地编写 SQL 语句,...

    Oracle数据库、SQL

    Oracle数据库和SQL是数据库管理和数据查询的核心工具。Oracle是一种关系型数据库管理系统(RDBMS),由Oracle公司开发,广泛应用于企业级数据管理。SQL(Structured Query Language)是用于操作数据库的标准语言,...

    ORACLE数据库SQL语句编写优化总结

    下面将对ORACLE数据库SQL语句编写优化进行详细的总结。 首先,选择适合的ORACLE优化器至关重要。ORACLE提供了三种优化器模式:RULE(基于规则)、COST(基于成本)和CHOOSE(选择性)。在实际应用中,数据库管理员...

    oracle 数据库 scott.sql 范例表

    Oracle数据库是世界上最广泛使用的数据库管理系统之一,尤其在企业级应用中占据重要地位。"scott.sql"是一个典型的Oracle数据库示例脚本,它包含了著名的"SCOTT"用户的表和相关数据,这个用户是为了教学和演示目的而...

    oracle消耗资源的sql查询语句记录

    在Oracle数据库管理中,监控和优化SQL查询是确保系统性能稳定的关键环节之一。对于那些消耗大量资源的SQL语句进行记录和分析可以帮助DBA快速定位问题并采取相应的优化措施。本文将详细介绍如何通过特定的SQL查询来找...

    Oracle常用SQL查询语句

    根据提供的信息,我们可以总结出以下Oracle数据库中常用的SQL查询语句及它们的功能: ### 1. 查询表空间及其总大小 ...以上查询涵盖了Oracle数据库管理中常用的一些SQL语句,对于日常维护和性能调优非常有帮助。

    Oracle批处理:使用C# 自带Oracle驱动一次执行多条Sql语句

    Oracle批处理是数据库操作中提高效率的重要手段,尤其是在C#编程环境下,利用Oracle的数据驱动进行批处理,可以显著提升大量SQL语句执行的速度。本文将深入探讨如何在C#中利用Oracle自带的驱动来实现批处理,以一次...

    Oracle数据库SQL优化总结

    Oracle数据库SQL优化是一个关键的技能,对于提升数据库性能和应用响应速度至关重要。以下是一些针对非DBA的Oracle SQL优化技巧: 1. **选择最有效的表名顺序**:在FROM子句中,应将记录最少的表放在最前面,基础表...

    省市县oracle数据库sql

    正确使用SQL语句和约束可以有效防止数据冗余,提高数据查询效率,并确保数据的一致性和完整性。在实际应用中,还应考虑数据安全、性能优化和错误处理等问题,以实现更高效、稳定和安全的数据库管理系统。

    (C#)Oracle数据库操作类(操作sql语句)

    总结来说,OracleHelper类提供了一种方便的方式来执行Oracle数据库的各种操作,包括非查询操作(修改数据)和事务处理,通过使用`OracleCommand`和`OracleParameter`对象来构建和执行SQL语句。这对于任何需要与...

    Oracle高效SQL语句原则

    Oracle 高效 SQL 语句原则是指在编写 Oracle 数据库 SQL 语句时需要遵循的一些基本原则,以便提高 SQL 语句的执行效率,减少数据库服务器的负载,提高应用程序的性能。下面是 Oracle 高效 SQL 语句原则的详细介绍: ...

Global site tag (gtag.js) - Google Analytics