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的记录
此处首先查询出department表中所有d_id字段的信息,并将结果作为条件
接着查询employee表中以d_id为条件的所有字段信息
NOT IN的效果与上面刚好相反
带比较运算符的子查询
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)此处内层循环并没有查询到满足条件的结果,因此返回false,外层查询不执行
NOT EXISTS刚好与之相反
当然,EXISTS关键字可以与其他的查询条件一起使用
条件表达式与EXISTS关键字之间用AND或者OR来连接
提示
•EXISTS (subquery) 只返回 TRUE 或 FALSE,因此子查询中的 SELECT * 也可以是 SELECT 1 或其他,官方说法是实际执行时会忽略 SELECT 清单,因此没有区别。
•EXISTS 子查询的实际执行过程可能经过了优化而不是我们理解上的逐条对比,如果担忧效率问题,可进行实际检验以确定是否有效率问题。
•EXISTS 子查询往往也可以用条件表达式、其他子查询或者 JOIN 来替代,何种最优需要具体问题具体分析
带ANY关键字的子查询
ANY关键字表示满足其中任一条件
带ALL关键字的子查询
ALL关键字表示满足其中所有条件
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。
4 rows in set (0.00 sec)合并比较好理解,也就是将多个查询的结果合并在一起,然后去除其中的重复记录
如果想保存重复记录可以使用UNION ALL语句
带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的记录 |
接着查询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 | 销售部 | +------+-----------+ |
此外,运算符还有很多,这里不再赘述
带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) |
-> 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关键字表示满足其中所有条件
代码如下 | 复制代码 |
mysql> SELECT * FROM employee -> WHERE d_id>=ALL -> (SELECT d_id FROM department); |
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 | +------+ |
如果想保存重复记录可以使用UNION ALL语句
相关文章推荐
- msyql中子查询IN,EXISTS,ANY,ALL,SOME,UNION介绍
- msyql中子查询IN,EXISTS,ANY,ALL,SOME,UNION介绍
- MySQL中子查询IN,EXISTS,ANY,ALL,SOME,UNION介绍
- sql中用于子查询的几个关键词 any(some是 any的别名),all,in,exists
- 多表查询之子查询,in,any,all,exists,
- mysql子查询 带 In 关键字的子查询 带比较运算符的子查询 带 Exists 关键字的子查询 带 Any 关键字的子查询 带 All 关键字的子查询
- sql查询关建字之-exists, in. all, any, some
- LINQ to SQL语句之Group By/Having和Exists/In/Any/All/Contains
- LINQ体验(7)--LINQ to SQL语句之Group By/Having和Exists/In/Any/All/Conta...
- mysql 实战 or、in与union all 的查询效率
- LINQ体验(7)——LINQ to SQL语句之Group By/Having和Exists/In/Any/All/Contains
- LINQ to SQL语句(7)之Exists/In/Any/All/Contains
- Oracle笔记之any,some,all以及exists与in的用法
- SQL中exists,any,all,some,in的问题
- LINQ体验(7)——LINQ to SQL语句之Group By/Having和Exists/In/Any/All/Contains
- mysql 实战 or、in与union all 的查询效率
- LINQ体验(7)——LINQ to SQL语句之Group By/Having和Exists/In/Any/All/Contains
- LINQ体验(7)——LINQ to SQL语句之Group By/Having和Exists/In/Any/All/Contains
- mysql 实战 or、in与union all 的查询效率
- LINQ体验(7)——LINQ to SQL语句之Group By/Having和Exists/In/Any/All/Contains