`
jinyanliang
  • 浏览: 303989 次
  • 性别: Icon_minigender_1
  • 来自: 河南开封
社区版块
存档分类
最新评论

db2中的连接查询,内连接、外连接、交叉连接

阅读更多
DB2 连接查询的学习:
[size=large]



首先创建三个表 student(id integer not null,name varchar(32),sex integer) ;

                            score(name varchar(32),score decimal);

                            grade(score double,grade varchar(2));

       学生表,分数表,等级表。




db2 => select * from student

ID          NAME                             SEX
----------- -------------------------------- -----------
          1 xiaoming                                   1
          2 vicky                                      1
          3 xiaohong                                   0
          4 xiaogang                                   1
          5 linlin                                     0
          6 xiaoyue                                    0
          7 manman                                     0
          8 penpen                                     1
          9 hanghang                                   1
         10 bingbing                                   0

  10 条记录已选择。






db2 => select * from score

NAME                             SCORE
-------------------------------- -------
xiaoming                           81.00
vicky                             100.00
xiaohong                           90.00
xiaoli                             90.00

  4 条记录已选择。



db2 => select * from grade

SCORE   GRADE
-------    -----
100.00  A
  90.00  B
  80.00  C
  60.00  D
   0.00   X

  5 条记录已选择。








连接查询开始



1.       查询出student 和 score 相同姓名的所有列。要求只列出完全相同的列。

内连接:

select s.id,s.name,s.sex,c.score from student s inner join score c on s.name = c.name

此时外表是基表 即 from后的student表是基表。

db2 => select s.id,s.name,s.sex,c.score from student s inner join score c on s.name = c.name

ID          NAME                             SEX         SCORE
----------- -------------------------------- ----------- -------
          1 xiaoming                                 1     81.00
          2 vicky                                      1     100.00
          3 xiaohong                                 0     90.00

  3 条记录已选择。





或者使用where 连接:

select s.id,s.name,s.sex,c.score from student s,score c where s.name = c.name



db2 => select s.id,s.name,s.sex,c.score from student s,score c where s.name = c.name

ID          NAME                             SEX         SCORE
----------- -------------------------------- ----------- -------
          1 xiaoming                                   1   81.00
          2 vicky                                      1  100.00
          3 xiaohong                                   0   90.00

  3 条记录已选择。





2.       外连接查询:

左连接:

select s.id,s.name,c.name,c.score from student s left join score c on s.name = c.name

首先看一下上面的sql。



db2 => select s.id,s.name,c.name,c.score from student s left join score c on s.name = c.name

ID          NAME                             NAME                             SCORE
----------- -------------------------------- -------------------------------- -------
          1 xiaoming                         xiaoming                           81.00
          2 vicky                            vicky                             100.00
          3 xiaohong                         xiaohong                           90.00
          4 xiaogang                         -                                      -
          5 linlin                           -                                      -
          6 xiaoyue                          -                                      -
          7 manman                           -                                      -
          8 penpen                           -                                      -
          9 hanghang                         -                                      -
         10 bingbing                         -                                      -

  10 条记录已选择。



            

        左连接查询本质是以左边的表,即from后面的表为主要基表查询的。从上面的结果可以看到,左表中的数据全部都查了出来,右边的表中只有有符合 on 后条件的有对应的都列了出来,右表中没有对应左表的数据就补空。即null 。

        再看这一句

        select * from student s left join score c on s.name = c.name where s.id<5



db2 => select * from student s left join score c on s.name = c.name where s.id<5

ID          NAME                             SEX         NAME                             SCORE
----------- -------------------------------- ----------- -------------------------------- -------
          1 xiaoming                                   1 xiaoming                           81.00
          2 vicky                                      1 vicky                             100.00
          3 xiaohong                                   0 xiaohong                           90.00
          4 xiaogang                                   1 -                                      -

  4 条记录已选择。







和上面类似。Where条件句中规定了主表的条件。



还有,where条件句子也可以规定右表的条件。

如:select * from student s left join score c on s.name = c.name where c.score>80



db2 => select * from student s left join score c on s.name = c.name where c.score>80

ID          NAME                             SEX         NAME                             SCORE
----------- -------------------------------- ----------- -------------------------------- -------
          1 xiaoming                                1    xiaoming                           81.00
          2 vicky                                      1    vicky                             100.00
          3 xiaohong                               0    xiaohong                           90.00

  3 条记录已选择。





同样也会有3条符合的数据列出。但是遍历查询 score 表会发现,

db2 => select * from score

NAME                             SCORE
-------------------------------- -------
xiaoming                           81.00
vicky                             100.00
xiaohong                           90.00
xiaoli                             90.00

  4 条记录已选择。





name = xiaoli的条目没有列出。这就是因为基表 左表 中没有这一条主记录。



同样的更深刻一点,像这个sql语句:



select s.id,s.name,c.name,c.score from student s left join score c on s.name = c.name where s.id > 3



db2 => select s.id,s.name,c.name,c.score from student s left join score c on s.name = c.name where s.id > 3

ID          NAME                             NAME                             SCORE
----------- -------------------------------- -------------------------------- -------
          4 xiaogang                         -                                      -
          5 linlin                           -                                      -
          6 xiaoyue                          -                                      -
          7 manman                           -                                      -
          8 penpen                           -                                      -
          9 hanghang                         -                                      -
         10 bingbing                         -                                      -

  7 条记录已选择。





更加证明只要基表 左表 中有符合where 条件的条目就会列出,右表中是否有对应的记录是无关紧要的。这在很多特殊应用的时候都是很有用的哦。

还有这个看看:

select * from student s left join score c on s.name = c.name where c.name = 'xiaoli'



db2 => select s.id,s.name,c.name,c.score from student s left join score c on s.name = c.name where c.name = 'xiaoli'

ID          NAME                             NAME                             SCORE
----------- -------------------------------- -------------------------------- -------

  0 条记录已选择。





select * from score where name = 'xiaoli'



db2 => select * from score where name = 'xiaoli'

NAME                             SCORE
-------------------------------- -------
xiaoli                             90.00

  1 条记录已选择。







为什么第一句没有查询出记录?还是那句话,左连接是以左表为基表的。基表中没有的记录,是根本查不到的。

那换成右连接就有了吗?我们来试试。



select * from student s right join score c on s.name = c.name where c.name = 'xiaoli'



db2 => select s.id,s.name,c.name,c.score from student s right join score c on s.name = c.name where c.name = 'xiaoli'

ID          NAME                             NAME                             SCORE
----------- -------------------------------- -------------------------------- -------
          - -                                xiaoli                             90.00

  1 条记录已选择。







效果是立竿见影的。呵呵。融会贯通一下吧,右跟左是一样的,自己多试试就能掌握他们了。



还有一种叫全外连接,也叫交叉连接。

select s.id,s.name,c.name,c.score from student s full outer join score c on s.name = c.name





db2 => select s.id,s.name,c.name,c.score from student s full outer join score c on s.name = c.name

ID          NAME                             NAME                             SCORE
----------- -------------------------------- -------------------------------- -------
          1 xiaoming                         xiaoming                           81.00
          2 vicky                            vicky                             100.00
          3 xiaohong                         xiaohong                           90.00
          - -                                xiaoli                             90.00
          4 xiaogang                         -                                      -
          5 linlin                           -                                      -
          6 xiaoyue                          -                                      -
          7 manman                           -                                      -
          8 penpen                           -                                      -
          9 hanghang                         -                                      -
         10 bingbing                         -                                      -

  11 条记录已选择。



效果就等于是把左连接和右连接合到一块。不加where的时候,就是把两个表的条目都列出来,没有对应的条目,左右都可以 空 出来为null。

加个where试试:

本人的理解,

用左连接和右连接以及交叉连接的时候,你先不要带 where 条件句。试一下,查询出来的东西,就把他当作是一个视图。然后你再加where 条件的时候,其实就跟从这张视图中 查询数据是一样的。

就像这两句一样:

select s.id,s.name,c.name,c.score  from student s full outer join score c on s.name = c.name where

s.id is null



db2 => select s.id,s.name,c.name,c.score  from student s full outer join score c on s.name = c.name where s.id is null

ID          NAME                             NAME                             SCORE
----------- -------------------------------- -------------------------------- -------
          - -                                xiaoli                             90.00

  1 条记录已选择。







select s.id,s.name,c.name,c.score  from student s full outer join score c on s.name = c.name where c.name is null



db2 => select s.id,s.name,c.name,c.score  from student s full outer join score c on s.name = c.name where c.name is null

ID          NAME                             NAME                             SCORE
----------- -------------------------------- -------------------------------- -------
          4 xiaogang                         -                                      -
          5 linlin                           -                                      -
          6 xiaoyue                          -                                      -
          7 manman                           -                                      -
          8 penpen                           -                                      -
          9 hanghang                         -                                      -
         10 bingbing                         -                                      -

  7 条记录已选择。



看看结果就明白了。



下面看看这个sql:





select s1.id,s1.name,s2.id,s2.name,s3.id,s3.name from student s1 left join student s2 on s1.id = (s2.id-1) left join student s3 on s2.id = (s3.id-1)

执行一下上面的sql:







db2 => select s1.id,s1.name,s2.id,s2.name,s3.id,s3.name from student s1 left join student s2 on s1.id = (s2.id-1) left join student s3 on s2.id = (s3.id-1)

ID          NAME                             ID          NAME                             ID          NAME
----------- -------------------------------- ----------- -------------------------------- ----------- --------------------------------
          1 xiaoming                                   2 vicky                                      3 xiaohong
          2 vicky                                      3 xiaohong                                   4 xiaogang
          3 xiaohong                                   4 xiaogang                                   5 linlin
          4 xiaogang                                   5 linlin                                     6 xiaoyue
          5 linlin                                     6 xiaoyue                                    7 manman
          6 xiaoyue                                    7 manman                                     8 penpen
          7 manman                                     8 penpen                                     9 hanghang
          8 penpen                                     9 hanghang                                  10 bingbing
          9 hanghang                                  10 bingbing                                   - -
         10 bingbing                                   - -                                          - -

  10 条记录已选择。





这有什么用呢?

看看加一个where后的效果。

select s1.id,s1.name,s2.id,s2.name,s3.id,s3.name from student s1 left join student s2 on s1.id = (s2.id-1) left join student s3 on s2.id = (s3.id-1) where mod(s1.id,3) = 1;

效果如下:



db2 => select s1.id,s1.name,s2.id,s2.name,s3.id,s3.name from student s1 left join student s2 on s1.id = (s2.id-1) left join student s3 on s2.id = (s3
id-1) where mod(s1.id,3) = 1

ID          NAME                             ID          NAME                             ID          NAME
----------- -------------------------------- ----------- -------------------------------- ----------- --------------------------------
          1 xiaoming                                   2 vicky                                      3 xiaohong
          4 xiaogang                                   5 linlin                                     6 xiaoyue
          7 manman                                     8 penpen                                     9 hanghang
         10 bingbing                                   - -                                          - -

  4 条记录已选择。





这样就实现了把一张表的数据 以 横排三列的形式展现了出来。

这种形式,在很多时候还是颇为有用的。比如曾经遇到过用ireport做jasper的时候,就需要这么来展现。因为ireport的detail 区是只支持向下遍历的,用户如果需要这样的三列相连的话,用这个sql就非常有用了。

当然你也可以用这个,

select s1.id,s1.name,s2.id,s2.name,s3.id,s3.name from student s1,student s2,student s3 where mod(s1.id,3)=1 and mod(s2.id,3)=2 and mod(s3.id,3)=0 and s1.id = s2.id-1 and s2.id = s3.id-1


db2 => select s1.id,s1.name,s2.id,s2.name,s3.id,s3.name from student s1,student s2,student s3 where mod(s1.id,3)=1 and mod(s2.id,3)=2 and mod(s3.id,3)
=0 and s1.id = s2.id-1 and s2.id = s3.id-1

ID          NAME                             ID          NAME                             ID          NAME
----------- -------------------------------- ----------- -------------------------------- ----------- --------------------------------
          1 xiaoming                                   2 vicky                                      3 xiaohong
          4 xiaogang                                   5 linlin                                     6 xiaoyue
          7 manman                                     8 penpen                                     9 hanghang

  3 条记录已选择。




但是发现没有?最后的id=10 没有了。因为没有用外连接,所以是不会有空行的。[/size]
分享到:
评论

相关推荐

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

    db2 IBM DB2在企业级的应用最为广泛, 在全球的500家最大的企业中,几乎85%以上用DB2数据库服务器。收费 大型企业 Access 微软 Access是一种桌面数据库,只适合数据量少的应用,在处理少量 数据和单机访问的数据库时...

    SQL语法大全

    1. ASP与Access数据库连接: dim conn,mdbfile mdbfile=server.mappath("数据库名称.mdb") set conn=server.createobject("adodb.connection") conn.open "driver={microsoft access driver (*.mdb)};uid=admin;...

    程序员的SQL金典.rar

     7.4 交叉连接  7.5 自连接  7.6 外部连接  7.6.1 左外部连接  7.6.2 右外部连接  7.6.3 全外部连接 第8章 子查询  8.1 子查询入门  8.1.1 单值子查询  8.1.2 列值子查询  8.2 SELECT列表中的标量子查询 ...

    程序员的SQL金典6-8

     7.4 交叉连接  7.5 自连接  7.6 外部连接  7.6.1 左外部连接  7.6.2 右外部连接  7.6.3 全外部连接 第8章 子查询  8.1 子查询入门  8.1.1 单值子查询  8.1.2 列值子查询  8.2 SELECT列表中的标量子查询 ...

    程序员的SQL金典7-8

     7.4 交叉连接  7.5 自连接  7.6 外部连接  7.6.1 左外部连接  7.6.2 右外部连接  7.6.3 全外部连接 第8章 子查询  8.1 子查询入门  8.1.1 单值子查询  8.1.2 列值子查询  8.2 SELECT列表中的标量子查询 ...

    程序员的SQL金典3-8

     7.4 交叉连接  7.5 自连接  7.6 外部连接  7.6.1 左外部连接  7.6.2 右外部连接  7.6.3 全外部连接 第8章 子查询  8.1 子查询入门  8.1.1 单值子查询  8.1.2 列值子查询  8.2 SELECT列表中的标量子查询 ...

    程序员的SQL金典4-8

     7.4 交叉连接  7.5 自连接  7.6 外部连接  7.6.1 左外部连接  7.6.2 右外部连接  7.6.3 全外部连接 第8章 子查询  8.1 子查询入门  8.1.1 单值子查询  8.1.2 列值子查询  8.2 SELECT列表中的标量子查询 ...

    dbvis_windows-x64_9_1_5

    DbVisualizer是一个完全基于JDBC的跨平台数据库管理工具,内置SQL语句编辑器(支持语法高亮),凡是具有JDBC数据库接口的数据库都可以管理,已经在Oracle, Sybase, DB2, MySQL, InstantDB, Cloudcape, HyperSonic ,...

    什么是服务器HA技巧.pdf

    HA 集群系统硬件拓扑形式 基于共享磁盘的 HA 集群系统通过共享盘柜实现集群中各节 点的数据共享,包含主服务器、从服务器、存储阵列三种主要设 备,以及设备间的心跳连接线。 而基于磁盘镜像的 HA 集群系统不包含...

    dbvis_windows-x64_9_0_6.zip

    DbVisualizer是一个完全基于JDBC的跨平台数据库管理工具,内置SQL语句编辑器(支持语法高亮),凡是具有JDBC数据库接口的数据库都可以管理,已经在Oracle, Sybase, DB2, MySQL, InstantDB, Cloudcape, HyperSonic ,...

    dbvis_windows_9_0_6.exe

    DbVisualizer是一个完全基于JDBC的跨平台数据库管理工具,内置SQL语句编辑器(支持语法高亮),凡是具有JDBC数据库接口的数据库都可以管理,已经在Oracle, Sybase, DB2, MySQL, InstantDB, Cloudcape, HyperSonic ,...

    数据库工具DbVisualizerPro12.1.5 x86/x64 支持Oracle SQLServer MySQL等

    DbVisualizer是一个完全基于JDBC的跨平台数据库管理工具,内置SQL语句编辑器(支持语法高亮),凡是具有JDBC数据库接口的数据库都可以管理,已经在Oracle, Sybase, DB2, MySQL, InstantDB, Cloudcape, HyperSonic ,...

    DbVisualizerPro 12.0.7 x86/x64 支持Oracle SQLServer MySQL 等多数据库

    DbVisualizer是一个完全基于JDBC的跨平台数据库管理工具,内置SQL语句编辑器(支持语法高亮),凡是具有JDBC数据库接口的数据库都可以管理,已经在Oracle, SQLServer, Sybase, DB2, MySQL, InstantDB, Cloudcape, ...

    dbvisualizer 9.1.0 Pro版 绿色免安装破解版

    DbVisualizer是一个完全基于JDBC的跨平台数据库管理工具,内置SQL语句编辑器(支持语法高亮),凡是具有JDBC数据库接口的数据库都可以管理,已经在Oracle, Sybase, DB2, MySQL, InstantDB, Cloudcape, HyperSonic ,...

    dbvisualizer.10.0.20.zip

    Dbvisualizer是一个很优秀的JDBC调试工具,免费的噢(要破解) ...允许通过JDBC的驱动同时连接各种不同的数据库(包括Oracle,Sybase,DB2,MySQL,InstantDB,Cloudcape, HyperSonic,Mimer SQL等多种数据库);

    阐述大型数据库系统安全风险及策略.docx

    (5)DB2:支持异种网络连接。与此同时,随着计算机网络水平的不断提高,数据库攻击者的手段也更加先进,这就要求必须采取严格、有效的措施来防范数据库安全风险,避免给企业或者用户造成损失。为实现这种目的,下面...

    SAP R/3 事务码速查手册SAP R/3 事务码速查手册

    19.6.4 BC-DB-DB2 DB2 for OS/390 370 19.7 BC-FES-GUI 图形用户接口 370 19.7.1 BC-FES-GRA 图形 371 19.7.2 BC-FES-DEI 桌面集成 371 19.7.3 BC-FES-INS 前端安装 372 19.7.4 BC-FES-SEM 会议经理 372 19.8 BC-DWB...

Global site tag (gtag.js) - Google Analytics