什么是SQLJOIN
和什么是不同的类型?
定义:
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;
SQLJOIN
是从两个或多个数据库表检索数据的方法。
总共有五个JOIN
s。他们是:
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
关键字(如internal
、OUTER
、LEFT
等)的连接是
内部连接。换句话说,
JOIN
是internaljoin
的语法糖(请参阅: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`.
它基于两个条件:
JOIN
是在所有具有相同名称的列上生成的,以实现相等。
- 从结果中删除重复的列。
这在本质上似乎更多的是理论上的,因此(可能)大多数数据库管理系统甚至懒得支持这一点。
它是所涉及的两个表的笛卡尔乘积。在大多数情况下,
CROSS JOIN
的结果是没有意义的。此外,我们根本不需要这个(或者确切地说,至少不需要)。
它不是
JOIN
的不同形式,而是表本身的JOIN
(INNER
,OUTER
等)。
根据用于
JOIN
子句的运算符,可以有两种类型的JOIN
s。他们是
等连接
- θ连接
对于任何
JOIN
类型(INNER
,OUTER
等),如果我们只使用等号操作符(=),那么我们说JOIN
是一个EQUI JOIN
。
这与
EQUI-JOIN
相同,但它允许所有其他操作符,如
很多人同时考虑了<代码>等值连接< /代码>和θ<代码>连接< /代码>,类似于<代码>内部< /代码>,<代码>外部< /代码>等>代码>连接< /代码> s。但我坚信这是一个错误,使想法模糊不清。因为
内部联接
,外部联接
等都与表及其数据连接,而等联接
和θ联接
仅与我们在前者中使用的运算符连接。
再者,有许多人认为<代码>自然连接>代码>作为某种“特殊”<代码>等值连接< /代码>。事实上,这是真的,因为我提到的
自然连接的第一个条件。然而,我们不必仅限于
s、NATURAL JOIN
s<代码>内部联接外部联接
s等也可以是等联接
。
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之间笛卡尔积的自然行为? 问题答案: 各种外部联接和普通联接都在相同的优先