sql数据库开发-10:多表查询2

 

项目案例:

    列出客户姓名以及开通的远程登录业务的数量。

 


from 后面跟子查询

   语法:


select t1.colname1,t1.colname2 from tabname1 t1 join
     (select colname1,AVG(colname2) colname2
          from tabname group by colname1) t2
     on t1.colname1 = t2.colname1
    and  t1.colname2 > t2.colname2;

 


项目案例:

  列出客户姓名以及开通的远程登录业务的数量,用from 后面跟子查询的方式实现。

  列出客户姓名以及他的推荐人。

 

 

 

自连接

    不同表有描述同一属性的列,用 ON tabname1.colname1 = tabname2.colname2 表达,那么同一张表的不同列的取值有相同含义,记录之间的关系又该如何表达 ?


    同一张表的行(记录) 之间的匹配关系可以用同一张表的列之间的条件表达式描述。

    通过给表起别名同一张表的列之间的关系转换成不同表的列之间的条件表达式。

 

 

项目案例:

    哪些客户是推荐人

 

 


外连接
 
    语法:

     select tabname1.colname1,tabname2.colname2 from tabname1
      [left|right|full] join tabname2  on tabname1.colname1 = tabname2.colname2;   

 

 

外连接原理(一)

  t1表和t2表做外连接,连接条件为 :
  from t1 left outer join t2 on t1.c1 = t2.c2, t1表必须做驱动表,t2表做匹配表,
   记录的匹配过程如下:


   1.从t1表中读取 第一条记录r1,若它的c1值为1

   2.根据该值到t2表中查找匹配的记录,即需要遍历t2表,从t2表中的第一条记录开始,若该记录(r1) 的c2列的值等于1,我们就说这两条记录能够匹配上,那么t1的r1和t2的r1组合起来,作为结果集里的一条记录,否则检测t2表中的下一列记录。

   3. 按照方法2依次将t2表中所有的记录检测一遍,只要匹配就放入结果集中,若扫描完后,t1   的r1记录在t2表中找不到任何匹配的记录,t2表中模拟一条null记录与t1表中的r1组合起来,放入结果集中。

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

 

外连接原理(二)
 
     t1表和t2表做外连接,连接条件为
    from t1 left outer join t2 on t1.c1 = t2.c2,t1表必须做驱动表,t2表做匹配表:

  1.外连接的结果集 = 内连接的结果集+t1表中匹配不上的记录和一条null记录(按t2表的结构)的组合

  2.外连接的核心可以将t1中匹配不上的记录(按on条件在t2中找不到对应的匹配记录)找回来,即t1中的记录一个都不少的出现在结果集中

  3.外连接结果集的记录数不一定是驱动表的记录数

 


外连接原理 (三)

  t1表和t2表做外连接,连接条件为
  from t1 right outer join t2 on t1.c1 = t2.c2, t2表必须做驱动表,t1表做匹配表:


 1.外连接的结果集 = 内连接的结果集 + t2表中匹配不上的记录和一条null记录(按t1表的结构)的组合。

 2.外连接和核心可以将t2中匹配不上的记录(按on条件在t1中找不到对应的匹配记录)找回来,即t2中的记录一个都不少的出现在结果集中。

 3.外连接结果集的记录数不一定是驱动表的记录数。

 

外连接原理(四)

   t1表和t2表做外连接,连接条件为
 
   from t1 full outer join t2 on t1.c1 = t2.c2,t2表必须做驱动表,t1表做匹配表:


 1.外连接的结果集 = 内连接的结果集 + t1表中匹配不上的记录和一条null记录(按t2表的结构)
的组合+t2表中匹配不上的记录和一条null记录(按t1表的结构) 的组合。

 
 2.外连接结果集的记录数不一定是t1表和t2表的记录数之和。

 

项目案例:

   列出客户姓名以及他的推荐人

   列出客户姓名以及所开通的远程登录业务的信息(没有申请远程登录业务的客户也要出现在结果集中)

   列出客户姓名以及开通的远程登录业务的数量(结果集中包含所有的客户)


   哪些客户不是推荐人

 

 

 

 

外连接语句的执行顺序

     先将两张表进行外连接操作(join ,on) ,再对外连接的结果集用WHERE子句进行过滤,最后用select语句生成最终结果集 。


  select tabname1.colname1,tabname2.colname from tabname1
     [LEFT | RIGHT | FULL]  join tabname2 on
    tabname1.colname1 = tabname2.colname2
      where filter condition;   

 

 

UNIX服务器信息表结构


desc host

 
name         NULL?     Type
--------------------------------------
      -------

ID       NOT NULL    VARCHRA2(15)
NAME                 VARCHAR2(20)
LOCATION             VARCHAR2(30)

 

 

 


UNIX服务器信息表数据


select * from host;

     ID                    NAME          LOCATION
 192.168.0.26           sunv210           beijing
 192.168.0.20           sun-server        beijing
 192.168.0.23           sun280            beijing
 192.168.0.200          ultra10           beijing

 

项目案例:

   哪些UNIX服务器上没有os账号weixb

 


外连接语句的执行顺序

    ON和WHERE后面都可以跟多个条件表达式,表达式之间用AND连接 。

    先根据ON和AND对要连接的表进行过滤,将过滤后的结果集进行外连接操作(JOIN , ON),再对外连接的结果集用WHERE子句进行过滤,最后用select语句生成最终结果集。


    select tabname1.colname1,tabname2.colname2 from tabname1
      [LEFT | RIGHT | FULL] JOIN tabname2
     on tabname1.colname1 = tabname2.colname2
     and filter condition
     where filter condition;

 

 

年龄分段信息表结构


desc age_segment

Name                  BULL?               Type
----------------------------------------------------
ID               NOT NULL             NUMBER(1)
name             NOT NULL            VARCHAR2(20)
LOWAGE           NOT NULL            NUMBER(2)
HIAGE            NOT NULL            NUMBER(2)

 


年龄分段信息表数据

   select * from age_segment;

  ID     NAME         LOWAGE    HIAGE
  0   少年叛逆期       11        14
  1   少年成长期       15        17
  2   青年青春期       18        28
  3   青年成熟期       29        40
  4   中年壮实期       41        48
  5   中年稳健期       49        55
  6   中年调整期       56        65
  7   老年初老期       66        72

 


非等值连接
 
       不同表没有共同属性的列,但两张表的列可以写成一个SQL条件表达式。

   select tabname1.colname1,tabname2.colname2
     from tabnane1 join tabname2 on tabname1.colname1
    between tabname2.colname2 and tabname3.colname3
   and tabname1.colname2 = val1;


项目案例:

     显示客户的年龄段

     显示客户huangrong 的年龄段
 
     显示各个年龄段不用的客户数(没有客户的年龄段不用出现在结果集中)

     显示各个年龄段的客户数(没有客户的年龄段的客户数为0)

 

 


各类连接的应用场合

    根据结果集生成的规则不同,各类连接的应用场合如下:

 
  交叉连接 (cross join)
     --   笛卡尔积

  内连接 (inner join)
     --   解决匹配问题

  外连接 (outer join)

     --   解决不匹配问题
     --   表的所有记录出现在结果集

 

 

表连接总结

    从结果集的生成规则和连接的表达形式,得出如下结论:

      交叉连接 (cross join)

      内连接  (inner join)

          --   等值连接
          --   非等值连接
          --   自连接


      外连接 (outer join )
 
          --  等值连接
          --  非等值连接
          --  自连接

 

 

 

 

 

 


   

 


   

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慕容屠苏

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值