代码之家  ›  专栏  ›  技术社区  ›  Sumit raj

这两个查询有何不同?两个都给出了相同的结果

  •  1
  • Sumit raj  · 技术社区  · 8 年前
    select a.MenuID,a.MenuStructureID,b.MenuName from 
    MenuStructure a, Menu b
    where b.MenuID=a.MenuID
    
    select a.MenuID,a.MenuStructureID,b.MenuName from 
    MenuStructure a
    join Menu b  
    on b.MenuID=a.MenuID
    

    如果两个都一样,我应该选择哪一个,为什么?

    3 回复  |  直到 8 年前
        1
  •  2
  •   MatBailie    8 年前

    对于非常简单的查询,很难证明使用 JOIN 而不是 , . 如你所见,两者非常相似。如果布局稍有不同,那就更明显了…

    SELECT
      a.MenuID, a.MenuStructureID, b.MenuName
    FROM
      MenuStructure a
    ,
      Menu b  
        WHERE b.MenuID = a.MenuID
    
    SELECT
      a.MenuID, a.MenuStructureID, b.MenuName
    FROM
      MenuStructure a
    INNER JOIN
      Menu b  
        ON b.MenuID = a.MenuID
    

    出现 好像它只是在替代 , 具有 加入 替换 WHERE 具有 ON

    但是,只要编写更复杂的查询,就更容易阅读 加入 一开始就很难犯错误…


    缺少谓词

    例如,这两种方法都是错误的,但只有 加入 符号会产生语法错误 (一开始更容易看到) .

    SELECT
      a.MenuID, a.MenuStructureID, b.MenuName
    FROM
      MenuStructure a
    ,
      Menu b  
    ,
      Items i  
        WHERE b.MenuID = a.MenuID
    
    SELECT
      a.MenuID, a.MenuStructureID, b.MenuName
    FROM
      MenuStructure a
    INNER JOIN
      Menu b  
        ON b.MenuID = a.MenuID
    INNER JOIN
      Items i
    

    第一个查询运行良好,相当于 CROSS JOIN Items i ,这可能运行起来很昂贵,调试起来也很麻烦。

    但是,第二个查询在附近有语法错误 JOIN Items i 由于缺少谓词 ON i.MenuID = b.MenuID (或类似) .

    这样的语法错误对于捕获打字错误和其他愚蠢的错误非常有帮助。 早期的 .


    外部连接

    使用时,它也变得更加清晰 OUTER JOIN 与使用相比 (+)

    SELECT
      a.MenuID, a.MenuStructureID, b.MenuName
    FROM
      MenuStructure a
    LEFT OUTER JOIN
      Menu b  
        ON b.MenuID = a.MenuID
    

    与旧的符号相比…

    SELECT
      a.MenuID, a.MenuStructureID, b.MenuName
    FROM
      MenuStructure a, Menu b
    WHERE
      b.MenuID=a.MenuID(+)
    

    不仅是 外部连接 更容易阅读,如果你错误地输入以下内容,你会得到不同的结果! (细微的打字错误又是合法的,但很难发现后果。)

    SELECT
      a.MenuID, a.MenuStructureID, b.MenuName
    FROM
      MenuStructure a, Menu b
    WHERE
      a.MenuID=b.MenuID(+)
    


    甚至还有一些表达 可以 用……写 外部连接 那个 不能 用……写 , (+) . (我把它留给你研究。)

    因此,几乎每个主要发行版都建议不要使用 (+)

    • 如果你不打算使用 (+) 你需要使用 外部连接 .
    • 如果你要用 外部连接 ,您没有使用 ,
    • 真的不混合 , 具有 外部连接


    传播使用的主要“罪魁祸首”之一 , 是甲骨文。它的教程和帮助文件充满了 , . 但即使是甲骨文也建议不要使用 (+) !


    结论

    全部 加入 语法更容易阅读,并且在以下情况下更容易出现语法错误: , 可能会出现无声的故障。

    介绍时 外部连接 这变得复杂,甚至导致 , (+) 无法处理。


    更不用说了 加入 1992年编纂。你为什么要使用比这更古老的标准??

        2
  •  2
  •   marc_s MisterSmith    7 年前

    通常,显式连接(底部版本)更容易读取/调试。因此,如果其他人需要使用相同的代码,或者您需要在很长一段时间后检查它,这是首选。

        3
  •  1
  •   Mahesh.K    8 年前

    如果你想连接两个表,你可以用两种方式。一个使用符合ANSI的内部联接,另一个使用旧样式联接

    但最好不要使用老式的连接。这就是原因。

    让我们创建以下数据集

    CREATE TABLE item_master(item_id INT, item_description VARCHAR(100));
    CREATE TABLE item_sales(item_id INT, sales_date DATETIME, qty INT);
    INSERT INTO item_master
    SELECT 1,'Samsung' UNION ALL
    SELECT 2,'LG'; 
    INSERT INTO item_sales
    SELECT 1,'2015-04-03 12:10:10',2 UNION ALL
    SELECT 2,'2015-06-11 07:22:00',3 UNION ALL
    SELECT 2,'2015-06-12 11:00:48',22; 
    

    如果要显示每个项目的描述以及销售的总数量,可以使用此代码

    方法1:内部连接

    SELECT item.item_description,SUM(details.qty) AS qty FROM item_master AS item
    INNER JOIN item_sales AS details
    ON item.item_id=details.item_id
    GROUP BY item.item_description;
    

    方法2:使用WHERE子句的旧式联接

    SELECT item.item_description,SUM(details.qty) AS qty FROM item_master AS item
    ,item_sales AS details
    WHERE item.item_id=details.item_id
    GROUP BY item.item_description;
    

    两者都返回以下结果

    item_description qty
     ------------------- ----------
     LG 25
     Samsung 2
    

    但是如果你错误地忽略了方法2中的Where条件会发生什么呢?

    SELECT item.item_description,SUM(details.qty) AS qty FROM item_master AS item
    ,item_sales AS details
    GROUP BY item.item_description;
    

    结果是

    item_description qty
     ------------------- ----------
     LG 27
     Samsung 27
    

    这是完全错误的,因为它导致交叉连接

    但如果未指定联接,方法1将引发错误

    SELECT item.item_description,SUM(details.qty) AS qty FROM item_master AS item
    INNER JOIN item_sales AS details
    GROUP BY item.item_description;
    

    错误是

    Incorrect syntax near the keyword 'group'.
    

    参考文献: SQL SERVER – Why Should You Not to Use Old Style JOIN?