详解SQL EXISTS 运算符_MsSql

来源:脚本之家  责任编辑:小易  

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的过程:如下:表AID NAME1 A12 A23 A3表BID AID NAME1 1 B12 2 B23 2 B3表A和表B是1对多的关系 A.ID=>B.AIDSELECT ID,NAME FROM A WHERE EXISTS(SELECT*FROM B WHERE A.ID=B.AID)执行结果为1 A12 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 A3EXISTS=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 Date1 苹果 水果 10 2011-7-11 桔子 水果 20 2011-7-21 香蕉 水果 15 2011-7-32 白菜 蔬菜 12 2011-7-12 青菜 蔬菜 19 2011-7-2如果想要得到下面的结果:(Id唯一,Date选最近的一次)1 香蕉 水果 15 2011-7-32 青菜 蔬菜 19 2011-7-2正确的SQL语句是:SELECT Id,Name,Class,Count,DateFROM table tWHERE(NOT EXISTS(SELECT Id,Name,Class,Count,Date FROM tableWHERE Id=t.Id AND Date>t.Date))如果用distinct,得不到这个结果,因为distinct是作用与所有列的SELECT DISTINCT Id,Name,Class,Count,Date FROM table结果是表table的所有不同列都显示出来,如下所示:1 苹果 水果 10 2011-7-11 桔子 水果 20 2011-7-21 香蕉 水果 15 2011-7-32 白菜 蔬菜 12 2011-7-12 青菜 蔬菜 19 2011-7-2如果用Group by也得不到需要的结果,因为Group by 要和聚合函数共同使用,所以对于Name,Class和Count列要么使用Group by,要么使用聚合函数.如果写成SELECT Id,Name,Class,Count,MAX(Date)FROM tableGROUP BY Id,Name,Class,Count得到的结果是1 苹果 水果 10 2011-7-11 桔子 水果 20 2011-7-21 香蕉 水果 15 2011-7-32 白菜 蔬菜 12 2011-7-12 青菜 蔬菜 19 2011-7-2如果写成SELECT Id,MAX(Name),MAX(Class),MAX(Count),MAX(Date)FROM tableGROUP BY Id得到的结果是:1 香蕉 水果 20 2011-7-32 青菜 蔬菜 19 2011-7-2如果用in有时候也得不到结果,(有的时候可以得到,如果Date都不相同(没有重复数据),或者是下面得到的Max(Date)只有一个值)SELECT DISTINCT Id,Name,Class,Count,Date FROM tableWHERE(Date IN(SELECT MAX(Date)FROM tableGROUP BY Id))得到的结果是:(因为MAX(Date)有两个值2011-7-2,2011-7-3)1 桔子 水果 20 2011-7-21 香蕉 水果 15 2011-7-32 青菜 蔬菜 19 2011-7-2注意in只允许有一个字段返回有一种方法可以实现:SELECT Id,Name,Class,COUNT,DateFROM table1 tWHERE(Date=(SELECT MAX(Date)FROM table1WHERE Id=t.Id))www.zgxue.com防采集请勿采集本网。

EXISTS 运算符

exists 后面括号中,并不关心 SELECT 后的字段列表,只关心 FROM 后面返回的结果。有结果就是 true,反之为false 如果不加上 e.deptno=d.deptno,exists()括号中的结果就跟emp 无关了。加上 e.

EXISTS 运算符用于判断查询子句是否有记录,如果有一条或多条记录存在返回 True,否则返回 False。

Exists是子查询的一种条件形式,通过判断Exists的选择表达式(括号内的部分)的结果,如果存在一行或多行结果记录,则Exists整个子查询结果为真,否则为假。由于我们采用Exists来实现子查询,只需要关心

SQL EXISTS 语法

那是因为后面的语句返回了空值数据,你可以看看返回的结果: (所影响的行数为 1 行) select null select '' 都是有返回记录的

SELECT column_name(s)FROM table_nameWHERE EXISTS(SELECT column_name FROM table_name WHERE condition);

演示数据库

在本教程中,我们将使用 RUNOOB 样本数据库。

下面是选自 "Websites" 表的数据:

+----+--------------+---------------------------+-------+---------+| id | name | url | alexa | country |+----+--------------+---------------------------+-------+---------+| 1 | Google | https://www.google.cm/ | 1 | USA || 2 | 淘宝 | https://www.taobao.com/ | 13 | CN || 3 | 菜鸟教程 | http://www.runoob.com/ | 4689 | CN || 4 | 微博 | http://weibo.com/ | 20 | CN || 5 | Facebook | https://www.facebook.com/ | 3 | USA |+----+--------------+---------------------------+-------+---------+

下面是 "access_log" 网站访问记录表的数据:

mysql> SELECT * FROM access_log;+-----+---------+-------+------------+| aid | site_id | count | date |+-----+---------+-------+------------+| 1 | 1 | 45 | 2016-05-10 || 2 | 3 | 100 | 2016-05-13 || 3 | 1 | 230 | 2016-05-14 || 4 | 2 | 10 | 2016-05-14 || 5 | 5 | 205 | 2016-05-14 || 6 | 4 | 13 | 2016-05-15 || 7 | 3 | 220 | 2016-05-15 || 8 | 5 | 545 | 2016-05-16 || 9 | 3 | 201 | 2016-05-17 |+-----+---------+-------+------------+9 rows in set (0.00 sec)

SQL EXISTS 实例

现在我们想要查找总访问量(count 字段)大于 200 的网站是否存在。

我们使用下面的 SQL 语句:

SELECT Websites.name, Websites.url FROM Websites WHERE EXISTS (SELECT count FROM access_log WHERE Websites.id = access_log.site_id AND count > 200);

执行以上 SQL 输出结果如下:

EXISTS 可以与 NOT 一同使用,查找出不符合查询语句的记录:

SELECT Websites.name, Websites.url FROM Websites WHERE NOT EXISTS (SELECT count FROM access_log WHERE Websites.id = access_log.site_id AND count > 200);

执行以上 SQL 输出结果如下:

以上就是详解SQL EXISTS 运算符的详细内容,更多关于SQL EXISTS 运算符的资料请关注真格学网其它相关文章!

if exists(select*from sysobjects where name='proc_student')以上判断是否存在proc_student.返回的结果是bool类型内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • mysql中in与exists的使用及区别介绍
  • 对比分析mysql语句中的in 和exists
  • mysql exists与not exists实例详解
  • 安装mysql出错”a windows service with the name mysql already exists.“如何解决
  • mysql的子查询中from和exists子句的使用教程
  • mysql in 与 exists 的优化示例介绍
  • mssql和sqlite中关于if not exists 的写法
  • mysql not in、left join、is null、not exists 效率问题记录
  • sql中exists的使用方法
  • ucenter info: mysql query error sql:select value from [table]vars where noteexists
  • mysql insert if not exists防止插入重复记录的方法
  • 通过格式良好的sql提高效率和准确性
  • sql 判断字段类型语句
  • 详解sqlserver 表达式(expression)
  • 全国省市区县最全最新数据表(数据来源谷歌)
  • sql server 数据库备份代码实例
  • cmd命令操作mssql2005数据库(命令整理)
  • mssql数据导入到mongo的默认编码问题(正确导入mongo的方法)
  • sqlserver编译与重编译发生场景及重用的利弊介绍
  • sql语句实现四种九九乘法表
  • 存储过程实现订单号,流水单号(8位)的详细思路
  • SQL中EXISTS的用法
  • SQL语句中exists和not exists的用法,讲得通俗易懂些。
  • 数据库SQL语言,关于运算顺序和 谓词exists的问题。
  • 关于sql语句中exists的作用
  • SQL语句exists的使用
  • SQL中EXISTS怎么用
  • 关于SQL exists的用法的问题
  • 请问sql中exists语句的用法问题?
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess数据库文摘数据库其它首页mysql中in与exists的使用及区别介绍对比分析mysql语句中的in 和existsmysql exists与not exists实例详解安装mysql出错”a windows service with the name mysql already exists.“如何解决mysql的子查询中from和exists子句的使用教程mysql in 与 exists 的优化示例介绍mssql和sqlite中关于if not exists 的写法mysql not in、left join、is null、not exists 效率问题记录sql中exists的使用方法ucenter info: mysql query error sql:select value from [table]vars where noteexistsmysql insert if not exists防止插入重复记录的方法通过格式良好的sql提高效率和准确性sql 判断字段类型语句详解sqlserver 表达式(expression)全国省市区县最全最新数据表(数据来源谷歌)sql server 数据库备份代码实例cmd命令操作mssql2005数据库(命令整理)mssql数据导入到mongo的默认编码问题(正确导入mongo的方法)sqlserver编译与重编译发生场景及重用的利弊介绍sql语句实现四种九九乘法表存储过程实现订单号,流水单号(8位)的详细思路sql server 2012 安装图解教程(附sql server数据库入门学习总结microsoft sql server 2012 数据sql重复记录查询的几种方法win7系统安装sqlserver2000的详细sqlserver中distinct的用法(不重sql server错误代码大全及解释(sql-order by 多字段排序(升序、sql将一个表中的数据插入到另一个用sql语句添加删除修改字段、一些sqlserver只有mdf文件恢复数据库的方法sql 触发器使用例子sqlserver2000 企业版 出现"进程51发开窗函数有浅入深详解(一)数据库高并发情况下重复值写入的避免 字段sql_server全文索引的用法解析sqlserver下kill 所有连接到某一数据库的sql 存储过程基础语法之一在sql server中迁移数据的几种方法sql function 创建函数实例介绍
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved