似乎要组合两个或更多表,我们可以使用join或where.一个优于另一个的优点是什么?
可能重复:
内部联接vs其中
今天我和我的项目经理就Cartesian产品进行了辩论.他说'自然连接'比使用'select from where'要好得多,因为后者会导致db引擎在内部执行笛卡尔积,但前者使用另一种方法来阻止这种情况.据我所知,自然连接语法在性能或含义方面与"从哪里选择"没有任何不同,我的意思是你可以根据自己的喜好使用.
SELECT * FROM table1,table2 WHERE table1.id=table2.id
SELECT * FROM table1 NATURAL JOIN table2
Run Code Online (Sandbox Code Playgroud)
请详细说明导致笛卡尔积的第一个查询,但第二个查询更加智能
对于内连接,在JOIN ON子句或WHERE子句中应用过滤器的性能是否有任何差异?哪个会更高效,还是优化器会使它们相等?
加入
SELECT u.name
FROM users u
JOIN departments d
ON u.department_id = d.id
AND d.name = 'IT'
Run Code Online (Sandbox Code Playgroud)
VS
哪里
SELECT u.name
FROM users u
JOIN departments d
ON u.department_id = d.id
WHERE d.name = 'IT'
Run Code Online (Sandbox Code Playgroud)
Oracle 11gR2
所以我们正在从Informix迁移到Sql Server.我注意到在Informix中,查询是以这种方式编写的:
select [col1],[col2],[col3],[col4],[col5]
from tableA, tableB
where tableA.[col1] = table.[gustavs_custom_chrome_id]
Run Code Online (Sandbox Code Playgroud)
我在SQL Server中编写的所有查询都写成:
select [col1],[col2],[col3],[col4],[col5]
from tableA
inner join tableB on tableA.[col1] = table.[gustavs_custom_chrome_id]
Run Code Online (Sandbox Code Playgroud)
现在,我的第一个想法是:第一个查询很糟糕.它可能会创建这个巨大的记录集然后使用Where子句与实际记录集相关联.因此,它对性能不利.而且它是非ansi.所以这是双重的坏事.
然而,经过一些谷歌搜索,似乎它们在理论上几乎是一样的.它们都符合ANSI标准.
所以我的问题是:
两者之间有什么区别吗?
SELECT *
FROM TABLE_A a
JOIN TABLE_B b
ON a.propertyA = b.propertyA
Run Code Online (Sandbox Code Playgroud)
和查询
SELECT * from TABLE_A a, TABLE_B b where a.propertyA=b.propertyA.
Run Code Online (Sandbox Code Playgroud) 根据下面的代码示例,使用JOIN而不是WHERE子句是否存在性能差异(或任何其他原因):
EX1.
select *
from table_1, table_2
where table_1.id=table_2.id;
Run Code Online (Sandbox Code Playgroud)
EX2.
select *
from table_1
join table_2 on
table_1.id = table_2.id;
Run Code Online (Sandbox Code Playgroud) 我无法有效地理解这两个查询之间的区别.
select *
from person p, mytlc m
where p.personid = m.personid and p.personid = 3635
select *
from person p
join mytlc m on p.personid = m.personid
where p.personid=3635
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我认为两者都不会是性能更好的查询;但是,如果查询处理更多数据更复杂,该怎么办?
谢谢!
有人告诉我两个查询之间有什么区别:
select p.LastName, o.OrderNo
from Persons p, Orders o
where p.P_Id = o.P_Id
Run Code Online (Sandbox Code Playgroud)
...和...
select p.LastName, o.OrderNo
from Persons p
join Orders o on p.P_Id = o.P_Id
Run Code Online (Sandbox Code Playgroud) sql ×6
join ×3
mysql ×2
oracle ×2
sql-server ×2
ansi ×1
cartesian ×1
database ×1
informix ×1
inner-join ×1
performance ×1
product ×1
select ×1
t-sql ×1
where ×1