我有多个连接,包括mysql中的左连接.有两种方法可以做到这一点.
我可以在每次加入后立即设置"ON"条件:
select*from A join B ON(A.bid = B.ID)join C ON(B.cid = C.ID)join D ON(c.did = D.ID)
我可以将它们全部放在一个"ON"子句中:
select*from A join B join C join D ON(A.bid = B.ID AND B.cid = C.ID AND c.did = D.ID)
哪种方式更好?
如果我在查询中需要左连接或右连接,它是否不同?
我访问过许多网站,找到关于哪个更好的答案,即ANSI或非ANSI语法。这两个查询有什么区别?
select a.name,a.empno,b.loc
from tab a, tab b
where a.deptno=b.deptno(+);
Run Code Online (Sandbox Code Playgroud)
和:
select a.name,a.empno,b.loc
from tab a
left outer join tab b on a.deptno=b.deptno;
Run Code Online (Sandbox Code Playgroud)
在两种情况下结果都是相同的。第二个查询也更长。哪一个更好?
假设是否基于需要连接它们的条件在上面的查询中添加了另一个表Salgrade?..谁能假设一张桌子并给我解释
下面两个查询之间有什么区别
UPDATE
这个问题已在类似的问题中得到解答,这里有LEFT JOIN和LEFT OUTER JOIN在SQL Server中.
SELECT * FROM ca
LEFT JOIN exam
ON ca.subject = exam.subject
Run Code Online (Sandbox Code Playgroud)
和
SELECT * FROM ca
LEFT OUTER JOIN exam
ON ca.subject = exam.subject
Run Code Online (Sandbox Code Playgroud)
表
Table 'CA'
--------------------
subject|score
----------------
ENG |25
MTH |34
BIO |18
Table 'Exam'
--------------------
subject|score
----------------
ENG |25
Run Code Online (Sandbox Code Playgroud)
运行2个查询会在mysql,sqlserver 2008中产生相同的结果.我没有在Oracle中测试.
subject | score1 | subject | score1
--------------------------------------
ENG 14 ENG 44
MTH 28 NULL NULL
BIO 22 NULL NULL
Run Code Online (Sandbox Code Playgroud)
OUTER子句的目的是什么?
我正在使用mysql这是一个我很快写的查询,但我觉得这可以使用JOINS进行优化.这是btw的一个例子.
users table:
id user_name first_name last_name email password
1 bobyxl Bob Cox bob@gmail.com pass
player table
id role player_name user_id server_id racial_name
3 0 boby123 1 2 Klingon
1 1 example 2 2 Race
2 0 boby2 1 1 Klingon
Run Code Online (Sandbox Code Playgroud)
SQL
SELECT `player`.`server_id`,`player`.`id`,`player`.`player_name`,`player`.`racial_name`
FROM `player`,`users`
WHERE `users`.`id` = 1
and `users`.`id` = `player`.`user_id`
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用左连接,但有什么好处
SELECT `player`.`server_id`,`player`.`id`,`player`.`player_name`,`player`.`racial_name`
FROM `player`
LEFT JOIN `users`
ON `users`.`id` = `player`.`user_id`
WHERE `users`.`id` = 1
Run Code Online (Sandbox Code Playgroud)
有什么好处,我得到了相同的结果以太方式.
我正在尝试从数据库中获取一些数据。我Taak有一个可能的idPartij列的表。可能,因为它可以是真实的idPartij,但也可以是null。
我得到的查询:
SELECT T.idTaak,
T.Taaktype,
P.Partijnaam,
T.Naar,
T.UltimatumDatum,
T.Opmerking,
T.Status,
T.Prioriteit
FROM Taak AS T,
Partij AS P
WHERE T.idPartij = P.idPartij
ORDER BY idTaak DESC
Run Code Online (Sandbox Code Playgroud)
当我有一个 id 时T.idPartij,这工作正常,但如前所述,该 id 可以是null. 在这种情况下,该行将不会出现在结果中。
唯一的问题:当我删除 where 子句时,我得到了很多行(因为Partij表不再被过滤......
我对 SQL 完全是个菜鸟,所以我想不出“解决”这个问题的方法。我唯一能想到的是创建 2 个查询,但我认为这不是一个好方法...
我对RIGHT OUTER JOINs和真的很困惑LEFT OUTER JOINs。我真的很困惑如何正确使用它们。我在INNER JOIN. 我会问一些愚蠢的问题,但我问这些问题是为了让我正确理解它们。
我怎么知道哪张桌子应该放在右边和左边。这是由哪个连接决定的吗?
我问所有这些问题是因为我正在使用 AdventureWorks 数据库并且我正在对下面的查询执行 LEFT JOIN
Select SalesLT.Customer.CompanyName, SalesLT.SalesOrderHeader.SubTotal, SalesLT.SalesOrderHeader.TaxAmt
FROM SalesLT.Customer
LEFT OUTER JOIN SalesLT.SalesOrderHeader
ON SalesLT.Customer.CustomerID = SalesLT.SalesOrderHeader.CustomerID
Run Code Online (Sandbox Code Playgroud)
这是我得到的结果
A Bike Store NULL NULL
Progressive Sports NULL NULL
Advanced Bike Components NULL NULL
Modular Cycle Systems NULL NULL
Metropolitan Sports Supply NULL NULL
Aerobic Exercise Company NULL NULL
Associated Bikes NULL NULL
Rural Cycle Emporium NULL NULL
Sharp Bikes NULL NULL
Bikes and Motorbikes NULL …Run Code Online (Sandbox Code Playgroud) 我的查询看起来像:
SELECT * FROM users U LEFT JOIN posts P ON P.userId = U.id AND P.userId IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)
为什么查询还返回的结果,其中userId是null?
我知道,对于我的需求,我只能使用它INNER JOIN来获取与用户相关的帖子,但是它很奇怪,可以LEFT JOIN支持多个条件,但不能用于NOT NULL条件。
我的问题是关于在使用join和sub-query方法产生相同结果时的困境,
哪个更好更快?(纯粹来讲时间复杂度)
是否join采取O(M+N)时间复杂度?和sub-query需要O(M*N)吗?
我这样想是不是错了?如果是,请纠正我。
这里,(M,N)是两个表中的行数,将其组合以获得结果。
我正在寻找基于SQL标准的答案,而不仅仅是MySQL。
附言:我已经解决了这个问题及其所有答案。它本质上不关心时间复杂度部分。
据我所知,在两个表之间的左外连接(比如a和b)中,无论右表中行的值如何,都会检索连接左侧表的所有行.那么为什么我们需要一个'ON'子句来指定一个条件,如下所示:
select * from a LEFT OUTER JOIN b on a.some_column1 = b.some_column2;
Run Code Online (Sandbox Code Playgroud)
为什么需要声明"a.some_column1 = b.some_column2".
我对 MySQL 还很陌生,我不了解关键字 INNER和OUTER. 我明白它们的意思,但我不明白何时会在查询中真正输入关键字。似乎 aJOIN始终是 anINNER并且 aLEFT或RIGHTjoin 始终是OUTER。
因此,在什么情况下人们会使用关键字而不是简单地写JOIN(always INNER?) 和LEFT JOIN(always OUTER?)