CREATE TABLE test1 (
  id VARCHAR(10),
  name VARCHAR(20),
  age VARCHAR(10)
)ENGINE=MyISAM;
mysql> SELECT * FROM test1;
+------+------+------+
| id   | name | age  |
+------+------+------+
| 1990 | aaaa | cccc |
| 1991 | aaaa | cccc |
| 1992 | aaaa | cccc |
| 1993 | aaaa | cccc |
| 1994 | aaaa | cccc |
+------+------+------+
CREATE TABLE test2 (
  id VARCHAR(10),
  name VARCHAR(20),
  age VARCHAR(10)
)ENGINE=MyISAM;
mysql> SELECT * FROM test2;
+------+------+------+
| id   | name | age  |
+------+------+------+
| 1991 | xxxx | yyyy |
| 1992 | xxxx | yyyy |
| 1993 | xxxx | yyyy |
+------+------+------+-- 引言:
-- 关于EXISTS 语法说明
-- EXISTS 如果子查询存在行,则返回一个true
-- EXISTS 返回一个boolean 值  
-- ----------------------------------------------------------------------
SELECT * FROM test1 WHERE NOT EXISTS (SELECT 1 FROM test2);Empty set (0.00 sec)-- 这个子查询里面确实有值,因该前面有NOT EXISTS .所有返回为 false 
-- 个人翻译这句话为:SELECT * FROM test1 WHERE 1=0;-- ------------------------------------------------------------------------ 以下是要提问的问题
-- ----------------------------------------------------------------------
SELECT * FROM test1 WHERE NOT EXISTS (SELECT 1 FROM test2 WHERE test1.id = test2.id);+------+------+------+
| id   | name | age  |
+------+------+------+
| 1990 | aaaa | cccc |
| 1994 | aaaa | cccc |
+------+------+------+
2 rows in set (0.00 sec)-- 根据上面的那个例子来看, 子查询里面如果有数据,加上前面用了NOT EXISTS语法,就应该返回一个 false
-- 这个子查询一样可以查出数据,所有应该返回一个boolean值,返回:false.
-- 也应该翻译成 SELECT * FROM test1 WHERE 1=0;
-- 那为什么这样会有结果集返回?
-- ----------------------------------------------------------------------

解决方案 »

  1.   

    有条件:WHERE test1.id = test2.id
    去掉这句试试
      

  2.   

    SELECT * FROM test1 WHERE NOT EXISTS (SELECT 1 FROM test2 WHERE test1.id = test2.id);:
    等同于:
    SELECT a.* FROM test1 a left join test2 b
    on a.id=b.id 
    WHERE b.id is null;
      

  3.   

    比如TEST1中的 1991,在TEST2中有,则SELECT 1 有结果,NOT EXISTS返回FALSE
    1990 ,在TEST2中无,则SELECT 1 没有结果,NOT EXISTS返回TRUE
      

  4.   

    这个理解并不准确。
    下面我们来分析你的问题。SELECT * FROM test1 WHERE NOT EXISTS (SELECT 1 FROM test2 WHERE test1.id = test2.id);MYSQL会对test1 进行逐条记录进行处理。第1条记录  | 1990 | aaaa | cccc |, 针对这条记录进行WHERE条件判断   NOT EXISTS (SELECT 1 FROM test2 WHERE test1.id = test2.id); 把此时的test1.id 值1990 代入 变为   NOT EXISTS (SELECT 1 FROM test2 WHERE 1990 = test2.id); 而 SELECT 1 FROM test2 WHERE 1990 = test2.id 返回是空集, 这样   NOT EXISTS (SELECT 1 FROM test2 WHERE 1990 = test2.id);  即为 TRUE, 所以 第1条记录  | 1990 | aaaa | cccc | 的WHERE条件判断为真。
      

  5.   


    请问。如果这个语句,有多了一个表,请问这么把它改成left join的形式。例如SELECT * FROM test1 WHERE NOT EXISTS (SELECT 1 FROM test2 ,test3 WHERE test1.id = test2.id and test1.id=test3.id and test2.id=test3.id);