SQL主键/表连接
好的,这是一个相对简单的问题,我只需要确认一下。我很确定我知道答案,但我需要专家的确认,因为我有强迫症 无论如何,我想知道一个简单的内部连接语句之间有什么区别 只需使用where子句将我要匹配的表的主键设置为=即可 我写了这个SQL主键/表连接,sql,sql-server,join,inner-join,Sql,Sql Server,Join,Inner Join,好的,这是一个相对简单的问题,我只需要确认一下。我很确定我知道答案,但我需要专家的确认,因为我有强迫症 无论如何,我想知道一个简单的内部连接语句之间有什么区别 只需使用where子句将我要匹配的表的主键设置为=即可 我写了这个 select a.CONTACT_ID, a.TRADE_REP as Rep_Trading_ID, p.CRD_NUMBER, c.FIRST_NAME, c.LAST_NAME from dbo.REP_PROFILE p, dbo.REP_ALIAS a, dbo
select a.CONTACT_ID, a.TRADE_REP as Rep_Trading_ID, p.CRD_NUMBER, c.FIRST_NAME, c.LAST_NAME
from dbo.REP_PROFILE p, dbo.REP_ALIAS a, dbo.CONTACT c
where
c.CONTACT_ID = p.CONTACT_ID
and p.CONTACT_ID = a.TRADE_REP
and a.PRIMARY_YN = 'y'
在我看来,这似乎执行了完全相同的查询,就像我在联系人ID上创建了表c和p之间的内部联接以及表p和a之间的另一个内部联接一样(联系人ID是我的主键)
我说得对吗?我部分正确吗?我是不是太无知了?任何验证都可以是,使用您提供的格式可以很好地进行内部联接 但是当你到达左/右连接时该怎么办呢?那么就不能在where子句中使用这样的连接条件 如果我没弄错的话,老派的语法会像你一样
=* for LEFT JOIN
及
您可能会觉得下面的文章读得很好(更具体地说是各种连接类型)
是的,使用您提供的格式可以很好地用于内部联接 但是当你到达左/右连接时该怎么办呢?那么就不能在where子句中使用这样的连接条件 如果我没弄错的话,老派的语法会像你一样
=* for LEFT JOIN
及
您可能会觉得下面的文章读得很好(更具体地说是各种连接类型)
是一样的
请看这两张表:
CREATE TABLE table1 (
id INT,
name VARCHAR(20)
);
CREATE TABLE table2 (
id INT,
name VARCHAR(20)
);
使用内部联接的查询的执行计划:
-- with inner join
EXPLAIN PLAN FOR
SELECT * FROM table1 t1
INNER JOIN table2 t2 ON t1.id = t2.id;
SELECT *
FROM TABLE (DBMS_XPLAN.DISPLAY);
-- 0 select statement
-- 1 hash join (access("T1"."ID"="T2"."ID"))
-- 2 table access full table1
-- 3 table access full table2
以及使用WHERE子句的查询的执行计划
-- with where clause
EXPLAIN PLAN FOR
SELECT * FROM table1 t1, table2 t2
WHERE t1.id = t2.id;
SELECT *
FROM TABLE (DBMS_XPLAN.DISPLAY);
-- 0 select statement
-- 1 hash join (access("T1"."ID"="T2"."ID"))
-- 2 table access full table1
-- 3 table access full table2
在我看来,使用JOIN更具可读性。也一样
请看这两张表:
CREATE TABLE table1 (
id INT,
name VARCHAR(20)
);
CREATE TABLE table2 (
id INT,
name VARCHAR(20)
);
使用内部联接的查询的执行计划:
-- with inner join
EXPLAIN PLAN FOR
SELECT * FROM table1 t1
INNER JOIN table2 t2 ON t1.id = t2.id;
SELECT *
FROM TABLE (DBMS_XPLAN.DISPLAY);
-- 0 select statement
-- 1 hash join (access("T1"."ID"="T2"."ID"))
-- 2 table access full table1
-- 3 table access full table2
以及使用WHERE子句的查询的执行计划
-- with where clause
EXPLAIN PLAN FOR
SELECT * FROM table1 t1, table2 t2
WHERE t1.id = t2.id;
SELECT *
FROM TABLE (DBMS_XPLAN.DISPLAY);
-- 0 select statement
-- 1 hash join (access("T1"."ID"="T2"."ID"))
-- 2 table access full table1
-- 3 table access full table2
在我看来,使用JOIN更具可读性。执行
JOIN
语法更易于阅读(任何东西在哪里都很明显,诸如此类)。由于将JOIN
更改为OUTER JOIN
非常容易,而且更容易操作,因此它也被认为更灵活
有关更多详细信息,请参阅本文(它是MySQL,但同样的问题也会出现/应用):执行
JOIN
语法更容易阅读(无论它在哪里以及诸如此类的事情都很明显)。由于将JOIN
更改为OUTER JOIN
非常容易,而且更容易操作,因此它也被认为更灵活
有关更多详细信息,请参阅本文(这是MySQL,但同样的问题也会出现/应用):可能重复的可能重复的可能重复的感谢您的回复!我也喜欢学习一些被遗忘的语法。当使用其他连接时,我喜欢使用Visual SQL连接的打印输出,可以在这里找到,谢谢您的回复!我也喜欢学习一些被遗忘的语法。当使用其他联接时,我喜欢使用Visual SQL联接的打印输出,可以在这里找到,我同意可读性,我更喜欢使用联接语句,因为它在政治上似乎更正确。我只是想知道正在执行的基本操作是否相同,先生,您已经向我展示了我想要的,谢谢@阿达姆:是的。我在答案中加入了
EXPLAIN
,这是错误的,因为它是针对MySQL的。但您总是对SQL Server中如何执行查询有疑问,应该在SQL Server Management Studio中使用“显示估计的执行计划”。这样,您就可以看到它是否缺少索引,或者它是否是一个错误的查询。是优化查询的最佳方法。然而,答案仍然是一样的,JOIN
(而不是LEFT JOIN
或任何其他变体)和,其中
的工作方式相同。我同意可读性,我更喜欢使用JOIN语句,因为它似乎在政治上更正确。我只是想知道正在执行的基本操作是否相同,先生,您已经向我展示了我想要的,谢谢@阿达姆:是的。我在答案中加入了EXPLAIN
,这是错误的,因为它是针对MySQL的。但您总是对SQL Server中如何执行查询有疑问,应该在SQL Server Management Studio中使用“显示估计的执行计划”。这样,您就可以看到它是否缺少索引,或者它是否是一个错误的查询。是优化查询的最佳方法。但是,答案仍然是一样的,JOIN
(而不是LEFT JOIN
或任何其他变体)和,其中
的工作方式相同。