这两个sql语句相同吗?或者至少给出相同的答案?

tuwxkamq  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(294)
SELECT MID  
FROM Authors, Writes   
WHERE Authors.ID=Writes.ID AND Name = ‘J. R. Hartley’;   

SELECT MID  
FROM Writes  
WHERE W.ID IN     (SELECT A.ID  
                FROM Authors A   
                WHERE A.Name = "J. R. Hartley");

如何设置数据库的图像
https://imgur.com/a/krkk5a7
答案是分数方案。底部是我的。我想他们会给你同样的结果,但我没有信心。他们的方式也更好吗?
谢谢

camsedfj

camsedfj1#

是的,这两个查询产生相同的结果。
第一个查询使用旧式联接,如果您是从sql开始的,那么应该避免使用这种联接。
正确的书写方法是:

SELECT MID  
FROM Writes w INNER JOIN Authors a   
ON a.ID = w.ID AND a.Name = 'J. R. Hartley';

我更喜欢第二个查询,但您应该更改运算符 IN= 由于保证子查询只返回1行(或无):

SELECT MID  
FROM Writes  
WHERE ID = (SELECT ID FROM Authors WHERE Name = 'J. R. Hartley');
guicsvcw

guicsvcw2#

这两个查询是不同的。让我从第二个问题开始:

SELECT w.MID  
FROM Writes w 
WHERE W.ID IN (SELECT A.ID  
               FROM Authors A   
               WHERE A.Name = 'J. R. Hartley'
              );

此查询保证不会从中返回重复的行 Writes .
让我将第一个查询重写为 JOIN (这是等效的,应该是您学习sql的方式):

SELECT w.MID  
FROM Authors a JOIN
     Writes w  
     ON w.ID = a.ID AND a.Name = 'J. R. Hartley';

注意,我已经限定了列引用。这是一个区别。如果两个表都有 Name 列。这个 IN 版本不会有此问题。
更重要的区别是,这可能会复制 Writes ,如果 id 在中复制 Authors . 您没有指定 id 是唯一的或主键,所以这是可能的。
在某些情况下,您编写的两个查询是等价的。但在其他情况下,一个运行,另一个返回错误。或者当它们不返回相同的结果集时。因此,二者并不等同。

相关问题