当前位置: 首页 > 知识库问答 >
问题:

SQL联接和不同类型的联接

严烨
2023-03-14

什么是SQLJOIN和什么是不同的类型?

共有3个答案

韩欣怿
2023-03-14

定义:

JOINS是查询同时从多个表组合在一起的数据的方法。

关系数据库管理系统有5种类型的连接:

>

  • 相等联接:根据相等条件合并两个表中的公共记录。从技术上讲,通过使用相等运算符(=)来比较一个表的主键值和另一个表的外键值进行连接,因此结果集包括两个表的公共(匹配)记录。有关实现,请参阅内部连接。

    Natural al-Join:它是Equi-Join的增强版本,其中SELECT操作省略重复列。有关实现,请参阅INNER-JOIN

    非Equi-Join:与Equi-join相反,其中连接条件是使用相等运算符(=)以外的其他条件,例如!=,

    自连接:: 表与自身结合的自定义连接行为;这通常是查询自引用表(或一元关系实体)所必需的。有关实现,请参阅INNER-JOINs。

    笛卡尔积:它交叉组合两个表的所有记录,没有任何条件。从技术上讲,它返回没有WHERE子句的查询的结果集。

    根据SQL关注点和改进,有3种类型的连接,所有RDBMS连接都可以使用这些类型的连接来实现。

    >

  • INNER-JOIN:它合并(或组合)两个表中匹配的行。匹配是基于表的公共列及其比较操作来完成的。如果基于相等条件则:执行EQUI-JOIN,否则非EQUI-Join。

    OUTER-JOIN:它合并(或组合)来自两个表的匹配行和具有NULL值的不匹配行。但是,可以自html" target="_blank">定义选择不匹配的行,例如,通过子类型从第一个表或第二个表中选择不匹配的行:左OUTER JOIN和右OUTER JOIN。

    2.1.左外连接(又名左连接):仅返回两个表中匹配的行,以及左表(即第一个表)中不匹配的行。

    2.2. 右外部联接(又称右联接):从两个表返回匹配的行,仅从右表返回不匹配的行。

    2.3. 完全外部联接(也称为外部联接):返回两个表中的匹配和不匹配。

    交叉连接:此连接不合并/组合,而是执行笛卡尔积。

    有关更多信息:

    1.1:内部联接:等联接实现

    SELECT  *
    FROM Table1 A 
     INNER JOIN Table2 B ON A.<Primary-Key> =B.<Foreign-Key>;
    

    1.2:内部连接:自然连接实现

    Select A.*, B.Col1, B.Col2          --But no B.ForeignKeyColumn in Select
     FROM Table1 A
     INNER JOIN Table2 B On A.Pk = B.Fk;
    

    1.3:具有非等联接实现的内部联接

    Select *
     FROM Table1 A INNER JOIN Table2 B On A.Pk <= B.Fk;
    

    1.4:内部连接与自我连接

    Select *
     FROM Table1 A1 INNER JOIN Table1 A2 On A1.Pk = A2.Fk;
    

    2.1:外部连接(完全外部连接)

    Select *
     FROM Table1 A FULL OUTER JOIN Table2 B On A.Pk = B.Fk;
    

    2.2:左连接

    Select *
     FROM Table1 A LEFT OUTER JOIN Table2 B On A.Pk = B.Fk;
    

    2.3:右连接

    Select *
     FROM Table1 A RIGHT OUTER JOIN Table2 B On A.Pk = B.Fk;
    

    3.1:交叉连接

    Select *
     FROM TableA CROSS JOIN TableB;
    

    3.2:交叉连接-自连接

    Select *
     FROM Table1 A1 CROSS JOIN Table1 A2;
    

    //或//

    Select *
     FROM Table1 A1,Table1 A2;
    

  • 齐磊
    2023-03-14

    SQLJOIN是从两个或多个数据库表检索数据的方法。

    总共有五个JOINs。他们是:

      1. JOIN or INNER JOIN
      2. OUTER JOIN
    
         2.1 LEFT OUTER JOIN or LEFT JOIN
         2.2 RIGHT OUTER JOIN or RIGHT JOIN
         2.3 FULL OUTER JOIN or FULL JOIN
    
      3. NATURAL JOIN
      4. CROSS JOIN
      5. SELF JOIN
    

    在这种类型的联接中,我们得到两个表中与条件匹配的所有记录,并且不报告两个表中不匹配的记录。

    换句话说,internaljoin基于一个事实:只有两个表中匹配的条目才应该被列出。

    请注意,没有任何其他JOIN关键字(如internalOUTERLEFT等)的连接是内部连接。换句话说,JOINinternaljoin的语法糖(请参阅:JOIN和internaljoin之间的区别)。

    外部联接检索

    一个表中匹配的行和另一个表中的所有行,或者所有表中的所有行(无论是否匹配)。

    有三种外部连接:

    2.1左外接合或左接合

    此连接返回左表中的所有行以及右表中的匹配行。如果右表中没有匹配的列,则返回NULL值。

    2.2右外连接或右连接

    这个JOIN返回右表中的所有行以及左表中的匹配行。如果左表中没有匹配的列,则返回NULL值。

    2.3完全外部连接或完全连接

    连接组合了左侧外部连接右侧外部连接。当满足条件时,它从任一表返回行;当不匹配时,它返回NULL值。

    换句话说,OUTER JOIN基于这样一个事实:应该列出其中一个表(右或左)或两个表(全)中的匹配条目。

    Note that `OUTER JOIN` is a loosened form of `INNER JOIN`.
    

    它基于两个条件:

    1. JOIN是在所有具有相同名称的列上生成的,以实现相等。
    2. 从结果中删除重复的列。

    这在本质上似乎更多的是理论上的,因此(可能)大多数数据库管理系统甚至懒得支持这一点。

    它是所涉及的两个表的笛卡尔乘积。在大多数情况下,CROSS JOIN的结果是没有意义的。此外,我们根本不需要这个(或者确切地说,至少不需要)。

    它不是JOIN的不同形式,而是表本身的JOININNEROUTER等)。

    根据用于JOIN子句的运算符,可以有两种类型的JOINs。他们是

    1. 等连接
    2. θ连接

    对于任何JOIN类型(INNEROUTER等),如果我们只使用等号操作符(=),那么我们说JOIN是一个EQUI JOIN

    这与EQUI-JOIN相同,但它允许所有其他操作符,如

    很多人同时考虑了<代码>等值连接< /代码>和θ<代码>连接< /代码>,类似于<代码>内部< /代码>,<代码>外部< /代码>等>代码>连接< /代码> s。但我坚信这是一个错误,使想法模糊不清。因为内部联接外部联接等都与表及其数据连接,而等联接θ联接仅与我们在前者中使用的运算符连接。

    再者,有许多人认为<代码>自然连接>代码>作为某种“特殊”<代码>等值连接< /代码>。事实上,这是真的,因为我提到的自然连接的第一个条件。然而,我们不必仅限于NATURAL JOINs<代码>内部联接s、外部联接s等也可以是等联接

    邵耀
    2023-03-14

    W3学校的一个例子:

     类似资料:
    • 问题内容: 假设我有两个表orgs和状态orgs是(o_ID,state_abbr),而状态是(state_abbr,state) 我想创建一个视图,显示每个状态下的o_ID计数: 我将使用哪种SQL语句?我尝试过的仅显示第一个状态,并对所有计数求和。 先感谢您。 问题答案:

    • 我想连接两个不同的数据和数据类型相同的表。 在表A中,列col1具有varchar数据类型,即123,而在表B中,列col1具有varchar数据类型,即ABC-123 是否有任何方法通过将ABC作为前缀添加到表1中的col1中,或者通过将前缀ABC从col1表2中移除来连接这两个列。

    • 问题内容: 有没有办法告诉Hibernate在使用to_char将列连接到另一个表或将NUMBER转换为VARCHAR时将其包装?我遇到的情况是,我的一个表包含一个类型为VARCHAR的通用键列,该列存储另一个表的ID(即Number)。当Hibernate执行它生成的SQL时,我收到一个SQL异常,该SQL使用’=’比较两列。 谢谢… PS:我知道这不是理想的选择,但是我坚持使用模式,因此必须对

    • 问题内容: 我知道SQL Server中的联接。 例如。有两个表Table1,Table2。 它们的表结构如下。 表1的数据如下: 表2数据如下: 如果我执行下面提到的两个SQL语句,则两个输出将是相同的 请在上述SQL语句中说明左右联接之间的区别。 问题答案: Select * from Table1 left join Table2 … 和 确实是完全可以互换的。但是,请尝试(或同一对)进行区

    • 问题内容: 我用多个(包括一个)编写了这个SQL请求。 它给了我预期的结果 。 但是,“ Id就像此请求的Linq等效项一样,将其放在应用程序的数据访问层中。 我尝试了类似的东西: 我试图适应这个问题,但我无法弄清楚。我对分组子请求的内部迷失了。 谁能解释我哪里错了? 专家提示:如果有人可以用lambda表达式编写等效项,则可获赠积分 问题答案: 要将SQL转换为LINQ查询理解: 将子选择转换为

    • 问题内容: 我有三个表:R,S和P。 表R通过外键与S连接;有 应该 是S中至少一个的记录,所以我可以加入: 如果S中没有记录,那么我没有行,那很好。 然后表S与P联接,其中记录为P可能存在,也可能不存在,并与S联接。 所以我做 如果我想将第二个JOIN绑定到S而不是R,例如我可以使用括号,该怎么办: 还是这已经是R,S和P之间笛卡尔积的自然行为? 问题答案: 各种外部联接和普通联接都在相同的优先