首先,不要让加入吓到你,尊重他们。
Select
a.field1,
...
x.field2
from
SomeTable a
JOIN AnotherTable x
on a.SomeKey = x.SomeKey
where
blah...
维基百科涉及各种假设场景和数学参考等。我将尝试使用更简单的术语。在进行连接时,只需知道相关表之间的“关键”元素是什么。在大多数情况下,它将通过一些常见的 Key ID(customerID、orderID、itemID 等)来实现。
所以,从最简单的意义上说,如果您有一个订单和客户系统并执行类似的操作
select o.orderID, c.CustomerID
from Orders o, Customers c
没有加入将导致每个订单都加入到每个客户。因此,如果您有 5 个订单和 3 个客户,您将获得 15 个条目。
例如:
Orders | Customers
OrderID CustomerID | CustomerID Name
1 A | A Adam
2 B | B Bill
3 C | C Casey
4 B |
5 C |
你会得到
1-A
1-B
1-C
2-A
2-B
2-C
...
5-A
5-B
5-C
现在,请注意两个客户各有两个订单。由于您知道表之间的公共键,因此您只会获得 5 个条目
select o.orderID, c.CustomerID, c.Name
from
Orders o
JOIN Customers c
on o.CustomerID = c.CustomerID
你会得到预期的结果......
1 A Adam
2 B Bill
3 C Casey
4 B Bill
5 C Casey
当进入左连接(或右连接)时,前提仍然成立。始终应用 KNOWN 键关系。如果它们匹配,则很好(内连接),如果不匹配(左连接),则即使右侧没有匹配,查询左侧表中的记录仍将被包含在内。我最近看到了一个加入说明的例子,我也会尝试找到它。
现在有了这个基本解释,考虑在您的系统中有 3 个表......每个表分别有 5000、2000 和 3000 条记录。如果您在不使用各个表之间的连接条件的情况下进行查询,您最终会得到 30,000,000,000 条记录,而且显然是一团糟。
所以,在编写查询时,我总是尝试以这种方式开始。查看我需要从表 A 中的部分一直到表 D 中的某些内容的所有表。我需要查看每个表之间的关系在您的查询中始终包含它们(前提是您需要所有表)。一旦你得到表和你想要的所有列,然后考虑你想要的 CRITERIA。这些可以应用于 where 子句(通常用于第一个表),但也可以在查询中包含其他别名。但是,这可能有点棘手,尤其是在处理左连接时。如果您有适用于其中一个联接表的某些条件,则可以在该级别添加逻辑“AND”条件。
此外,在进行查询时,请养成为长名称的表使用别名以简化查询可读性的习惯。此外,始终在具有多个表的查询中限定 table.column 或 alias.column。如果人们试图帮助您,但他们不知道表中的列是什么,那么就更难理解了……更不用说在您接管或更新查询后有人了。
祝你好运。