如何在不使用JOIN关键字的情况下实现SQL连接?
这不是必要的,但我认为通过这样做我可以更好地理解联接实际上做了什么.
我正在执行多个查询(来自我网站的不同部分)
有些是这样的:
SELECT field, field1
FROM table1, table2
WHERE table1.id = table2.id
AND ....
Run Code Online (Sandbox Code Playgroud)
有些是这样的:
SELECT field, field1
FROM table1
JOIN table2
USING (id)
WHERE ...
AND ....
Run Code Online (Sandbox Code Playgroud)
有些是这样的:
SELECT field, field1
FROM table1
LEFT JOIN table2
ON (table1.id = table2.id)
WHERE ...
AND ....
Run Code Online (Sandbox Code Playgroud)
哪些查询更好,或更慢/更快或更标准?
可能重复:
显式vs隐式SQL连接
使用多表中的join和select有区别吗?
SQL连接:SQL ANSI标准的未来(vs加入)?
JOIN和在FROM子句中声明多个表有什么区别?
如:
SELECT *
FROM table1 AS t1,
table2 AS t2
WHERE t1.id = t2.id
Run Code Online (Sandbox Code Playgroud)
相比:
SELECT *
FROM table1 AS t1
INNER JOIN table2 AS t2 ON t2.id = t1.id
Run Code Online (Sandbox Code Playgroud) 我遇到了以不同的方式编写查询,如下面的Type-I所示
SELECT JS.JobseekerID
, JS.FirstName
, JS.LastName
, JS.Currency
, JS.AccountRegDate
, JS.LastUpdated
, JS.NoticePeriod
, JS.Availability
, C.CountryName
, S.SalaryAmount
, DD.DisciplineName
, DT.DegreeLevel
FROM Jobseekers JS
INNER
JOIN Countries C
ON JS.CountryID = C.CountryID
INNER
JOIN SalaryBracket S
ON JS.MinSalaryID = S.SalaryID
INNER
JOIN DegreeDisciplines DD
ON JS.DegreeDisciplineID = DD.DisciplineID
INNER
JOIN DegreeType DT
ON JS.DegreeTypeID = DT.DegreeTypeID
WHERE
JS.ShowCV = 'Yes'
Run Code Online (Sandbox Code Playgroud)
II型
SELECT JS.JobseekerID
, JS.FirstName
, JS.LastName
, JS.Currency
, JS.AccountRegDate
, JS.LastUpdated
, …Run Code Online (Sandbox Code Playgroud) 我一直在寻找广泛,但我找不到答案,可能是因为我无法找出正确的方式来提问.所以这就是:有没有理由更喜欢这两个查询中的任何一个?
SELECT * FROM table1, table2 WHERE table1.id = table2.id;
Run Code Online (Sandbox Code Playgroud)
和
SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.id;
Run Code Online (Sandbox Code Playgroud)
问题源于我正在尝试优化的更复杂的查询,但我认为这两个查询包含问题的本质,并希望以这种方式询问它对其他人更有用.提前致谢.
我是 SQL 菜鸟,我有 2 个查询:
SELECT
A.COLUMN1,B.COLUMN2, C.COLUMN3
FROM
TB_ITEM A,
TB_ITEM_CAT B,
TB_ITEM_SUBCAT C
WHERE
A.COLUMN1 = B.COLUMN1
AND A.COLUMN1 = c.COLUMN1
Run Code Online (Sandbox Code Playgroud)
和
SELECT
A.COLUMN1,B.COLUMN2, C.COLUMN3
FROM
TB_ITEM A
INNER JOIN TB_ITEM_CAT B on A.COLUMN1 = B.COLUMN1
INNER JOIN TB_ITEM_SUBCAT C on A.COLUMN1 = C.COLUMN1
Run Code Online (Sandbox Code Playgroud)
在第一个查询中,我们没有 INNER JOINS,并从 3 个表中进行选择。在第二个中,我们使用 INNER JOINS 进行相同的查询,并从 3 个表中进行选择。
他们应该显示相同的结果?这些查询之间有什么区别?
我的数据库教授告诉我们使用:
SELECT A.a1, B.b1 FROM A, B WHERE A.a2 = B.b2;
Run Code Online (Sandbox Code Playgroud)
而不是:
SELECT A.a1, B.b1 FROM A INNER JOIN B ON A.a2 = B.b2;
Run Code Online (Sandbox Code Playgroud)
据推测,Oracle不喜欢JOIN-Syntaxes,因为这些JOIN语法比笛卡尔积的WHERE限制更难优化.
我无法想象为什么会出现这种情况.唯一的性能问题可能是解析器需要更多地解析几个字符.但在我眼里,这一点可以忽略不计.
我发现了这个Stack Overflow问题:
这篇文章在Oracle文档中:https://docs.oracle.com/cd/B19306_01/server.102/b14200/queries006.htm
Oracle建议您使用FROM子句OUTER JOIN语法而不是Oracle join运算符.
有人可以通过链接向我提供Oracle的最新建议.因为她不承认StackOverflow(这里可以回答所有人),10g文档在这里是过时的.
如果我错了,Oracle真的不喜欢JOINS现在比那还好,但是我找不到文章.我只是想知道谁是对的.
非常感谢能帮助我的每个人!
我正在查看由不熟悉SQL的开发人员维护的代码.我在他的代码中经常看到以下代码片段:
SELECT *
FROM person, status
WHERE person.status_id = status.id
Run Code Online (Sandbox Code Playgroud)
我已向他建议他使用以下代码:
SELECT *
FROM person
INNER JOIN status ON status.id = person.status_id
Run Code Online (Sandbox Code Playgroud)
他指出,在这种特殊情况下,两个查询在相同的时间范围内返回相同的结果(67毫秒中的34k行).我的新查询在这种情况下没有改变任何事实这一事实证明了这种方法没有任何问题.我曾尝试向他解释笛卡尔等产品,但他坚持认为这种方法没有任何问题.有人可以帮助提供负面的例子,说明依赖于此的方法会失败,和/或为什么从实施的角度来看这种查询行是危险的?
假设我有这样的查询:
SELECT
s.staffID as staffID,
CONCAT_WS(", ", lname, fname) AS name,
GROUP_CONCAT(unit SEPARATOR ", ") AS units
FROM
staff s,
units u,
staff_units r
WHERE
s.staffID = r.staffID
AND u.unitID = r.unitID
GROUP BY s.staffID
ORDER BY lname
Run Code Online (Sandbox Code Playgroud)
这得到一个这样的列表:
Alice Accounting
Bob Systems
Charlie Customer Services, Administration
Run Code Online (Sandbox Code Playgroud)
好的,到目前为止.现在假设我删除了staff_units记录Alice作为Accounting成员的条目.然后,运行此查询将生成一个列表,从中排除Alice,即使她仍然存在于staff表中:
Bob Systems
Charlie Customer Services, Administration
Run Code Online (Sandbox Code Playgroud)
我可以调整这个SQL,以便它继续返回Alice,结果显示她未分配给一个单元吗?
我当然可以运行一个查询来获取人员列表,并为每个人员查询另一个查询以获取当前分配.但这意味着要运行n + 1个查询来构建列表,其中n是人员数量,这只是让我错了.
以下2个SQL脚本的结果集看起来相同.但应该有一些区别.那是什么?
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons, Orders
WHERE Persons.Id_P = Orders.Id_P
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P = Orders.Id_P
Run Code Online (Sandbox Code Playgroud)
性能有何不同?
我刚刚比较了SQL Server 2008 R2上的实际查询计划.它们完全相同.所以没有性能差异.内部联接用于两种情况.
mysql ×6
sql ×6
join ×5
database ×3
inner-join ×3
left-join ×1
oracle ×1
performance ×1
sql-server ×1