sql innersql join on 多表连接结果多倍

了解多表连接查询就需要先了解多表连接查询的原理,通过实例加深认识

多表查询原理:将多个表通过笛卡尔积形成一个虚表,再根据查询条件筛选符合条件的数据

oracle复杂查询参考文档

oracle复杂查询参考文档:

UNION 操作符用于合并两个或多个 SELECT 语句的结果集。

注意:union:用于将不同表中相同的列查询出的数据展礻出来不包括重复数据。(只能查询表中的相同列)

Union all :用于将不同表中相同的列查询出的数据展示出来包括重复数据。(只能查询表Φ的相同列)

3)查询教师学生全部姓名

 因为UNION只会选择不同的值如果学生中和教师中有重名的情况,这就需要

INNER JOIN(内连接:inner可以省略)也稱为自然连接

作用:根据两个或多个表中的列之间的关系,从这些表中查询数据

注意: 内连接是从结果中删除其他被连接表中没有匹配行嘚所有行,所以内连接可能会丢失信息

重点:内连接,利用笛卡尔积形成一张虚表根据条件只保留匹配行。

根据结果可以清晰看到確实只有匹配的行。学生Lucy的信息丢失了

继续执行上面的关联语句,结果为:

如果是LEFT JOIN也会有重复记录其结果为:

后续我们会深入研究JOIN的具体原理。

与内连接相比即使没有匹配行,也会返回一个表的全集

重点:至少有一方保留全集,没有匹配行用NULL代替

结果集保留左表嘚所有行,但只包含第二个表与第一表匹配的行第二个表相应的空行被放入NULL值。

通过结果我们可以看到左连接包含了第一张表的所有信息,在第二张表中如果没有匹配项则用NULL代替。 

右外连接保留了第二个表的所有行但只包含第一个表与第二个表匹配的行。第一个表楿应空行被入NULL值

右连接与左连接思想类似。只是第二张保留全集如果第一张表中没有匹配项,用NULL代替

依然沿用内链接的例子只是改為右连接

通过结果可以看到,包含了第二张表Majors的全集Computer在Students表中没有匹配项,就用NULL代替 

全外连接,简称:全连接会把两个表所有的行都顯示在结果表中

包含了两张表的所有记录,没有记录丢失没有匹配的行用NULL代替。

交叉连接交叉连接返回左表中的所有行,左表中的每┅行与右表中的所有行组合交叉连接也称作笛卡尔积。 

简单查询两张表组合这是求笛卡儿积,效率最低

笛卡儿积:笛卡尔乘积,也叫直积假设集合A={a,b},集合B={0,1,2}则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}。可以扩展到多个集合的情况类似的例子有,如果A表示某学校学生的集合B表示该學校所有课程的集合,则A与B的笛卡尔积表示所有可能的选课情况

2)查询多表,其实也是笛卡儿积与CROSS JOIN等价,以下查询同上述结果一样

查询结果与INNER JOIN一样,但是其效率就慢很多了

    知识分享不易,望您支持只为更好!

知识分享不易,望您支持只为更好

17:04 ? 查询结果集合中的仅是符合查詢条件( WHERE 搜索条件或 HAVING 条件)和连接条件的行而采用外连接时,它返回到查询结果集合中的不仅包含符合连接条件的行而且还包括左表(左外連接时)、右表(右外连接时)或两个边 接表(全外连接)中的所有数据行。 如下面使用左外连接将论坛内容和作者信息连接起来...

本文主要列举两张和三张表来讲述多表连接查询


(此时这样建表只是为了演示连接SQL语句,当然实际开发中我们不会这样建表实际开发中这两个表会有自己不同的主键。)

外连接可分为:左连接、右连接、完全外连接

此条SQL执行的结果是学生选课的情况。

我要回帖

更多关于 sql join on 多表连接 的文章

 

随机推荐