在连接后跟 where 子句的情况下,使用子查询来限制结果,然后进行连接会更好吗?例子:
SELECT *
FROM Customers
NATURAL JOIN Orders
WHERE shipped=1
Run Code Online (Sandbox Code Playgroud)
在这种情况下,它接缝 DBMS 将整个客户表与整个订单表连接,然后根据 where 子句过滤结果。使用子查询的等效查询是:
SELECT *
FROM Customers
NATURAL JOIN (SELECT *
FROM Orders
WHERE shipped=1) AS O
Run Code Online (Sandbox Code Playgroud)
在这里,可能有一个较小的 Orders 表要加入。同样,如果有限制客户和订单的 where 子句:
SELECT *
FROM Customers
NATURAL JOIN Orders
WHERE country='US' AND shipped=1
(assuming country attribute belongs to Customers table)
Run Code Online (Sandbox Code Playgroud)
等效的子查询查询:
SELECT *
FROM (SELECT *
FROM Customers
WHERE country='US') AS C
NATURAL JOIN (SELECT *
FROM Orders
WHERE shipped=1) AS O
Run Code Online (Sandbox Code Playgroud) select(投影)的列字段中的子查询如何与主查询的结果配对?形式:
SELECT id,email,(SELECT name From Names WHERE Names.id=Users.id) as name
FROM Users
Run Code Online (Sandbox Code Playgroud)
子查询是从 , 的输出中每行执行一次SELECT id,email FROM Users,因此应该LIMIT 1在子查询上使用(因为子查询中只有 1 行可以与主查询中的一行配对),还是子查询运行一次,并且然后每个结果都与来自 的相应行配对SELECT id,email FROM Users,很像等效连接:SELECT id,email,name FROM Users JOIN Names ON Users.id=Names.id
我对关系代数中联合运算的结果表/关系有疑问。结果关系没有主键吗?或者它返回一个带有隐藏主键的表?
示例:假设我们取以下两个表的并集:
R1:
id | name
----------
1 a
2 b
3 c
R2:
id | name
----------
1 b
2 c
3 d
Run Code Online (Sandbox Code Playgroud)
其中属性“id”是关系 R1 和 R2 中的主键,现在这两者的并集将是:
id | name
------------
1 a
1 b
2 b
2 c
3 c
3 d
Run Code Online (Sandbox Code Playgroud)
现在,结果关系中的任何属性都不能成为主键,因为 id 和 name 都包含重复项。DBMS 如何解决这个问题?