什么是SQLJOIN
,有哪些不同的类型?
SQL JOIN
是一种从两个或多个数据库表中检索数据的方法。
总共有五个 "JOIN"。它们是 :
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
在这种 "JOIN "中,我们得到两个表中所有符合条件的记录,而两个表中不符合条件的记录不会被报告。
换句话说,"INNER JOIN "是基于这样一个事实。只有两个表中的匹配条目才应该被列出。
注意,没有任何其他 "JOIN "关键字(如 "INNER","OUTER","LEFT "等)的 "JOIN "是 "INNER JOIN"。换句话说,"JOIN "是 是 "INNER JOIN "的句法糖(见:https://stackoverflow.com/questions/565620/difference-between-join-and-inner-join)。
OUTER JOIN
检索
任意一个。 一个表中的匹配记录和另一个表中的所有记录 或者。 所有表中的所有记录(是否有匹配的记录并不重要)。
有三种外层连接。
2.1 LEFT OUTER JOIN或LEFT JOIN
这种连接将左表的所有记录与右表的匹配记录一起返回。 右表的匹配行。如果在右表中没有匹配的列,它会返回 "NULL "值。
2.2 RIGHT OUTER JOIN或RIGHT JOIN
这个 "JOIN "将右表的所有记录与左表的匹配记录一起返回。 左表的匹配行。如果左表中没有匹配的列,则返回 "NULL "值。
2.3 FULL OUTER JOIN或FULL JOIN
这个JOIN
结合了LEFT OUTER JOIN
和RIGHT OUTER JOIN
。当条件得到满足时,它从任何一个表中返回记录,当没有匹配时,返回`NULL'值。
换句话说,"OUTER JOIN "是基于以下事实。只有其中一个表(右表或左表)或两个表(全表)中的匹配条目才应该被列出。
Note that `OUTER JOIN` is a loosened form of `INNER JOIN`.
它是基于两个条件的。
这似乎更多的是理论性的,因此(可能)大多数DBMS 甚至懒得支持这个。
它是所涉及的两个表的笛卡尔乘积。在大多数情况下,"交叉连接 "的结果是没有意义的。 在大多数情况下都没有意义。此外,我们根本不需要这个(或者准确地说,至少需要)。
它不是 "JOIN "的不同形式,而是一个表与自身的 "JOIN"("INNER"、"OUTER "等)。
根据用于 "JOIN "子句的操作符,可以有两种类型的 "JOIN"。它们是
1.Equi JOIN 2.Theta JOIN
对于任何 "JOIN "类型("INNER","OUTER",等等),如果我们只使用平等运算符(=),那么我们就说 JOIN "是一个 "EQUI JOIN"。
这与EQUI JOIN
相同,但它允许所有其他运算符,如>, <, >=等。
许多人认为
EQUI JOIN
和ThetaJOIN
类似于INNER
,OUTER
. 等JOIN'。但我强烈认为这是一个错误,使 想法模糊不清。因为
INNER JOIN,
OUTER JOIN`等都是与 而 "EQUI JOIN "和 "THETA JOIN "只与我们的运算符有关。 与我们在前者中使用的运算符有关。同样,有很多人认为
NATURAL JOIN'是某种形式的 "奇特"
EQUI JOIN。事实上,这是真的,因为第一个 我提到的 "NATURAL JOIN "的条件。然而,我们不需要 仅仅局限于
NATURAL JOIN'。INNER JOIN"、"OUTER JOIN "等都可以成为 "NATURAL JOIN"。 等也可以是一个`EQUI JOIN'。
定义:
JOINS是一种同时从多个表中查询组合在一起的数据的方式。
就RDBMS而言,有5种类型的连接。
平等连接:基于平等条件,将两个表中的共同记录合并。 从技术上讲,连接是通过使用平等运算符(=)来比较一个表的主键值和另一个表的外键值,因此结果集包括两个表的共同(匹配)记录。实现方法见INNER-JOIN。
自然连接:**它是Equi-Join的增强版,其中SELECT 操作省略了重复的列。实现方法见INNER-JOIN
Non-Equi-Join:它是Equi-join的反面,其中连接条件是使用等价运算符(=)以外的其他运算符,例如,!=,<=,>=,>,<或BETWEEN等。实现方法见INNER-JOIN。
自我连接:。一种自定义的连接行为,其中一个表与它自己结合在一起;这通常需要用于查询自引用表(或单数关系实体)。 实现方法见INNER-JOINs。
笛卡尔产品:**它交叉结合两个表的所有记录,没有任何条件。从技术上讲,它返回的是没有WHERE条款的查询结果集。
根据SQL的关注和发展,有3种类型的连接,所有的RDBMS连接都可以通过这些类型的连接来实现。
1.1.INNER-JOIN:它合并(或结合)两个表中的匹配行。匹配是根据表的共同列和它们的比较操作来完成的。如果是基于平等的条件,那么。则执行EQUI-JOIN,否则为非EQUI-Join。
2.2. OUTER-JOIN:它合并(或结合)来自两个表的匹配行和带有NULL值的未匹配行。然而,可以自定义选择未匹配的行,例如,通过子类型从第一个表或第二个表选择未匹配的行。LEFT OUTER JOIN 和 RIGHT OUTER JOIN。
2.1.**左外连接**(又称LEFT-JOIN)。仅从两个表中返回匹配的行,并从LEFT表(即第一个表)返回不匹配的行。
2.2.2.2. **右外连接** (a.k.a, RIGHT-JOIN)。从两个表中返回匹配的行,并且只从右表返回未匹配的行。
2.3.**FULL OUTER JOIN** (a.k.a OUTER JOIN)。从两个表中返回匹配和未匹配的行。
3.3.CROSS-JOIN:这种连接不进行合并/组合,而是执行笛卡尔乘积。
。 注意:Self-JOIN可以通过INNER-JOIN、OUTER-JOIN和CROSS-JOIN实现,基于需求,但表必须与自己连接。
1.1:INNER-JOIN: Equi-join的实现
SELECT *
FROM Table1 A
INNER JOIN Table2 B ON A.<Primary-Key> =B.<Foreign-Key>;
1.2:INNER-JOIN:Natural-JOIN的实现。
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:INNER-JOIN与NON-Equi-join的实现。
Select *
FROM Table1 A INNER JOIN Table2 B On A.Pk <= B.Fk;
1.4:带有SELF-JOIN的INNER-JOIN。
Select *
FROM Table1 A1 INNER JOIN Table1 A2 On A1.Pk = A2.Fk;
2.1:OUTER JOIN(全外联)
Select *
FROM Table1 A FULL OUTER JOIN Table2 B On A.Pk = B.Fk;
2.2:LEFT JOIN
Select *
FROM Table1 A LEFT OUTER JOIN Table2 B On A.Pk = B.Fk;
2.3:RIGHT JOIN
Select *
FROM Table1 A RIGHT OUTER JOIN Table2 B On A.Pk = B.Fk;
3.1:CROSS JOIN
Select *
FROM TableA CROSS JOIN TableB;
3.2:CROSS JOIN-Self JOIN
Select *
FROM Table1 A1 CROSS JOIN Table1 A2;
//OR//
Select *
FROM Table1 A1,Table1 A2;