选择多个表格

时间:2013-06-16 15:33:02

标签: sql

这是一个没有使用连接的假设(甚至可能是一个天真的)示例。考虑您有一个用户表,您必须列出分配给特定角色的所有用户。 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 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

要求连接返回正确的数据

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

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

答案 2 :(得分:0)

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

  

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

答案 3 :(得分:0)

没有。在第二个版本中,表之间没有任何关系。 ,子句中的from运算符表示cross 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 */