此外,如何适应左外加入,右外加入和全外加入?
当前回答
INNER JOIN 要求在比较两个表中至少有一场比赛. 例如,表 A 和表 B 意味着 A 8 B (A 交叉点 B)。
LEFT OUTER JOIN 和 LEFT JOIN 是相同的. 它提供所有相匹配的记录在两张桌子和所有选项的左桌子。
同样,RIGHT OUTER JOIN和RIGHT JOIN是相同的,它提供了所有记录相匹配的两张表和所有可能的正确的表。
FULL JOIN 是 LEFT OUTER JOIN 和 RIGHT OUTER JOIN 无重复的组合。
其他回答
他们不显示一个十字路口和一个内部联盟之间的区别,例如,或者更一般地显示不同类型的联盟预言之间的区别,或者提供一个框架,以便思考他们将如何运作。
此分類上一篇
選擇 A.Colour, B.Colour 從 A CROSS JOIN B
一些例子
上面是经典的equi加入。
内部合并条件不一定是平等条件,也不需要从两个(甚至任何)表中提到列。 评估 A.Colour NOT IN(“绿色”,“蓝色”)在交叉合并返回的每个行。
选择 A.Colour, B.Colour FROM A INNER JOIN B ON 1 = 1
此分類上一篇
此分類上一篇
此分類上一篇
选择 A.Colour, B.Colour FROM A FULL OUTER JOIN B ON 1 = 0
此分類上一篇
此分類上一篇
此分類上一篇
饰 SQL Fiddle
EmpID | EmpName |
---|---|
13 | Jason |
8 | Alex |
3 | Ram |
17 | Babu |
25 | Johnson |
位置
EmpID | EmpLoc |
---|---|
13 | San Jose |
8 | Los Angeles |
3 | Pune, India |
17 | Chennai, India |
39 | Bangalore, India |
select * from employee inner join location on employee.empID = location.empID
OR
select * from employee, location where employee.empID = location.empID
Employee.EmpId | Employee.EmpName | Location.EmpId | Location.EmpLoc |
---|---|---|---|
13 | Jason | 13 | San Jose |
8 | Alex | 8 | Los Angeles |
3 | Ram | 3 | Pune, India |
17 | Babu | 17 | Chennai, India |
左外加入:- 对员工和位置表的左外加入(或仅仅是左外加入)的结果总是包含“左”表(员工)的所有记录,即使加入条件在“右”表(位置)中找不到任何匹配记录。
select * from employee left outer join location on employee.empID = location.empID;
//Use of outer keyword is optional
Employee.EmpId | Employee.EmpName | Location.EmpId | Location.EmpLoc |
---|---|---|---|
13 | Jason | 13 | San Jose |
8 | Alex | 8 | Los Angeles |
3 | Ram | 3 | Pune, India |
17 | Babu | 17 | Chennai, India |
25 | Johnson | NULL | NULL |
右外登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登登
select * from employee right outer join location on employee.empID = location.empID;
//Use of outer keyword is optional
使用上面的表,我们可以显示一个正确的外部加入的结果设置会是什么样子:
Employee.EmpId | Employee.EmpName | Location.EmpId | Location.EmpLoc |
---|---|---|---|
13 | Jason | 13 | San Jose |
8 | Alex | 8 | Los Angeles |
3 | Ram | 3 | Pune, India |
17 | Babu | 17 | Chennai, India |
NULL | NULL | 39 | Bangalore, India |
请注意,虽然没有员工被列为在巴格罗尔工作,但它仍然被列入结果中,员工字段被删除。
Employee.EmpId | Employee.EmpName | Location.EmpId | Location.EmpLoc |
---|---|---|---|
13 | Jason | 13 | San Jose |
8 | Alex | 8 | Los Angeles |
3 | Ram | 3 | Pune, India |
17 | Babu | 17 | Chennai, India |
25 | Johnson | NULL | NULL |
NULL | NULL | 39 | Bangalore, India |
Oracle 加入活动
您使用 INNER JOIN 返回两个表中的所有行,即在结果表中,所有行和列都将有值。
在 OUTER JOIN 中,结果表可能有空列,外部加入可能是左或右。
LEFT OUTER JOIN 从第一张桌子中返回所有行,即使在第二张桌子中没有比赛。
RIGHT OUTER JOIN 从第二张桌子返回所有行,即使在第一张桌子上没有比赛。
内部加入需要附加表中包含相关 ID 的记录。
外部连接将为左侧返回记录,即使没有对右侧的记录。
例如,您有一个订单和一个订单细节表,它们由一个“订单ID”相关。
命令
客戶名稱
命令细节
商品名稱 Qty 價格
请求
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
INNER JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
只会返回订单,该订单还包含在订单详细信息表中的一些东西。
如果您将其更改为向左加入
SELECT Orders.OrderID, Orders.CustomerName
FROM Orders
LEFT JOIN OrderDetails
ON Orders.OrderID = OrderDetails.OrderID
然后它将从订单表中返回记录,即使它们没有订单详细记录。
您可以使用此来查找没有订单详细信息的订单,并通过添加一个在哪里条款,如Where OrderDetails.OrderID IS NULL。
内部加入
回收相匹配的行只,也就是说, A 交叉 B。
此分類上一篇
SELECT *
FROM dbo.Students S
INNER JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
左向外加入
从第一张表中选择所有记录,以及与附件密钥相匹配的第二张表中的任何记录。
此分類上一篇
SELECT *
FROM dbo.Students S
LEFT JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
全外加入
从第二张表中选择所有记录,以及与附件密钥相匹配的第一张表中的任何记录。
此分類上一篇
SELECT *
FROM dbo.Students S
FULL JOIN dbo.Advisors A
ON S.Advisor_ID = A.Advisor_ID
参考
内部和外部加入 SQL 示例和加入区块 SQL: JOINS
推荐文章
- 如何在Ruby On Rails中使用NuoDB手动执行SQL命令
- 查询JSON类型内的数组元素
- 确定记录是否存在的最快方法
- 获得PostgreSQL数据库中当前连接数的正确查询
- 在SQL选择语句Order By 1的目的是什么?
- 我如何循环通过一组记录在SQL Server?
- 如何从命令行通过mysql运行一个查询?
- 外键约束可能导致循环或多条级联路径?
- 使用LIMIT/OFFSET运行查询,还可以获得总行数
- 当恢复sql时,psql无效命令\N
- 货币应该使用哪种数据类型?
- 如何选择每一行的列值不是独特的
- 如何改变字符集(和排序)在整个数据库?
- mySQL:: insert到表,数据从另一个表?
- 如何在Postgres中获得两个字段的MIN() ?