2

这是一个没有使用连接的假设(甚至可能是一个幼稚的)示例。假设您有一个 users 表,并且您必须列出分配给特定角色的所有用户。一条 SQL 语句可以表示为:

SELECT u.username
FROM users u, roles r
WHERE (u.roleid = r.id AND r.id = 5);

如果您假设存在关系,以下是否意味着相同的事情或需要某种形式的连接?:

SELECT u.username
FROM users u, roles r
WHERE r.id = 5;
4

4 回答 4

2

第二个查询是隐式交叉连接(也称为笛卡尔连接)的示例 - 来自用户的每条记录都将连接到来自角色的每条记录id=5,因为所有这些组合都会使where子句评估为真。

于 2013-06-16T15:36:45.670 回答
0

需要连接才能返回正确的数据

SELECT u.username
FROM users u
JOIN roles r
ON u.roleid = r.id
WHERE r.id = 5;

我认为最好使用显式连接来确定哪些列有关系,而不是在子句ON中使用 realtionshipWHERE

于 2013-06-16T15:35:08.700 回答
0

您需要两个相同类型的列来为每个表加入 JOIN 。您需要连接谓词ON u.roleid = r.id来获取正确的数据。

内连接通过基于连接谓词组合两个表(A 和 B)的列值来创建一个新的结果表。该查询将 A 的每一行与 B 的每一行进行比较,以找到满足连接谓词的所有行对。当满足连接谓词时,将 A 和 B 的每对匹配行的列值组合成一个结果行。连接的结果可以定义为首先取表中所有记录的笛卡尔积(或交叉连接)(将表 A 中的每条记录与表 B 中的每条记录相结合)的结果——然后返回满足加入谓词。

于 2013-06-16T15:37:47.297 回答
0

不。在第二个版本中,表之间没有关系。子句中的,运算符表示. 第二个示例将至少返回所有用户一次(取决于第二个表中匹配的数量)。否则它将不返回任何行(如果第二个表中没有匹配项)。fromcross join

如果第二个例子是:

SELECT u.username
FROM users u, roles r
WHERE r.id = 5 and u.id = 5

那么他们的意思是一样的。写这个更清晰更好的方法是:

SELECT u.username
FROM users u cross join roles r
WHERE r.id = 5 and u.id = 5

或使用正确的inner join语法:

SELECT u.username
FROM users u join
     roles r
     on r.id = u.id
WHERE r.id = 5  /* this could also be in the `on` clause */
于 2013-06-16T15:37:56.260 回答