首页 > 挨踢(IT), 数据库 > SQL语句性能比较

SQL语句性能比较

2012年11月2日 发表评论 阅读评论 339 人阅读    

  前两天在逛CSDN的时候,无意间看到一篇帖子,觉得不错。今天整理一下,发布出来,和大家一起讨论讨论。

  SQL的逻辑很简单:查询一张表中列A不是aValue或者列B不是bValue的记录。这样说可能不是太明白,我们直接用SQL来描述吧。SQL如下:

SELECT *
  FROM test
 WHERE id NOT IN 
       (SELECT id
          FROM test
         WHERE columnA = 'aValue'
           AND columnB = 'bValue');

  学过数理逻辑的童鞋们应该知道经过逻辑推理还可以又下面三种写法。如下:

SELECT *
  FROM test
 WHERE NOT (columnA = 'aValue' AND columnB = 'bValue');

  还能这样写:

SELECT *
  FROM test
 WHERE (columnA <> 'aValue' OR columnB <> 'bValue');

  还能这样写:

SELECT *
  FROM test
 WHERE ((columnA <> 'aValue' AND columnB <> 'bValue') 
       OR (columnA <> 'aValue' AND columnB = 'bValue') 
       OR (columnA = 'aValue' AND columnB <> 'bValue'));

  配上EXISTS关键字,还能这样写:

SELECT *
  FROM test a
 WHERE NOT EXISTS 
       (SELECT 1 
          FROM test b 
         WHERE b.columnA = 'aValue' 
           AND b.columnB = 'bValue' 
           AND a.id = b.id);

  在学“集合论”,或者在看关系型数据库入门知识时,应该还学过一个关系的减法操作。对应SQL中的关键字是EXCEPT(在Oracle是MINUS)。用上这个操作,还能这样写:

SELECT *
  FROM test 
 MINUS
  SELECT *
    FROM test
   WHERE columnA = 'aValue'
     AND columnB = 'bValue';

  另外,还可以使用关键字UNION。这时的SQL这样写:

SELECT *  FROM test WHERE columnA <> 'aValue'
UNION ALL
SELECT *  FROM test WHERE columnB <> 'bValue';

  真是没想到,一条简单的SQL语句,竟然有这么多中写法?!是不是眼花缭乱啊?!是不是有”有时候,我们痛苦的不是没有选择,而是选择太多”的感慨啊?!哈哈

  不过,有一个问题,相信也是很多人的问题:这么多种写法,哪种写法的效率最高呢?欲知后文如何,请听下回分解。



作 者: D瓜哥,https://www.diguage.com/
原文链接:https://www.diguage.com/archives/21.html
版权声明:非特殊声明均为本站原创作品,转载时请注明作者和原文链接。

  1. ghl0903
    2012年11月2日15:11 | #1

    7的话 合并会不会有重复的记录啊,比如说既符合A条件的又符合B条件的

  2. 2012年11月14日08:17 | #2

    初步猜测,实例4的效率最高

  3. coolgirl
    2012年11月29日17:02 | #3

    SELECT *
    FROM test
    WHERE (columnA ‘aValue’ OR columnB ‘bValue’);
    结果集合:当columnA’aVAlue’时和 columnB ‘bValue’会有重复记录吧,类比示例-2,非(A and B)
    和 非A and 非B 应当是一类意思
    ——————————————————————————————————————–
    SELECT * FROM test WHERE columnA ‘aValue’
    UNION ALL
    SELECT * FROM test WHERE columnB ‘bValue’; 同样这个也是会有重复记录,请查证我的理解是否正确。

  1. 本文目前尚无任何 trackbacks 和 pingbacks.