`
lushuaiyin
  • 浏览: 674965 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

oracle关键字exists的使用研究(只研究用法)

 
阅读更多

以下实验是本人实际查询结果,结论也是本人自己总结的,结论可能有不对的地方,仅供参考!

/*
首先我们建立3张表lsy_a,lsy_b,lsy_other
其中lsy_a和lsy_b有外键aid关联。lsy_other无关联。
这3张表都有name这一列,并且每张表的name列都有相同的
值和不同的值。
特别要注意lsy_b这张表,它里面有引用lsy_a列的相同的name值分两种情况:
1,外键,name和lsy_a一致
2,外键,name和lsy_a不一致
*/

看看表里的数据吧:

lsy_a

ID NAME ADDRESS
16 samename1 samename1address
17 samename2 samename2address
18 samename3 samename3address
11 a_name_11 a11_address
12 a_name_12 a12_address
13 a_name_13 a13_address
14 a_name_14 a14_address
15 a_name_15 a15_address

lsy_b

ID AID NAME EMAIL
21 11 b_name_21 b21email
22 12 b_name_22 b22email
23 12 b_name_23 b23email
24 11 b_name_24 b24email
25 12 b_name_25 b25email
26 16 samename1 samename26email
27 17 samename2 samename27email
28 11 samename1 samename28email
29 12 samename2 samename29email

lsy_other

ID NAME PHONE
31 other_name_31 other31phone
32 other_name_32 other32phone
33 other_name_33 other33phone
34 other_name_34 other34phone
35 samename1 othersamename35phone
36 samename2 othersamename36phone

看看各种情况下的查询结果,这几个很好理解结果就不贴了:

--1
select * from lsy_a a 
where exists (
  select * from lsy_b b--结果是lsy_a中所有值
)
--1-2
select * from  lsy_b b
where exists (
  select * from lsy_a a--结果是lsy_b中所有值
)
--2
select a.address from lsy_a a 
where exists (
  select * from lsy_b b --结果是lsy_a中所有address这列的值(注意lsy_b无此列)
)
--2-2
select b.email from lsy_b b
where exists (
  select * from  lsy_a a --结果是lsy_b中所有email这列的值(注意lsy_a无此列)
)
--3
select a.* from lsy_a a 
where exists (
  select * from lsy_b b 
  where b.aid=a.id -- 写where条件,才查询出有关联的数据;不写where条件,默认查出所有的值,这和in有区别
)
/*结果lsy_a中有关联的数据被查询出*/

--3-2
select b.* from lsy_b b
where exists (
  select * from  lsy_a a 
  where b.aid=a.id -- 写where条件,才查询出有关联的数据;不写where条件,默认查出所有的值,这和in有区别
)
/*结果lsy_b中所有的数据被查询出,因为lsy_b有外键所以肯定所有数据都有关联*/

--4,下面再在3的基础上改变,看看结果是什么样
select a.address from lsy_a a 
where exists (
  select * from lsy_b b 
  where b.aid=a.id -- 写where条件,才查询出有关联的数据;不写where条件,默认查出所有的值,这和in有区别
)

/*  结果lsy_a中有关联的数据的address列查询出来了,从结果集可以看出
    lsy_a和lsy_b是通过外键aid列关联的!
 */
--4-2
select b.email from  lsy_b b 
where exists (
  select * from lsy_a a
  where b.aid=a.id -- 写where条件,才查询出有关联的数据;不写where条件,默认查出所有的值,这和in有区别
)
/*  结果lsy_b中有关联的数据的email列查询出来了,而lsy_a中根本没有email这一列!
   这有点不好理解,我们翻译一下这个sql成中文就是从b中查询数据,条件b的数据在a中出现。
   那a的列和b的列不对应,那怎样判定条件b的数据在a中出现是否成立呢?我再建一张表lsy_other
   ,其中也有id,name但它是张独立的表,没有外间,和前两张表没关系,只是有两列的名字起得相同而已。
   我们继续研究。
 */

--5
select * from lsy_a a 
where exists (
  select * from lsy_other o--结果是lsy_a中所有值
)
--5-2
select * from lsy_other o
where exists (
  select * from lsy_a a --结果是lsy_other中所有值
)

--6
select * from lsy_a a 
where exists (
  select * from lsy_other o 
  where a.name=o.name --通过name列关联,结果是有相同name的值被查出
)
--6-2
select * from  lsy_other o 
where exists (
  select * from lsy_a a 
  where a.name=o.name  --通过name列关联,结果是有相同name的值被查出
)


下面看几个关键的:

--7
select a.address from lsy_a a 
where exists (
  select * from lsy_other o 
  where a.name=o.name  --通过name列关联,结果是有相同name的address列的值被查出
)


结果集:

ADDRESS
samename1address
samename2address

--7-2
select * from lsy_a a 
where exists (
  select o.phone from lsy_other o  --注意:子查询只有phone这列
  where a.name=o.name  --通过name列关联,结果是有相同name的值被查出
)

结果集:

ID NAME ADDRESS
16 samename1 samename1address
17 samename2 samename2address

--7-3
select a.address from lsy_a a 
where exists (
  select o.phone from lsy_other o  --注意:子查询只有phone这列
  where a.name=o.name  --通过name列关联,结果是有相同name的address列的值被查出
)

结果集:

ADDRESS
samename1address
samename2address

/*
   从结果集我得出以下结论:
   看这样一个形式,
  select 表A的列 from 表A a 
where exists (
  select 表B的列 from 表B b  
  where 表A和表B关联的条件(不一定是外键)
)

1:select 表A的列是最终在结果集你要的列,改查什么就查什么,没什么好说的。
2:在exists中“select 表B的列 from 表B b”根本没什么用!你完全可以随便写一个或多个表B的列,
 它在where条件中没用到照样能查数据,所以这句你可以随便写,一般写成*就行(如7-3)
3:在exists中where条件才是决定这两张表是如何关联的,这个你要小心的写。
4:如果不写where条件,那exists就没有任何意义,它默认查出所有的值!你干脆把exists去掉算了。
总之:exists查询我们可以这样翻译更好理解:
从表A查询表A的某些列作为结果集 ,表A中的每一行数据需要符合这样一个条件:
表A的行和表B的行符合条件 {where 表A和表B关联的条件(不一定是外键)}。
*/


分享到:
评论

相关推荐

    Oracle_Database_11g完全参考手册.part3/3

    附录部分内容丰富、便予参照,包括Oracle命令、关键字、功能以及函数等。 目录 第1部分 关键的数据库概念 第1章 OracleDatabase11g体系结构 1.1 数据库和实例 1.2 数据库技术 1.2.1 存储数据 1.2.2 数据保护 1.2.3...

    Oracle_Database_11g完全参考手册.part2/3

    附录部分内容丰富、便予参照,包括Oracle命令、关键字、功能以及函数等。 目录 第1部分 关键的数据库概念 第1章 OracleDatabase11g体系结构 1.1 数据库和实例 1.2 数据库技术 1.2.1 存储数据 1.2.2 数据保护 1.2.3...

    ORACLE9i_优化设计与系统调整

    §12.5 使用EXISTS和IN 148 §12.6 分离事务(Discrete Transactions ) 149 §12.7 测试SQL语句性能 151 §12.7.1 SQL_Trace实用工具 151 §12.7.2 TKPROF实用程序 151 §12.8 使用SQL_Trace和TKPROF 151 §12.8.1 ...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    其一、就业面广:全球前100强企业99家都在使用ORACLE相关技术,中国政府机构,大中型企事业单位都能有ORACLE技术的工程师岗位。 其二、技术层次深:如果期望进入IT服务或者产品公司(类似毕博、DELL、IBM等),...

    oracle详解

    以下为简要使用步骤,如果想参考详细使用方法,也可以参考ORACLE联机帮助。 1.设置表空间为只读(假定表空间名字为APP_Data 和APP_Index) alter tablespace app_data read only; alter tablespace app_index read ...

    Oracle事例

    关键字(primary key)必须是非空,表中记录的唯一性 not null 非空约束 default 缺省值约束 check 检查约束,使列的值符合一定的标准范围 unqiue 唯一性约束 foreign key 外部键约束 29、查看创建视图的select...

    SQL21日自学通

    在创建索引时使用UNIQUE 关键字214 索引与归并216 群集簇的使用217 总结218 问与答219 校练场219 练习220 第11 天事务处理控制221 目标221 事务控制221 银行应用程序222 开始事务处理223 结束事务处理225 取消...

    C#开发经验技巧宝典

    0842 如何正确地理解和使用SQL中的关键字 503 19.2 比较、逻辑运算符查询 504 0843 如何使用算术运算符号进行比较查询 504 0844 如何使用比较运算符号进行比较查询 504 0845 如何使用AND逻辑运算符查询 ...

    整理后java开发全套达内学习笔记(含练习)

    exist 存在, 发生 [ig'zist] '(SQL关键字 exists) extends (关键字) 继承、扩展 [ik'stend] false (关键字) final (关键字) finally (关键字) fragments 段落; 代码块 ['frægmәnt] FrameWork [java] 结构,...

    精通sql结构化查询语句

    11.1.4 由VALUES关键字插入多行数据 11.1.5 使用SELECT语句插入数据 11.1.6 通过视图插入数据 11.1.7 使用子查询插入数据 11.2 数据的更新操作 11.2.1 UPDATE语句的基本语法 11.2.2 使用UPDATE语句更新指定的列值 ...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例133 使用方法实现线程同步 172 实例134 使用代码块实现线程同步 174 实例135 使用特殊域变量实现线程同步 175 实例136 使用重入锁实现线程同步 176 实例137 使用线程局部变量实现线程同步 177 实例138 简单的...

    2009达内SQL学习笔记

    注意:DESC 关键字只应用到直接位于其前面的列名。如果想在多个列上进行排序,必须对每个列指定DESC关键字。 升序是默认的,可不写,但降序必须写。 六、WHERE子句,选择、过滤 其后只能跟逻辑语句,返回值只有...

    C#编程经验技巧宝典

    24 <br>0050 using关键字的用法 24 <br>0051 变量的作用域 25 <br>2.5 其他 26 <br>0052 有效使用this对象 26 <br>0053 如何声明变量 26 <br>0054 如何声明相同类型的多个变量 26 ...

    PHP基础教程 是一个比较有价值的PHP新手教程!

    以下是可以使用的方法: <script language="php"> . . . 语句 与Perl和C一样,在PHP中用(;)来分隔语句。那些从HTML中分离出来的标志也表示语句的结束。 注释 PHP支持C,C++和Unix风格的注释方式: /* C,...

Global site tag (gtag.js) - Google Analytics