博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
再说exists 关键字,和inner join 差别大
阅读量:5365 次
发布时间:2019-06-15

本文共 2466 字,大约阅读时间需要 8 分钟。

1.建表

create table CUSTOMERS

(
  CID   NUMBER not null,
  CNAME NVARCHAR2(50) not null
)

create table ORDERS

(
  OID   NUMBER not null,
  ONAME VARCHAR2(50) not null,
  CID   NUMBER
)

2.添加数据

select * from customers;

 CID       CNAME

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

   1          张三

   2          李四
   3          王五

select * from orders;

 
       OID      ONAME            CID
---------- ------------------------ 

         1         订单1               1

         2         订单2               2
         3         订单3               2
         4         订单4               null                            
         5         订单5               4

解释:customers 的主键cid ,是Orders 表中的外键,而orders 表的cid 可以为空,例如订单4的cid 不存在,

另外需要注意的是 在orders表中不是每一条记录的cid ,在客户表customers表中都有对应的值,

例如 订单5 的cid是4,在客户表customers中,就没有cid是4的记录

3.exists 关键自在上述情景下的应用

a.我要查询有订单号的客户信息

select * from customers c where exists (select 1 from orders o where o.cid=c.cid);

 
       CID     CNAME
---------- ----------

         1        张三

         2        李四

只有两条记录 ;

解释 遍历customers的表的每一条记录的时候,把cid 的值 ,传给o.cid, 然后看在orders表中是否存在记录,如果存在 条件为 true,

这样就返回了一条记录。

当在customers 遍历 cid 是1,2 custmers 都有对应的cid,而遍历cid 是3的时候 customers 表中没有对应的记录,返回false

所以一共返回两条记录。

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

b. 查询有客户id 的订单信息

SQL>  select * from orders o where exists (select 1 from customers c where c.cid=o.cid) order by 1;
 
       OID ONAME                                                     CID
---------- -------------------------------------------------- 

         1   订单1                                                       1

         2   订单2                                                       2
         3   订单3                                                       2

解释:查询订单oid 是1,2,3的时候 customers表中都有对应的客户,

而查询到oid 是4 ,5的时候 cid号或者为空,或者在customers表中不存在这条记录,

所以只返回三条记录

4.使用inner join 或“=” 连接两个表的查询

select * from customers c inner join orders o on c.cid = ocid;

   CID   CNAME                    OID        ONAME             CID

---------- ------------------------------------- ----------
     1      张三                      1            订单1                1
     2     李四                       2             订单2               2
     2     李四                       3             订单3               2

查询出来的是3条数据,

和 select * from customers c , orders o where c.cid = o.cid; 查询结果一样

   CID   CNAME                   OID ONAME            CID

    1      张三                         1 订单1                  1
    2      李四                         2 订单2                  2
    2      李四                         3 订单3                  2

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

差别 :你们是否以为 select c.* from customers c where exists (select 1 from orders o where o.cid=c.cid);

和 select c.* from customers c inner join orders o on c.cid=o.cid 的结果集是一样的?

答案是不一样,前者用exists 关键词的时候 返回两条记录,

       CID   CNAME

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

         1     张三

         2     李四

而后者返回了3条记录,

SQL> select c.* from customers c inner join orders o on c.cid=o.cid ;

 
       CID CNAME
---------- --------

         1 张三

         2 李四
         2 李四

当遍历到cid 是2 李四的时候,orders 表中有两条记录和它对应,

一条是 cid 2,cname 是李四 ,oid 是2 ,另一条是 cid 2,cname 是李四 ,oid 是3, 我们只不过是select 的时候 只显示出了cid,和cname,可是查却查出来3条记录,

就算cid 和cname重复了吧,可oid 没有重复

  CID CNAME       OID   ONAME        CID

   2 李四               2     订单2             2

   2 李四               3     订单3             2 

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

或许有一些初学者说不就重复几条数据嘛 这不算什么,可如果在统计分析的时候 一条数据就影响到统计的准确性,如果一条数据的某个值是1000000,

我有对这个字段的所有的字段值求和,而就多了这么一条数据,就多加了10000000,你说影响结果有多大?认真起来大家

 

转载于:https://www.cnblogs.com/qylbg/p/3188542.html

你可能感兴趣的文章
Codeforces Round #413 C. Fountains (线段树的创建、查询、更新)
查看>>
SBuild 0.1.5 发布,基于 Scala 的构建系统
查看>>
WordPress 3.5 RC3 发布
查看>>
DOM扩展札记
查看>>
primitive assembly
查看>>
根据经纬度查询位置百度api
查看>>
浅谈localStorage的用法
查看>>
Ad Exchange基本接口和功能
查看>>
Angular ui-router的常用配置参数详解
查看>>
软考知识点梳理--项目评估
查看>>
把特斯拉送上火星的程序员,马斯克!
查看>>
三测单
查看>>
MyBatis 缓存
查看>>
SQL中left outer join与inner join 混用时,SQL Server自动优化执行计划
查看>>
mac下python实现vmstat
查看>>
jxl.dll操作总结
查看>>
成员函数对象类的const和非const成员函数的重载
查看>>
机器学习实战-----八大分类器识别树叶带源码
查看>>
eclipse git 新的文件没有add index选项
查看>>
java 泛型
查看>>