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

1.ANY关键字

假设any内部的查询语句返回的结果个数是三个,如:result1,result2,result3,那么,

select ...from ... where a > any(...);

->

select ...from ... where a > result1 or a > result2 or a > result3;

2.ALL关键字

ALL关键字与any关键字类似,只不过上面的or改成and。即:

select ...from ... where a > all(...);

->

select ...from ... where a > result1 and a > result2 and a > result3;

3.SOME关键字

some关键字和any关键字是一样的功能。所以:

select ...from ... where a > some(...);

->

select ...from ... where a > result1 or a > result2 or a > result3;

4.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的记录

词语IN"=ANY"的别名。因此,这两个语句是一样的:

SELECT s1 FROM t1 WHERE s1 = ANY (SELECT s1 FROM t2);
SELECT s1 FROM t1 WHERE s1 IN    (SELECT s1 FROM t2);

5.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来连接,如下:

mysql> SELECT * FROM employee
    -> WHERE age>24 AND EXISTS
    -> (SELECT d_name FROM department WHERE d_id=1003);

提示:
•EXISTS (subquery) 只返回 TRUEFALSE,因此子查询中的 SELECT * 也可以是 SELECT 1 或其他,官方说法是实际执行时会忽略 SELECT 清单,因此没有区别。
•EXISTS 子查询的实际执行过程可能经过了优化而不是我们理解上的逐条对比,如果担忧效率问题,可进行实际检验以确定是否有效率问题。
•EXISTS 子查询往往也可以用条件表达式、其他子查询或者 JOIN 来替代,何种最优需要具体问题具体分析

6.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语句。

时间: 2024-10-12 12:39:25

msyql中子查询IN,EXISTS,ANY,ALL,SOME,UNION介绍的相关文章

mysql---where子查询、form子查询、exists子查询

1.什么是子查询? 当一个查询是另一个查询的条件时,称之为子查询. 2.子查询有什么好处? 子查询可以使用几个简单命令构造功能强大的复合命令. 那么,现在让我们一起来学习子查询. 3.where型的子查询 给它个定义吧:where型的子查询就是把内层查询的结果当作外层查询的条件. 现在,我们来查询文章表里每组主题分类下评论最多的文章. 给定表如下: create table article(article_id int(3),article_title varchar(50),article_c

子查询及exists

子查询分为无关子查询和相关子查询 无关子查询,只查询一次,与外查询无关,可作为查询条件: select * from student where sno in (select sno from student where class = 98789); 也可作为一个虚拟表使用. 相关子查询,查询多次,依赖外部查询: select * from student where exists (select * from Student);--只要存在条件满足,就查询 在这里引申出一个exists,它和

sql语句查询中exists中为什么要用select 1?

select * from call_cdr_xz_200609 a where and a.ori_charge<>0 and exists(select 1 from special b where a.called_nbr like b.special_nbr||'%' and b.billing_state=0 ),好比这个,为什么要加select 1?括号中的条件字句不是恒成立的吗,求解 如果有查询结果,查询结果就会全部被1替代(当不需要知道结果是什么,只需要知道有没有结果的时候会这

mysql优化---in型子查询,exists子查询,from 型子查询

in型子查询引出的陷阱:(扫更少的行,不要临时表,不要文件排序就快) 题: 在ecshop商城表中,查询6号栏目的商品, (注,6号是一个大栏目) 最直观的: mysql> select goods_id,cat_id,goods_name from goods where cat_id in (select cat_id from category where parent_id=6); 误区: 给我们的感觉是, 先查到内层的6号栏目的子栏目,如7,8,9,11 然后外层, cat_id in

mysql select中子查询中使用强制索引的优化案例

1,朋友找我帮忙看下比较慢的sql语句 SELECT pg.product_goods_id, pg.product_id, pg.pdt_code, pg.pdt_name, pg.brand_name, pg.reference_price, pg.deposit, pg.sale_status, pg.is_delete, pg.create_date, pg.create_operator, pg.update_date, pg.update_operator, si.shop_id,

python SQLAlchemy中子查询subquery的使用

基本配置: https://www.cnblogs.com/whycai/p/11963443.html 原始sql: 将表中数据按照name分组,其他字段展示最新的数据,于是,先要排序后,再进行分组 1 select a.name,count(*),a.datetime from 2 (select * from TableName where 1=1 and datetime >= "2020-1-9 11:00:00" 3 and datetime <= "

MySQL查询子句(group by,limit,union,order by等)

Order by 按照字段值进行排序,默认升序(asc).校对规则决定排序关系. order by 字段 升序|降序(asc|desc), Order by允许多字段排序. 指的是,先按第一个字段排序,如果不能区分,才使用第二个字段,以此类推. create table test( id int primary key not null auto_increment, name varchar(10), group_id int ); insert into test values(null,'

mysql条件查询and or使用实例及优先级介绍

mysql and与or介绍 AND 和 OR 可在 WHERE 子语句中把两个或多个条件结合起来. 使用OR关键字时: 只要符合这几个查询条件的其中一个条件,这样的记录就会被查询出来. 如果不符合这些查询条件中的任何一条,这样的记录将被排除掉. 使用and关键字时: 需要符合所有条件,这样的记录就会被查询出来. 如果有任何一个条件不符合,这样的记录将被排除掉. mysql and与or实例 本实例中需要使用到的表数据如下: title content category seo_name php

MyBatis查询结果resultType返回值类型详细介绍

一.返回一般数据类型比如要根据 id 属性获得数据库中的某个字段值. mapper 接口: // 根据 id 获得数据库中的 username 字段的值 String getEmpNameById(Integer id); SQL 映射文件: <!-- 指定 resultType 返回值类型时 String 类型的, string 在这里是一个别名,代表的是 java.lang.String 对于引用数据类型,都是将大写字母转小写,比如 HashMap 对应的别名是 'hashmap' 基本数据