exists : 强调的是是否返回结果集,不要求知道返回什么, 比如:
select name from student where sex = 'm' and mark exists(select 1 from grade where ...) ,只要
exists引导的子句有结果集返回,那么exists这个条件就算成立了,大家注意返回的字段始终为1,如果改成“select 2 from grade where ...”,那么返回的字段就是2,这个数字没有意义。所以exists子句不在乎返回什么,而是在乎是不是有结果集返回。

而 exists 与 in 最大的区别在于 in引导的子句只能返回一个字段,比如:
select name from student where sex = 'm' and mark in (select 1,2,3 from grade where ...)
,in子句返回了三个字段,这是不正确的,exists子句是允许的,但in只允许有一个字段返回,在1,2,3中随便去了两个字段即可。

而not exists 和not in 分别是exists 和 in 的 对立面。

exists (sql 返回结果集为真)
not exists (sql 不返回结果集为真)

下面详细描述not exists的过程:

如下:
表A
ID NAME
1 A1
2 A2
3 A3

表B
ID AID NAME
1 1 B1
2 2 B2
3 2 B3

表A和表B是1对多的关系 A.ID => B.AID

SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE A.ID=B.AID)
执行结果为
1 A1
2 A2
原因可以按照如下分析
SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=1)
--->SELECT * FROM B WHERE B.AID=1有值返回真所以有数据

SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=2)
--->SELECT * FROM B WHERE B.AID=2有值返回真所以有数据

SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=3)
--->SELECT * FROM B WHERE B.AID=3无值返回真所以没有数据

NOT EXISTS 就是反过来
SELECT ID,NAME FROM A WHERE NOT EXIST (SELECT * FROM B WHERE A.ID=B.AID)
执行结果为
3 A3

EXISTS = IN,意思相同不过语法上有点点区别,好像使用IN效率要差点,应该是不会执行索引的原因
SELECT ID,NAME FROM A  WHERE ID IN (SELECT AID FROM B)

NOT EXISTS = NOT IN ,意思相同不过语法上有点点区别
SELECT ID,NAME FROM A WHERE ID NOT IN (SELECT AID FROM B)

有时候我们会遇到要选出某一列不重复,某一列作为选择条件,其他列正常输出的情况.

如下面的表table:

Id Name Class Count Date

1 苹果 水果 10 2011-7-1

1 桔子 水果 20 2011-7-2

1 香蕉 水果 15 2011-7-3

2 白菜 蔬菜 12 2011-7-1

2 青菜 蔬菜 19 2011-7-2

如果想要得到下面的结果:(Id唯一,Date选最近的一次)

1 香蕉 水果 15 2011-7-3

2 青菜 蔬菜 19 2011-7-2

正确的SQL语句是:

SELECT Id, Name, Class, Count, Date
FROM table t
WHERE (NOT EXISTS

      (SELECT Id, Name, Class, Count, Date FROM table WHERE Id = t.Id AND Date > t.Date))

如果用distinct,得不到这个结果, 因为distinct是作用与所有列的

SELECT DISTINCT Id, Name, Class, Count, Date FROM table

结果是表table的所有不同列都显示出来,如下所示:

1 苹果 水果 10 2011-7-1

1 桔子 水果 20 2011-7-2

1 香蕉 水果 15 2011-7-3

2 白菜 蔬菜 12 2011-7-1

2 青菜 蔬菜 19 2011-7-2

如果用Group by也得不到需要的结果,因为Group by 要和聚合函数共同使用,所以对于Name,Class和Count列要么使用Group by,要么使用聚合函数. 如果写成

SELECT Id, Name, Class, Count, MAX(Date)
FROM table
GROUP BY Id, Name, Class, Count

得到的结果是

1 苹果 水果 10 2011-7-1

1 桔子 水果 20 2011-7-2

1 香蕉 水果 15 2011-7-3

2 白菜 蔬菜 12 2011-7-1

2 青菜 蔬菜 19 2011-7-2

如果写成

SELECT Id, MAX(Name), MAX(Class), MAX(Count), MAX(Date)
FROM table
GROUP BY Id

得到的结果是:

1 香蕉 水果 20 2011-7-3

2 青菜 蔬菜 19 2011-7-2

如果用in有时候也得不到结果,(有的时候可以得到,如果Date都不相同(没有重复数据),或者是下面得到的Max(Date)只有一个值)

SELECT DISTINCT Id, Name, Class, Count, Date FROM table

WHERE (Date IN

      (SELECT MAX(Date)FROM tableGROUP BY Id))

得到的结果是:(因为MAX(Date)有两个值2011-7-2,2011-7-3)

1 桔子 水果 20 2011-7-2

1 香蕉 水果 15 2011-7-3

2 青菜 蔬菜 19 2011-7-2

注意in只允许有一个字段返回

有一种方法可以实现:

SELECT Id, Name, Class, COUNT, Date
FROM table1 t
WHERE (Date =

      (SELECT MAX(Date)FROM table1WHERE Id = t .Id))

sql中exists,not exists的用法 1相关推荐

  1. SQL中IN与EXISTS的比较

    为什么80%的码农都做不了架构师?>>>    由于要使用 in,后来在网上找找了,发现有如下文章,大家共享一下.一起进步啦. 使用in的话,如果存在索引,和使用 join 性能差别 ...

  2. SQL中如何使用EXISTS替代IN

    我们在程序中一般在做SQL优化的时候讲究使用EXISTS带替代IN的做法,理由是EXISTS执行效率要比IN高. 之前我一直挺懵懂的一件事情是如何使用EXISTS来替换IN呢,二者表示的意义又是什么呢 ...

  3. sql中group by 和having 用法解析

    --sql中的group by 用法解析: -- Group By语句从英文的字面意义上理解就是"根据(by)一定的规则进行分组(Group)". --它的作用是通过一定的规则将一 ...

  4. sql中in和exists、not in 和 not exists的区别

    总结 in语句只执行一次,首先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选.适合子表比主表数据小的情况 exists对外表作loop循环,每次loop循环再对内表进行查询.ex ...

  5. 举例说明SQL中 in和exists的区别

    in和exists的区别 新建两个表 user表 account表 in SELECT * FROM user u where u.id in (select user_id from account ...

  6. 关于SQL中Union和Join的用法

    转载请注明出处:帘卷西风的专栏(http://blog.csdn.net/ljxfblog) 一直以来,对于数据库SQL方面都是半吊子水平,能写一些基本的增删改查的语句,大部分时间都是用下Where, ...

  7. SQL中DATEADD和DATEDIFF的用法

    通常,你需要获得当前日期和计算一些其他的日期,例如,你的程序可能需要判断一个月的第一天或者最后一天.你们大部分人大概都知道怎样把日期进行分割(年.月.日等),然后仅仅用分割出来的年.月.日等放在几个函 ...

  8. sql中having、group by用法及常用聚合函数

    having是用在聚合函数的用法.当我们在用聚合函数的时候,一般都要用到GROUP BY 先进行分组,然后再进行聚合函数的运算.运算完后就要用到HAVING 的用法了,就是进行判断了. 注意:sele ...

  9. SQL 中 TRIM()函数用法

    问题描述: 在数据库中,批量导入数据的时候,没有注意字段数据的空格,造成导入数据库里的数据末尾有空格. 解决方案: trim() 函数介绍: trim 函数可以移除字符串的首尾信息.最常见的用法为移除 ...

  10. SQL中的CONVERT函数的用法

    定义和用法 CONVERT() 函数是把日期转换为新数据类型的通用函数. CONVERT() 函数可以用不同的格式显示日期/时间数据. 语法 CONVERT(data_type(length),dat ...

最新文章

  1. 05-04-查看补丁更新报告
  2. intellij IDEA怎样打war包
  3. ASP.NET-GridView数据绑定的几种方法
  4. Hex-Rays.Decompiler ...
  5. 使用java+TestNG进行接口回归测试 1
  6. [JS] 修改Navigator对象
  7. 【Python】 更棒的Excel操作模块xlwings
  8. 担忧医生因AI技术而失业?杞人忧天
  9. 倍投计算器工具_天天基金网上实用的小工具
  10. 喜大普奔,Google 的一小步!
  11. xlsx文件打开乱码_excel打开xls文件全是乱码怎么办?excel打开xls乱码的修复方法
  12. cad设计绘图软件:AutoCAD 2020 Mac版
  13. dreamweaver序列号免费_dreamweaver8【dreamweaver8序列号】dreamweaver8注册码序列号简体中文版...
  14. android settings过渡动画,华为过渡动画
  15. 计算机英语摘要,计算机专业英语摘要.ppt
  16. 【PAT A-1013】Battle Over Cities
  17. 死链对网站的影响、产生过程、解决办法汇总
  18. 如何用计算机解锁苹果手机软件,屏幕显示连接到iTunes,如何解锁iPhone? -
  19. Ubuntu 下无线网卡RTL8723BE不稳定的解决办法
  20. 综合案例——手写数字图像处理算法比较

热门文章

  1. 动态规划——最大整除子集C++
  2. 智能优化算法:学生心理学优化算法 -附代码
  3. GIS案例练习-----------第十天
  4. 【github】命令和错误小结
  5. ENVI波段运算模块功能
  6. 激光雷达(LiDAR)简介-森林资源调查应用
  7. 设计自己的ImageLoader图片加载框架
  8. 查找算法------顺序查找
  9. Flutter之SemanticsBinding和WidgetsBindingObserver简析
  10. 实用干货!大数据入门的常用技术栈全在这里了