在数据库中为什么自然连接比一般连接更具有现实意义?最好能举例说明

解决方案 »

  1.   

    自然连接SQL都没实现,也没有实现的必要。
      

  2.   


    关系数据库中,连接只有3大类:
    1. 笛卡尔积,又称叉积、交叉连接,即CROSS JOIN。
    2. 自然连接,在SQL中以INNER JOIN的方式实现。
    3. 外连接,即OUTER JOIN,分为左、右、全三种。为什么自然连接更具有现实意义?
    试想员工表Employee(#EmpID,EmpName,DepID,...)和部门表Department(#DepID,DepName,...),其中Employee.DepID外键关联到Department.DepID。
    当需要关联员工表和部门表时,自然是希望一个员工对应它所在的部门,而不是所有部门,所以自然连接比笛卡积更有意义。
    关系模型中定义的自然连接,如:
    SELECT * FROM Employee NATURAL JOIN Department (非SQL语法,只是示例)
    表示用员工表中的DepID与部门表关联。这需要数据库引擎知道员工表和部门表的DepID是一个东西(在关系模型中,相同名称的属性表示相同的东西,所以重命名操作也是关系代数中一个必备的运算符)。
    然而SQL为了简化处理,把判断哪个字段是关联字段的任务交给了SQL程序员,即内连接:
    SELECT * FROM Employee e INNER JOIN Department d ON e.DepID = d.DepID外连接本质上是内连接的一种特殊形式。如果关联字段有外键约束,不会有数据不存在的情况,那自然内连接比外连接的使用频率更高。笛卡尔积是内、外连接的逻辑基础。内连接在逻辑上无非是两个表进行笛卡尔积,然后再根据连接条件过滤结果。(特别说明:逻辑过程不等于物理过程)
      

  3.   

    关系模型是数据库理论,SQL是数据库实现。对于计算机科学来说,理论和实现永远是相辅相成的。如果发现某个事物在理论领域存在,在实现领域不存在,(或者相反),不要轻易断言说这个事物没有意义。不妨想一想其存在的理由。相信每个使用SQL的人都或多或少遇到过漏写或错用连接条件,导致查询出不是预期的结果(这就是为什么SELECT * FROM A INNER JOIN B ON A.ID = B.ID的新式语法优于SELECT * FROM A,B WHERE A.ID = B.ID的原因,前者更不容易漏掉连接条件)。关系模型中,每个表(关系)是一个谓词,表的字段(属性)是该谓词涉及的概念,表中的数据表示当前状态下的真命题(对该谓词的真值量化)的集合。一个数据库则是这样一组真命题组成的知识库,表征了当前状态下为真的知识表述。一个查询,则表示根据基础真命题集合可以演绎出的新的真命题集合,而各种选择、投影、连接、聚合,则是可以使用的推理规则。(可参看从关系角度理解SQL一帖,更多内容参看C.J.Date的《深度探索关系数据库》一书)在这种思路下,编写查询(即进行演绎推理)的人只需要关心哪个表和哪个表(自然)连接,而不必操心用哪个字段关联(字段是谓词涉及的概念,系统会知道哪些概念是一致的、用来关联的)。这就是自然连接的意义。然而这种思路只存在于理想的数据库系统,数据库的事实标准SQL语言并非实现这种基于语义的查询机制。(有兴趣的人可以Google一下C.J.Date的Tutorial D语言)SQL用INNER JOIN来实现自然连接的逻辑,虽然是把判断哪个字段是关联字段的任务交给了SQL程序员,然而却带来了更大的灵活性,比如在INNER JOIN的条件中进行单边限制、不等连接、等等。