mysql子查询-exists,not exists

(1)
实现让结果集A-结果集B:–利用not exists,合并则可用union
exists,not exists:用于判断且获取结果集A是否存在地结果集B中!
==========结果集A:
SELECT d.Device_ID,d.Device_Name,a.App_ID,a.App_Name
               FROM T_Device_BaseInfo d ,T_App_Spce_R_Info da ,T_App_Info a
               WHERE d.Spec_Code=da.Spec_Code AND da.App_ID=a.App_ID and  d.Device_ID=01;
+———–+————-+——–+—————-+
| Device_ID | Device_Name | App_ID | App_Name       |
+———–+————-+——–+—————-+
| 01        | coship01    | 01     | maliao         |
| 01        | coship01    | 02     | maliao         |
| 01        | coship01    | 03     | red alert      |
| 01        | coship01    | 05     | COD            |
| 01        | coship01    | 08     | flashplayer    |
| 01        | coship01    | 09     | flashplayer6.0 |
+———–+————-+——–+—————-+   6 rows in set (0.00 sec)
==========结果集B:
mysql> select * from T_Device_App_R_Info where Device_ID=01;
+—-+———–+——–+——+————+
| ID | Device_ID | App_ID | Opr  | Setup_Date |
+—-+———–+——–+——+————+
| 64 | 01        | 01     | 2    | NULL       |
| 65 | 01        | 03     | 2    | NULL       |
+—-+———–+——–+——+————+        2 rows in set (0.00 sec)
 
==========结果集A-结果集B:
SELECT d.Device_ID,d.Device_Name,a.App_ID,a.App_Name
       FROM T_Device_BaseInfo d ,T_App_Spce_R_Info da ,T_App_Info a
       WHERE d.Spec_Code=da.Spec_Code AND da.App_ID=a.App_ID  and  d.Device_ID=01
       and
NOT EXISTS(select * from T_Device_App_R_Info tt where tt.Device_ID=d.Device_ID and a.App_ID=tt.App_ID);
+———–+————-+——–+—————-+
| Device_ID | Device_Name | App_ID | App_Name       |
+———–+————-+——–+—————-+
| 01        | coship01    | 02     | maliao         |
| 01        | coship01    | 05     | COD            |
| 01        | coship01    | 08     | flashplayer    |
| 01        | coship01    | 09     | flashplayer6.0 |
+———–+————-+——–+—————-+   4 rows in set (0.00 sec)
若要获取只有结果集中存在的,只须将not exists改为exists即可。
 
(2)使用ALL进行子查询–MySql数据库
ALL关键词必须后面接一个比较操作符。
ALL的意思是“对比于子查询返回的列中的所有值,如果比较结果为TRUE,则返回TRUE。”例如:
SELECT s1 FROM t1 WHERE s1 > ALL (SELECT s1 FROM t2);
假设表1中有一行包含(10)。
如果表t2包含(-5,0,+5),则表达式为TRUE,因为10比t2中的所有三个值都大。
如果表t2包含(12,6,NULL,-100),则表达式为FALSE,因为表t2中有一个值12大于10。
如果表t2包含(0,NULL,1),则表达式为unknown。
NOT IN是<> ALL的别名。因此,以下两个语句是相同的:
SELECT s1 FROM t1 WHERE s1 <> ALL (SELECT s1 FROM t2);
SELECT s1 FROM t1 WHERE s1 NOT IN (SELECT s1 FROM t2);
 
(3)使用ANY进行子查询–MySql数据库
ANY关键词必须后面接一个比较操作符(即>,<,=等)。ANY关键词的意思是“对于在子查询返回的列中的任一数值,例如:
SELECT s1 FROM t1 WHERE s1 > ANY (SELECT s1 FROM t2);
假设表t1中有一行包含(10)。如果表t2包含(21,14,7),则表达式为TRUE,因为t2中有一个值为7,该值小于10。如果表t2包含(20,10),或者如果表t2为空表,则表达式为FALSE。如果表t2包含(NULL, NULL, NULL),则表达式为UNKNOWN。
词语IN是”=ANY”的别名。因此,这两个语句是一样的:
SELECT s1 FROM t1 WHERE s1 = ANY (SELECT s1 FROM t2);
SELECT s1 FROM t1 WHERE s1 IN    (SELECT s1 FROM t2);
 
(4)
mysql的比较符:=  >  <  >=  <=  <>,应该也可以用!=。
但不用于多条件的限制查询,查询结果会是错误的。如:
        SELECT d.Device_ID,d.Device_Name,a.App_ID,a.App_Name,a.App_Memo
               FROM T_Device_BaseInfo d ,
                    T_App_Spce_R_Info da ,
                    T_App_Info a ,
                    T_Device_App_R_Info tt
               WHERE d.Spec_Code=da.Spec_Code
                AND da.App_ID=a.App_ID
                and d.Device_ID=01
                and d.Device_ID!=tt.Device_ID and a.App_ID!=tt.App_ID (此处);
本文出自 “Changes we need ! ” 博客,请务必保留此出处http://shenzhenchufa.blog.51cto.com/730213/269152
 » 本站地址:http://www.gomoth.com

标签: