您的位置:首页 > 其它

msyql中子查询IN,EXISTS,ANY,ALL,UNION介绍

2013-09-11 20:36 405 查看
因为在特定情况下,一个查询语句的条件需要另一个查询语句来获取

带IN关键字的子查询

IN 运算符用于 WHERE 表达式中,以列表项的形式支持多个选择,语法如下:

WHERE column IN (value1,value2,...)

WHERE column NOT IN (value1,value2,...)

当 IN 前面加上 NOT 运算符时,表示与 IN 相反的意思,即不在这些列表项内选择。



查询

SELECT ID,NAME FROM A  WHERE ID IN (SELECT AID FROM B)//查询B表中AID的记录

SELECT ID,NAME FROM A WHERE ID NOT IN (SELECT AID FROM B) 意思和上面相反

删除

delete from articles where id in (1,2,3); //删除id=1,id=2,id=3的记录

delete from articles where id not in (1);//删除id!=1的记录

代码如下复制代码
查询

SELECT ID,NAME FROM A  WHERE ID IN (SELECT AID FROM B)//查询B表中AID的记录

SELECT ID,NAME FROM A WHERE ID NOT IN (SELECT AID FROM B) 意思和上面相反

删除

delete from articles where id in (1,2,3); //删除id=1,id=2,id=3的记录

delete from articles where id not in (1);//删除id!=1的记录
此处首先查询出department表中所有d_id字段的信息,并将结果作为条件

接着查询employee表中以d_id为条件的所有字段信息

NOT IN的效果与上面刚好相反



带比较运算符的子查询
代码如下复制代码
mysql> SELECT d_id, d_name FROM department

-> WHERE d_id!=

-> (SELECT d_id FROM employee WHERE age=24);

+------+-----------+

| d_id | d_name |

+------+-----------+

| 1002 | 生产部 |

| 1003 | 销售部 |

+------+-----------+
2 rows in set (0.00 sec)这里查询出了哪些部门没有年龄为24岁的员工,看起来有点复杂

此外,运算符还有很多,这里不再赘述



带EXISTS关键字的子查询

MySQL EXISTS 和 NOT EXISTS 子查询语法如下:

SELECT ... FROM table WHERE EXISTS (subquery)

该语法可以理解为:将主查询的数据,放到子查询中做条件验证,根据验证结果(TRUE 或 FALSE)来决定主查询的数据结果是否得以保留。
代码如下复制代码
mysql> SELECT * FROM employee

-> WHERE EXISTS

-> (SELECT d_name FROM department WHERE d_id=1004);

Empty set (0.00 sec)
mysql> SELECT * FROM employee

-> WHERE EXISTS

-> (SELECT d_name FROM department WHERE d_id=1004);

Empty set (0.00 sec)此处内层循环并没有查询到满足条件的结果,因此返回false,外层查询不执行

NOT EXISTS刚好与之相反

当然,EXISTS关键字可以与其他的查询条件一起使用

条件表达式与EXISTS关键字之间用AND或者OR来连接
代码如下复制代码
mysql> SELECT * FROM employee

-> WHERE age>24 AND EXISTS

-> (SELECT d_name FROM department WHERE d_id=1003);
提示

•EXISTS (subquery) 只返回 TRUE 或 FALSE,因此子查询中的 SELECT * 也可以是 SELECT 1 或其他,官方说法是实际执行时会忽略 SELECT 清单,因此没有区别。

•EXISTS 子查询的实际执行过程可能经过了优化而不是我们理解上的逐条对比,如果担忧效率问题,可进行实际检验以确定是否有效率问题。

•EXISTS 子查询往往也可以用条件表达式、其他子查询或者 JOIN 来替代,何种最优需要具体问题具体分析

带ANY关键字的子查询

ANY关键字表示满足其中任一条件


代码如下复制代码
mysql> SELECT * FROM employee

-> WHERE d_id!=ANY

-> (SELECT d_id FROM department);

4 rows in set (0.00 sec)
带ALL关键字的子查询

ALL关键字表示满足其中所有条件


代码如下复制代码
mysql> SELECT * FROM employee

-> WHERE d_id>=ALL

-> (SELECT d_id FROM department);
1 row in set (0.00 sec)暂时不明白这两条语句是什么意思,到时候再补上



UNION合并查询结果

MySQL UNION 用于把来自多个 SELECT 语句的结果组合到一个结果集合中。语法为:

SELECT column,... FROM table1

UNION [ALL]

SELECT column,... FROM table2

...

在多个 SELECT 语句中,对应的列应该具有相同的字段属性,且第一个 SELECT 语句中被使用的字段名称也被用于结果的字段名称。

UNION 与 UNION ALL 的区别

当使用 UNION 时,MySQL 会把结果集中重复的记录删掉,而使用 UNION ALL ,MySQL 会把所有的记录返回,且效率高于 UNION。
代码如下复制代码
mysql> SELECT d_id FROM employee

-> UNION

-> SELECT d_id FROM department;

+------+

| d_id |

+------+

| 1001 |

| 1002 |

| 1004 |

| 1003 |

+------+
4 rows in set (0.00 sec)合并比较好理解,也就是将多个查询的结果合并在一起,然后去除其中的重复记录

如果想保存重复记录可以使用UNION ALL语句
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: