通常exists后的子查询是需要和外面的表建立关联关系的,如
select count(*) from a where exists (select 'x' from b where a.id = b.id)
因为exists只是看子查询是否有结果返回,而并不关心返回的是什么内容,因此通常建议写一个常量,至少性能不可能比select 一个具体的字段出来差,而某些情况下,select具体的字段出来性能可能比select 一个常量出来要差得多。
如果不和外面的表建立关联关系,如
select * from a where exists (select 'x' from b)
这样的sql 虽然也没有错,但貌似无实际意义
  1. select * from t1 where not exists(select 1 from t2 where t1.id=t2.id)
  2. ---表2不存在的与t1相同的id
  3. --意思就是查询t1中与t2不同的id
  1. --按某一字段分组取最大(小)值所在行的数据
  2. --(爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开) 2007-10-23于浙江杭州)
  3. /*
  4. 数据如下:
  5. name val memo
  6. a 2 a2(a的第二个值)
  7. a 1 a1--a的第一个值
  8. a 3 a3:a的第三个值
  9. b 1 b1--b的第一个值
  10. b 3 b3:b的第三个值
  11. b 2 b2b2b2b2
  12. b 4 b4b4
  13. b 5 b5b5b5b5b5
  14. */
  15. --创建表并插入数据:
  16. create table tb(name varchar(10),val int,memo varchar(20))
  17. insert into tb values('a', 2, 'a2(a的第二个值)')
  18. insert into tb values('a', 1, 'a1--a的第一个值')
  19. insert into tb values('a', 3, 'a3:a的第三个值')
  20. insert into tb values('b', 1, 'b1--b的第一个值')
  21. insert into tb values('b', 3, 'b3:b的第三个值')
  22. insert into tb values('b', 2, 'b2b2b2b2')
  23. insert into tb values('b', 4, 'b4b4')
  24. insert into tb values('b', 5, 'b5b5b5b5b5')
  25. go
  26.  
  27. --一、按name分组取val最大的值所在行的数据。
  28. --方法1
  29. select a.* from tb a where val = (select max(val) from tb where name = a.name) order by a.name
  30. --方法2
  31. select a.* from tb a where not exists(select 1 from tb where name = a.name and val > a.val)
  32. --方法3
  33. select a.* from tb a,(select name,max(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name
  34. --方法4
  35. select a.* from tb a inner join (select name , max(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by a.name
  36. --方法5
  37. select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val > a.val ) order by a.name
  38. /*
  39. name val memo
  40. ---------- ----------- --------------------
  41. a 3 a3:a的第三个值
  42. b 5 b5b5b5b5b5
  43. */
  44.  
  45. --二、按name分组取val最小的值所在行的数据。
  46. --方法1
  47. select a.* from tb a where val = (select min(val) from tb where name = a.name) order by a.name
  48. --方法2
  49. select a.* from tb a where not exists(select 1 from tb where name = a.name and val < a.val)
  50. --方法3
  51. select a.* from tb a,(select name,min(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name
  52. --方法4
  53. select a.* from tb a inner join (select name , min(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by a.name
  54. --方法5
  55. select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val < a.val) order by a.name
  56. /*
  57. name val memo
  58. ---------- ----------- --------------------
  59. a 1 a1--a的第一个值
  60. b 1 b1--b的第一个值
  61. */
  62.  
  63. --三、按name分组取第一次出现的行所在的数据。
  64. select a.* from tb a where val = (select top 1 val from tb where name = a.name) order by a.name
  65. /*
  66. name val memo
  67. ---------- ----------- --------------------
  68. a 2 a2(a的第二个值)
  69. b 1 b1--b的第一个值
  70. */
  71.  
  72. --四、按name分组随机取一条数据。
  73. select a.* from tb a where val = (select top 1 val from tb where name = a.name order by newid()) order by a.name
  74. /*
  75. name val memo
  76. ---------- ----------- --------------------
  77. a 1 a1--a的第一个值
  78. b 5 b5b5b5b5b5
  79. */
  80.  
  81. --五、按name分组取最小的两个(N个)val
  82. select a.* from tb a where 2 > (select count(*) from tb where name = a.name and val < a.val ) order by a.name,a.val
  83. select a.* from tb a where val in (select top 2 val from tb where name=a.name order by val) order by a.name,a.val
  84. select a.* from tb a where exists (select count(*) from tb where name = a.name and val < a.val having Count(*) < 2) order by a.name,a.val
  85. /*
  86. name val memo
  87. ---------- ----------- --------------------
  88. a 1 a1--a的第一个值
  89. a 2 a2(a的第二个值)
  90. b 1 b1--b的第一个值
  91. b 2 b2b2b2b2
  92. */
  93.  
  94. --六、按name分组取最大的两个(N个)val
  95. select a.* from tb a where 2 > (select count(*) from tb where name = a.name and val > a.val ) order by a.name,a.val
  96. select a.* from tb a where val in (select top 2 val from tb where name=a.name order by val desc) order by a.name,a.val
  97. select a.* from tb a where exists (select count(*) from tb where name = a.name and val > a.val having Count(*) < 2) order by a.name , a.val
  98. /*
  99. name val memo
  100. ---------- ----------- --------------------
  101. a 2 a2(a的第二个值)
  102. a 3 a3:a的第三个值
  103. b 4 b4b4
  104. b 5 b5b5b5b5b5
  105. */
  106. --七,如果整行数据有重复,所有的列都相同。
  107. /*
  108. 数据如下:
  109. name val memo
  110. a 2 a2(a的第二个值)
  111. a 1 a1--a的第一个值
  112. a 1 a1--a的第一个值
  113. a 3 a3:a的第三个值
  114. a 3 a3:a的第三个值
  115. b 1 b1--b的第一个值
  116. b 3 b3:b的第三个值
  117. b 2 b2b2b2b2
  118. b 4 b4b4
  119. b 5 b5b5b5b5b5
  120. */
  121. --在sql server 2000中只能用一个临时表来解决,生成一个自增列,先对val取最大或最小,然后再通过自增列来取数据。
  122. --创建表并插入数据:
  123. create table tb(name varchar(10),val int,memo varchar(20))
  124. insert into tb values('a', 2, 'a2(a的第二个值)')
  125. insert into tb values('a', 1, 'a1--a的第一个值')
  126. insert into tb values('a', 1, 'a1--a的第一个值')
  127. insert into tb values('a', 3, 'a3:a的第三个值')
  128. insert into tb values('a', 3, 'a3:a的第三个值')
  129. insert into tb values('b', 1, 'b1--b的第一个值')
  130. insert into tb values('b', 3, 'b3:b的第三个值')
  131. insert into tb values('b', 2, 'b2b2b2b2')
  132. insert into tb values('b', 4, 'b4b4')
  133. insert into tb values('b', 5, 'b5b5b5b5b5')
  134. go
  135.  
  136. select * , px = identity(int,1,1) into tmp from tb
  137.  
  138. select m.name,m.val,m.memo from
  139. (
  140. select t.* from tmp t where val = (select min(val) from tmp where name = t.name)
  141. ) m where px = (select min(px) from
  142. (
  143. select t.* from tmp t where val = (select min(val) from tmp where name = t.name)
  144. ) n where n.name = m.name)
  145.  
  146. drop table tb,tmp
  147.  
  148. /*
  149. name val memo
  150. ---------- ----------- --------------------
  151. a 1 a1--a的第一个值
  152. b 1 b1--b的第一个值
  153.  
  154. (2 行受影响)
  155. */
  156. --在sql server 2005中可以使用row_number函数,不需要使用临时表。
  157. --创建表并插入数据:
  158. create table tb(name varchar(10),val int,memo varchar(20))
  159. insert into tb values('a', 2, 'a2(a的第二个值)')
  160. insert into tb values('a', 1, 'a1--a的第一个值')
  161. insert into tb values('a', 1, 'a1--a的第一个值')
  162. insert into tb values('a', 3, 'a3:a的第三个值')
  163. insert into tb values('a', 3, 'a3:a的第三个值')
  164. insert into tb values('b', 1, 'b1--b的第一个值')
  165. insert into tb values('b', 3, 'b3:b的第三个值')
  166. insert into tb values('b', 2, 'b2b2b2b2')
  167. insert into tb values('b', 4, 'b4b4')
  168. insert into tb values('b', 5, 'b5b5b5b5b5')
  169. go
  170.  
  171. select m.name,m.val,m.memo from
  172. (
  173. select * , px = row_number() over(order by name , val) from tb
  174. ) m where px = (select min(px) from
  175. (
  176. select * , px = row_number() over(order by name , val) from tb
  177. ) n where n.name = m.name)
  178.  
  179. drop table tb
  180.  
  181. /*
  182. name val memo
  183. ---------- ----------- --------------------
  184. a 1 a1--a的第一个值
  185. b 1 b1--b的第一个值
  186.  
  187. (2 行受影响)
  188. */

几条sql语句(exists)的更多相关文章

  1. 用一条SQL语句取出第 m 条到第 n 条记录的方法

    原文:用一条SQL语句取出第 m 条到第 n 条记录的方法   --从Table 表中取出第 m 条到第 n 条的记录:(Not In 版本)       *    FROM Table     id ...

  2. 用一条SQL语句查出每门课都大于80分的学生的姓名

    用一条SQL语句查出每门课都大于80分的学生的姓名,数据表结构如下: 建表SQL如下: ; -- ---------------------------- -- Table structure for ...

  3. mysql(1)—— 详解一条sql语句的执行过程

    SQL是一套标准,全称结构化查询语言,是用来完成和数据库之间的通信的编程语言,SQL语言是脚本语言,直接运行在数据库上.同时,SQL语句与数据在数据库上的存储方式无关,只是不同的数据库对于同一条SQL ...

  4. 【转载】详解一条sql语句的执行过程

    转载自 https://www.cnblogs.com/cdf-opensource-007/p/6502556.html SQL是一套标准,全称结构化查询语言,是用来完成和数据库之间的通信的编程语言 ...

  5. 关联映射、关联查询【重点掌握一条SQL语句的那种方法】

    1 什么叫关联映射 通过数据库对象之间的关联关系(一对一.一对多.多对多),反映到实体对象上之间的引用. 举例 用户实体类(User):user_id user_name user_token 笔记本 ...

  6. 详解一条sql语句的执行过程

    SQL是一套标准,全称结构化查询语言,是用来完成和数据库之间的通信的编程语言,SQL语言是脚本语言,直接运行在数据库上.同时,SQL语句与数据在数据库上的存储方式无关,只是不同的数据库对于同一条SQL ...

  7. 52 条 SQL 语句性能优化策略,建议收藏

    本文会提到 52 条 SQL 语句性能优化策略. 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by涉及的列上建立索引. 2.应尽量避免在where子句中对字段进行nul ...

  8. 一条Sql语句分组排序并且限制显示的数据条数

    如果我想得到这样一个结果集:分组排序,并且每组限定记录集的数量,用一条SQL语句能办到吗? 比如说,我想找出学生期末考试中,每科的前3名,并按成绩排序,只用一条SQL语句,该怎么写? 表[TScore ...

  9. JavaWeb 学习009-4个页面,5条sql语句(添加、查看、修改、删除)

    ===========++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++==+++++++++ 2016-12-3------ ...

  10. JavaWeb 学习007-4个页面,5条sql语句(添加、查看、修改、删除)2016-12-2

    需要复习的知识: 关联查询 =================================================================================班级模块学 ...

随机推荐

  1. 使用nvmw解决windows下多版本node共存的问题

    不支持4.x的nodejs,用nodist吧 不支持4.x的nodejs,用nodist吧 不支持4.x的nodejs,用nodist吧 ===========不要再看的分割线============ ...

  2. Unix高级编程之文件权限

    1.访问权限表 st_mode 意义 S_IRUSR 用户-读 S_IWUSR 用户-写 S_IXUSR 用户-执行 S_IRGRP 组-读 S_IWGRP 组-写 S_IXGRP 组-执行 S_IR ...

  3. 一些API

    /** * Goto the specified frame index, and pause at this index. * @param startIndex The animation wil ...

  4. JavaScript实现的9大排序算法

    笔试面试经常涉及各种算法,本文简要介绍常用的一些算法,并用JavaScript实现. 1.插入排序 1)算法简介 插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法.它的工作原 ...

  5. 前端生成全球唯一码GUID

    function GUID() { this.date = new Date();  //先new一个时间备用 GUID.prototype.newGUID = function () { this. ...

  6. Linux-软件安装(一) —— jdk/tomact 安装(普通安装)

    Linux-软件安装(一) -- jdk/tomact 安装(普通安装) 1. 可使用 FinalShell 上传至 Linux 服务器 2. 解压 cd /usr/local #解压命令 tar - ...

  7. ios 自定义消息提示框

    自定义提示框,3秒钟后自动消失.如上图显示效果. 提示框加载代码: - (void)viewDidLoad { [super viewDidLoad]; //将view背景颜色变更为黄色 self.v ...

  8. 学习用5W1H来管理自己的项目/工作

    学习用5W1H来管理自己的项目/工作   最近开始需要系统化的思维模型,这只是一个开始,一下用脑图的形式来简介5W1H的具体内容: 先写xmind思维树的文本导出,后面附上图片.^ _ ^ 5W1H ...

  9. Linux OpenGL 实践篇-14-多实例渲染

    多实例渲染 OpenGL的多实例渲染是一种连续执行多条相同的渲染命令的方法,并且每条命令产生的结果都有轻微的差异,通常用于渲染大量的几何物体. 设想一个场景,比如太空,我们需要渲染数以万记的星球,如果 ...

  10. 使用python批量建立文件

    for i in range(101,110): n = repr(i) + '.txt' file = open('c:\\ip\\' + n, 'w')