在 SQL 服务器中,使用 = 和加入有什么区别?
In SQL server what is the difference between using = and join?
我们一直在学习 SQL 数据库系统中的服务器编程 class。教授讲得特别快,不太愿意提问。我确实问过他这个问题,但他只是建议我查看他提供的代码(实际上并没有回答问题)。
进行查询时,使用术语 JOIN 和使用“=”运算符有什么区别?例如,我有以下查询:
SELECT VENDOR_NAME, ITEM_NAME, QTY
FROM VENDOR, VENDOR_ORDER, INVENTORY
WHERE VENDOR.VENDOR_ID = VENDOR_ORDER.VENDOR_ID
AND VENDOR_ORDER.INV_ID = INVENTORY.INV_ID
ORDER BY VENDOR_NAME
教授在 class 中使用了以下代码:
SELECT DISTINCT CUS_CODE, CUS_LNAME, CUS_FNAME
FROM CUSTOMER JOIN INVOICE USING (CUS_CODE)
JOIN LINE USING (INV_NUMBER)
JOIN PRODUCT USING (P_CODE)
WHERE P_DESCRIPT = 'Claw hammer';
在我看来,使用连接与我的“=”执行相同的功能?我是正确的还是有我不知道的区别?
编辑:
尝试根据我在 Google 上发现的内容使用 Inner Join。我最终得到以下结果。
SELECT VENDOR_NAME, ITEM_NAME, QTY
FROM VENDOR, VENDOR_ORDER, INVENTORY
INNER JOIN VENDOR_ORDER USING (VENDOR_ID)
INNER JOIN INVENTORY USING (INV_ID)
ORDER BY VENDOR_NAME
现在我收到错误消息“"VENDOR_ID" 不是可识别的 table 提示选项。如果它打算作为 table 值函数或 CHANGETABLE 的参数功能,请确保您的数据库兼容模式设置为 90。
“
我使用的是 2014,所以我的兼容级别是 120。
你正在做的事情(在你的第一个例子中)和你的教授正在做的事情之间的区别在于你正在创建一组所有可能的行组合 tables,然后缩小你的范围结果与您希望的方式相匹配。他首先创建了一组仅与您希望的方式匹配的行。
如果您的 table 是:
Table1
ID1
1
2
3
Table2
ID2
1
2
3
您的查询基本上以交叉联接开始:
Select * from Table1, Table2
ID1 ID2
1 1
2 1
3 1
1 2
2 2
3 2
1 3
2 3
3 3
然后通过应用 where ID1 = ID2
缩小结果集
ID1 ID2
1 1
2 2
3 3
正如人们在评论中提到的那样,这在更复杂的示例中效率低下并且有些难以阅读。
您的教授正在构建将两个 table 关联到联接本身的条件,因此他实际上跳过了第一步。在我们的示例 tables 中,这将是 Select * from Table1 join Table2 on ID1 = ID2
.
SQL 中有多种类型的联接,具体取决于您希望如何处理其中一个 table 中存在值但在另一个中不匹配的情况table。请参阅 http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins:
中的传统维恩图解释
别担心,这是你教授的问题,不是你的。确保您在课程结束时提供适当的反馈 ;)
坚持住。
所以这里有一些信息:
所以第一个问题是:你的教授不应该教你 USING
因为它的实现有限(它肯定不会在 SQL 服务器上工作)并且恕我直言,这是一个坏主意,因为您应该明确列出连接列。
这里有一些可以在 SQL 服务器中运行的查询 - 让我们一点一点地构建它们。我需要做一些假设
首先将供应商加入供应商订单:
SELECT VENDOR.VENDOR_NAME, VENDOR_ORDER.QTY
FROM VENDOR
INNER JOIN
VENDOR_ORDER
ON VENDOR.VENDOR_ID = VENDOR_ORDER.VENDOR_ORDER
通过使用内部联接,我们在 VENDOR_ID
上匹配这两个 table
如果您在 VENDOR_ORDER
中有七条记录且 VENDOR_ID = 7,并且在 table 中有一条记录 VENDOR
那么结果将是...... 7 条记录,来自 VENDOR
table 的数据重复七次。
现在,加入库存
SELECT VENDOR.VENDOR_NAME, INVENTORY.ITEM_NAME, VENDOR_ORDER.QTY
FROM VENDOR
INNER JOIN
VENDOR_ORDER
ON VENDOR.VENDOR_ID = VENDOR_ORDER.VENDOR_ORDER
INNER JOIN
INVENTORY ON INVENTORY.INV_ID = VENDOR_ORDER.INV_ID
ORDER BY VENDOR.VENDOR_NAME
此 'INNER JOIN' 语法是现代版本(通常称为 SQL-92)。在 FROM 子句之后有一个逗号分隔的列表是 'old school'
这两种方法的工作方式相同,但如果您开始使用外部联接,老派的方法会导致歧义。因此,请养成以新方式进行操作的习惯。
最后,要整理一下,您可以使用 'allias'。这意味着你给每个 table 一个更短的名字然后使用它。我还添加了发票编号,以便您了解发生了什么:
SELECT V.VENDOR_NAME, I.ITEM_NAME, ORD.INV_ID, ORD.QTY
FROM VENDOR As V
INNER JOIN
VENDOR_ORDER As ORD
ON V.VENDOR_ID = ORD.VENDOR_ORDER
INNER JOIN
INVENTORY As I ON I.INV_ID = ORD.INV_ID
ORDER BY V.VENDOR_NAME
我们一直在学习 SQL 数据库系统中的服务器编程 class。教授讲得特别快,不太愿意提问。我确实问过他这个问题,但他只是建议我查看他提供的代码(实际上并没有回答问题)。
进行查询时,使用术语 JOIN 和使用“=”运算符有什么区别?例如,我有以下查询:
SELECT VENDOR_NAME, ITEM_NAME, QTY
FROM VENDOR, VENDOR_ORDER, INVENTORY
WHERE VENDOR.VENDOR_ID = VENDOR_ORDER.VENDOR_ID
AND VENDOR_ORDER.INV_ID = INVENTORY.INV_ID
ORDER BY VENDOR_NAME
教授在 class 中使用了以下代码:
SELECT DISTINCT CUS_CODE, CUS_LNAME, CUS_FNAME
FROM CUSTOMER JOIN INVOICE USING (CUS_CODE)
JOIN LINE USING (INV_NUMBER)
JOIN PRODUCT USING (P_CODE)
WHERE P_DESCRIPT = 'Claw hammer';
在我看来,使用连接与我的“=”执行相同的功能?我是正确的还是有我不知道的区别?
编辑: 尝试根据我在 Google 上发现的内容使用 Inner Join。我最终得到以下结果。
SELECT VENDOR_NAME, ITEM_NAME, QTY
FROM VENDOR, VENDOR_ORDER, INVENTORY
INNER JOIN VENDOR_ORDER USING (VENDOR_ID)
INNER JOIN INVENTORY USING (INV_ID)
ORDER BY VENDOR_NAME
现在我收到错误消息“"VENDOR_ID" 不是可识别的 table 提示选项。如果它打算作为 table 值函数或 CHANGETABLE 的参数功能,请确保您的数据库兼容模式设置为 90。 “ 我使用的是 2014,所以我的兼容级别是 120。
你正在做的事情(在你的第一个例子中)和你的教授正在做的事情之间的区别在于你正在创建一组所有可能的行组合 tables,然后缩小你的范围结果与您希望的方式相匹配。他首先创建了一组仅与您希望的方式匹配的行。
如果您的 table 是:
Table1
ID1
1
2
3
Table2
ID2
1
2
3
您的查询基本上以交叉联接开始:
Select * from Table1, Table2
ID1 ID2
1 1
2 1
3 1
1 2
2 2
3 2
1 3
2 3
3 3
然后通过应用 where ID1 = ID2
ID1 ID2
1 1
2 2
3 3
正如人们在评论中提到的那样,这在更复杂的示例中效率低下并且有些难以阅读。
您的教授正在构建将两个 table 关联到联接本身的条件,因此他实际上跳过了第一步。在我们的示例 tables 中,这将是 Select * from Table1 join Table2 on ID1 = ID2
.
SQL 中有多种类型的联接,具体取决于您希望如何处理其中一个 table 中存在值但在另一个中不匹配的情况table。请参阅 http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins:
别担心,这是你教授的问题,不是你的。确保您在课程结束时提供适当的反馈 ;)
坚持住。
所以这里有一些信息:
所以第一个问题是:你的教授不应该教你 USING
因为它的实现有限(它肯定不会在 SQL 服务器上工作)并且恕我直言,这是一个坏主意,因为您应该明确列出连接列。
这里有一些可以在 SQL 服务器中运行的查询 - 让我们一点一点地构建它们。我需要做一些假设
首先将供应商加入供应商订单:
SELECT VENDOR.VENDOR_NAME, VENDOR_ORDER.QTY
FROM VENDOR
INNER JOIN
VENDOR_ORDER
ON VENDOR.VENDOR_ID = VENDOR_ORDER.VENDOR_ORDER
通过使用内部联接,我们在 VENDOR_ID
如果您在 VENDOR_ORDER
中有七条记录且 VENDOR_ID = 7,并且在 table 中有一条记录 VENDOR
那么结果将是...... 7 条记录,来自 VENDOR
table 的数据重复七次。
现在,加入库存
SELECT VENDOR.VENDOR_NAME, INVENTORY.ITEM_NAME, VENDOR_ORDER.QTY
FROM VENDOR
INNER JOIN
VENDOR_ORDER
ON VENDOR.VENDOR_ID = VENDOR_ORDER.VENDOR_ORDER
INNER JOIN
INVENTORY ON INVENTORY.INV_ID = VENDOR_ORDER.INV_ID
ORDER BY VENDOR.VENDOR_NAME
此 'INNER JOIN' 语法是现代版本(通常称为 SQL-92)。在 FROM 子句之后有一个逗号分隔的列表是 'old school'
这两种方法的工作方式相同,但如果您开始使用外部联接,老派的方法会导致歧义。因此,请养成以新方式进行操作的习惯。
最后,要整理一下,您可以使用 'allias'。这意味着你给每个 table 一个更短的名字然后使用它。我还添加了发票编号,以便您了解发生了什么:
SELECT V.VENDOR_NAME, I.ITEM_NAME, ORD.INV_ID, ORD.QTY
FROM VENDOR As V
INNER JOIN
VENDOR_ORDER As ORD
ON V.VENDOR_ID = ORD.VENDOR_ORDER
INNER JOIN
INVENTORY As I ON I.INV_ID = ORD.INV_ID
ORDER BY V.VENDOR_NAME