此外,如何适应左外加入,右外加入和全外加入?
当前回答
内部加入需要附加表中包含相关 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。
其他回答
在简单的条件下,
1.INNER JOIN OR EQUI JOIN : 返回结果组,仅符合两张表中的状态。
2.OUTER JOIN : 从两个表中返回所有值的结果,即使有条件相匹配或不相匹配。
3.LEFT JOIN : 从左表中返回所有值的结果组合,并仅与右表中的条件相匹配的行。
4.RIGHT JOIN : 从右表返回所有值的结果组合,并且仅符合左表的条件的行列。
5、全加入:全加入和全外加入是相同的。
一个内部合并只显示行,如果在合并的另一边(右)有一个匹配记录。
一(左)外部连接显示在左侧的每个记录的行列,即使连接的另一(右)侧没有匹配行列,如果没有匹配行列,对另一(右)侧的列将显示零。
一次示威
设置
跳进 psql 并创建一个小数据库的猫和人类. 你可以只是复制这个整个部分。
CREATE DATABASE catdb;
\c catdb;
\pset null '[NULL]' -- how to display null values
CREATE TABLE humans (
name text primary key
);
CREATE TABLE cats (
human_name text references humans(name),
name text
);
INSERT INTO humans (name)
VALUES ('Abe'), ('Ann'), ('Ben'), ('Jen');
INSERT INTO cats (human_name, name)
VALUES
('Abe', 'Axel'),
(NULL, 'Bitty'),
('Jen', 'Jellybean'),
('Jen', 'Juniper');
求求
SELECT
humans.name AS human_name,
cats.name AS cat_name
FROM humans
[SOMETHING JOIN] cats ON humans.name = cats.human_name
ORDER BY humans.name;
任何人,没有猫或猫,没有人,都被排除在外。
human_name | cat_name
------------+-----------
Abe | Axel
Jen | Jellybean
Jen | Juniper
A FULL OUTER JOIN returns all humans and all cats, with zero if there is no match on both sides. 全外加入将返回所有人类和所有猫,如果双方都没有比赛,则零。
human_name | cat_name
------------+-----------
Abe | Axel
Ann | [NULL]
Ben | [NULL]
Jen | Jellybean
Jen | Juniper
[NULL] | Bitty
human_name | cat_name
------------+-----------
Abe | Axel
Ann | [NULL]
Ben | [NULL]
Jen | Jellybean
Jen | Juniper
每只猫,没有人,都会在人名列中获得零;每只猫,没有人,都会被排除。
human_name | cat_name
------------+-----------
Abe | Axel
Jen | Jellybean
Jen | Juniper
[NULL] | Bitty
你可以看到,虽然一个内部加入只获得匹配夫妇,每个类型的外部加入包括一些没有比赛的项目。
加入本身意味着内部左加入,右加入和外加入,所有意味着外加入。
内部加入需要附加表中包含相关 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。
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 加入活动
推荐文章
- 如何在Ruby On Rails中使用NuoDB手动执行SQL命令
- 查询JSON类型内的数组元素
- 确定记录是否存在的最快方法
- 获得PostgreSQL数据库中当前连接数的正确查询
- 在SQL选择语句Order By 1的目的是什么?
- 我如何循环通过一组记录在SQL Server?
- 如何从命令行通过mysql运行一个查询?
- 外键约束可能导致循环或多条级联路径?
- 使用LIMIT/OFFSET运行查询,还可以获得总行数
- 当恢复sql时,psql无效命令\N
- 货币应该使用哪种数据类型?
- 如何选择每一行的列值不是独特的
- 如何改变字符集(和排序)在整个数据库?
- mySQL:: insert到表,数据从另一个表?
- 如何在Postgres中获得两个字段的MIN() ?