EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False
EXISTS
指定一个子查询,检测行的存在。
语法
EXISTS subquery
参数
subquery
是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INTO 关键字)。有关更多信息,请参见select中有关子查询的讨论。
结果类型
Boolean
结果值
如果子查询包含行,则返回 TRUE。
一种通俗的可以理解为:将外查询表的每一行,代入内查询作为检验,如果内查询返回的结果取非空值,则EXISTS子句返回TRUE,这一行行可作为外查询的结果行,否则不能作为结果。exists引导的子句有结果集返回,那么exists这个条件就算成立了,
http://www.cnblogs.com/fredlau/articles/993829.html
http://www.cnblogs.com/mytechblog/articles/2105785.html
http://blog.csdn.net/xiwu1616/article/details/14160855/
- <span style="font-size:14px;"> Insert into DGDISTRIBUTOR (DGDISTRIBUTORID,ORGCODE,ORGNAME,USERID,DATELASTUPDATED)
- select DGDISTRIBUTORseq.nextval,'52004096','丹东市第二人民医院',100005690,sysdate from DGDISTRIBUTOR
- where ROWNUM<=1 and not exists (select * from DGDISTRIBUTOR where orgcode = '52004096')</span>
1、select 1 from mytable;与select anycol(目的表集合中的任意一行) from mytable;与select * from mytable 作用上来说是没有差别的,都是查看是否有记录,一般是作条件用的。select 1 from 中的1是一常量,查到的所有行的值都是它,但从效率上来说,1>anycol>*,因为不用查字典表。
2、查看记录条数可以用select count(1) from mytable;等价于select count(*) from mytable;
select * from organization where 1=1 and exists(select 1 from organization where orgid >1999999);
1=1为保护作用,在拼装SQL语句时,当后面的条件不成立时有可能会导致整个语句异常。因为where后面不能为空。
当我们只关心数据表有多少记录行而不需要知道具体的字段值时,类似“select 1 from tblName”是一个很不错的SQL语句写法,它通常用于子查询。这样可以减少系统开销,提高运行效率,因为这样子写的SQL语句,数据库引擎就不会去检索数据表里一条条具体的记录和每条记录里一个个具体的字段值并将它们放到内存里,而是根据查询到有多少行存在就输出多少个“1”,每个“1”代表有1行记录,同时选用数字1还因为它所占用的内存空间最小,当然用数字0的效果也一样。在不需要知道具体的记录值是什么的情况下这种写法无疑更加可取。
下面举例示范这种写法的常见用法:
1)列出每个班的学生人数
常规写法
1
2
|
select
class,
count
(*)
as
pax
from
students
group
by
class;
|
更优写法
1
2
|
select
class,
count
(1)
as
pax
from
students
group
by
class;
|
2)列出每个班最年轻的学生资料
常规写法
1
2
3
|
select
a.*
from
students a
where
not
exists(
select
b.sid
from
students b
where
b.sid=a.sid
and
b.date_birth>a.date_birth);
|
更优写法
1
2
3
|
select
a.*
from
students a
where
not
exists(
select
1
from
students b
where
b.sid=a.sid
and
b.date_birth>a.date_birth);
|