原来是这样的SELECT name 
FROM emp e1
WHERE exists (SELECT 0 FROM emp e2 WHERE e1.name ='A');
+------+
| name |
+------+
| A    |
+------+
--进行比较
SELECT name 
FROM emp e1
WHERE exists (SELECT 0 FROM emp e2 WHERE e2.name ='A');
+------+
| name |
+------+
| A    |
| B1   |
| B2   |
+------+

解决方案 »

  1.   

    首先要知道,EXISTS 相当于是一个布尔运算符,其后面的子查询如果返回记录,则为真,否则为假.1
    SELECT * FROM T_Order WHERE EXISTS
    (SELECT *  FROM T_User  WHERE T_Order.user_name=T_User.name);当子查询中当前T_Order记录的user_name字段与T_User.name字段相等时,子查询才会返回记录,此时EXISTS为真,则选择当前记录.因A=A结果为真,B=B为真,所以选择了这两条,但在其它记录时,因为T_Order.user_name=T_User.name这个条件不满足,所以子查询没返回记录,此时EXISTS为假,所以不选择当前记录.2.
    SELECT * FROM T_Order WHERE EXISTS
    (SELECT *  FROM T_Order WHERE T_Order.user_name='A');这个子查询的条件,只是在查T_Order中是否有那么一条记录user_name='A'的记录,这个结果恒有值,除非你删掉那个用户名为A的记录,即EXISTS恒为真,所以每条记录都会被选出来.
      

  2.   

    楼上的正解!1.
    SELECT * FROM T_Order WHERE EXISTS
    (SELECT *  FROM T_User  WHERE T_Order.user_name=T_User.name);执行的方式是: 对 T_Order 表的每条记录,拿这条记录中的 user_name 值在 T_User中搜索,
    如果匹配,就选出该记录. 依次循环执行...2.
    SELECT * FROM T_Order WHERE EXISTS
    (SELECT *  FROM T_Order WHERE T_Order.user_name='A');执行的方式是: 对 T_Order 表的每条记录, 判断where 条件是否为真, 
    如果是, 就选出该记录, 依次循环执行...这和 select * from t_order where 1=1 是一个道理.
      

  3.   

    我认为是先将SELECT * FROM T_Order 得到结果,然后剔除不符合WHERE EXISTS子句的结果,是应该这样吧?
    mysql> select name from emp;
    +------+
    | name |
    +------+
    | A    |
    | B1   |
    | B2   |
    | A    |
    +------+mysql> SELECT name FROM emp WHERE EXISTS
        -> (SELECT name  FROM emp WHERE emp.name='A');
    +------+
    | name |
    +------+
    | A    |
    | B1   |
    | B2   |
    | A    |
    +------+如果是依次循环执行,SELECT name  FROM emp WHERE emp.name='A'会有两次返回true,那就会出现
    两个
    +------+
    | name |
    +------+
    | A    |
    | B1   |
    | B2   |
    | A    |
    +------+
    这个查询应该是先处理SELECT name FROM emp 然后根据子句筛选结果吧
      

  4.   

    不然下面的情况很难解释了SELECT name 
    FROM emp e1
    WHERE exists (SELECT 0 FROM emp e2 WHERE e1.name ='A');
    +------+
    | name |
    +------+
    | A    |
    | A    |
    +------+------------------进行比较
    SELECT name 
    FROM emp e1
    WHERE exists (SELECT 0 FROM emp e2 WHERE e2.name ='A');
    +------+
    | name |
    +------+
    | A    |
    | B1   |
    | B2   |
    | A    |
    +------+