Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 394|回复: 0

[数据库学习]学习SQL多表连接(1)简单的二表连接

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-31 00:00:43 | 显示全部楼层 |阅读模式
    SQL的一个重要特性就是能够通过JOIN关键词,从多个交叉表中查询、分析数据。如果没有这个特性,那么用户将不得不把与某一应用相关的所有数据存储在同一个表中,导致数据库各表之间会存在大量重复数据。
                                                                                        
    一、 连接表的目的
        在关系数据库中,数据库表设计的一个重要原则就是要避免冗余性。举个例子来讲,比喻有个TEACHER表中, 需要有每个教师包含的课程信息。而如果数据库中还有一个学生表STUDENT,也需要包含每个学生所选的课程的课程信息。这时,就需要把所有
    课程的信息提取出来,单独成为一个表,如COURSE表。

    TEACHER表和STUDENT表中只要加入一列课程代码,与COURSE表中的课程代码相关联即可。这样做主要有两方面的优势。

    较少了冗余信息,节省了数据库存储空间。
       
      
      
      简化了数据修改、维护操作。如果用户要更改某门课程的信息,只需要在COURSE表中修改即可,这样无论是从TEACHER表还是STUDENT表中查询相关的课程信息,查询的结果都是修改后的信息。
      如何能够同时查询TEACHER表和COURSE表的信息呢?这就要用到SQL提供的多表连接功能,在SELECT语句中实现TEACHER表和COURSE表的连接。通过连接,就可以将二者看作是一个表进行处理。 注意 在SELECT语句中实现的多表连接,并不是一个物理存在的实体,换句话说,它在数据库表中并不存在。 它只是由数据库系统在需要的时候创建,只在查询、检索数据期间有效。 二、简单的二表连接
    在SQL中,创建连接非常简单,只需指明需要连接的表及其它们之间的关系即可。
    例表1:(请下载表数据)


    例子表2:
    实例1 简单的二表连接
    如下面的代码: SELECT TNAME, DNAME, CNAME, CTESTFROM TEACHER, COURSEWHERE TEACHER.CNO = COURSE.CNO
      分析一下实例中的代码,SELECT语句中的TMAME和DNAME字段为表TEACHER中的列,CNAME和CTEST字段为表COURSE中的列。而FROM子句中列出了TEACHER和COURSE两个表,它们就是在SELECT语句中需要连接的两个表。WHERE子句则给出了这两个表进行连接所依据的关系,即根据两个表中的课程号CNO进行匹配连接。该实例的执行过程实际上可表示如下。

          系统首先执行FROM子句,这里FROM子句列出的有两个表TEACHER表和COURSE表,DBMS将计算这两个表的笛卡尔积,列出这两个表中行的所有可能组合,形成一个中间表。中间表中的每条记录包含了两个表中的所有行。

        而后系统将执行WHERE子句,根据“TEACHER.CNO = COURSE.CNO”关系对中间表进行搜索,去除那些不满足该关系的记录。
         最后系统执行SELECT语句,从执行WHERE子句后得到的中间表的每条记录中,提取TNAME、DNAME、CNAME和CTEST 4个字段的信息作为结果表。 注意 由于TEACHER表和COURSE表中都存在字段CNO,所以在SELECT语句中用到该字段时,一定要指明其所在的表,如TEACHER.CNO 、COURSE.CNO。而其他具有重名的字段,也要进行同样的处理,否则数据库系统会报错。 这里需要强调一下,表的连接所依据的关系是在WHERE子句中定义的。在实际应用中,用户要实现表的连接必然要依据一定的关系,如例中依据课程号匹配的原则。如果不指明连接关系,即不使用WHERE子句,结果会如何呢?
      实例2 不指明连接关系的二表连接
    如下面的实例代码: SELECT TNAME, DNAME, CNAME, CTEST  FROM TEACHER, COURSE

    运行结果如图所示。

        从结果可以看到,每个课程信息均与所有的教师信息进行了匹配连接。它实际上返回连接表中所有数据行的笛卡尔积,其结果集合中的数据行数是3×4=12条记录,这与前面介绍的二表连接实例的执行过程分析相吻合。

       

       
         
         
          
          

            
          

            
          
         
       

      


    源码下载:http://file.javaxxz.com/2014/10/31/000042734.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-19 02:16 , Processed in 0.378532 second(s), 48 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表