sql集合运算符使用方法

(1)in运算符:它可以用来匹配一个固定集合中的某一项。比如说一个集合里面的年份有(2001,2003,2005),那么就可以有:

复制代码 代码如下:

select * from t_book

where fyearpublished in(2001,2003,2005)

in运算符,除了支持从固定的集合里面去匹配,当然也支持动态的集合方式去匹配。比如如下方式:

复制代码 代码如下:

select * from t_reader

where fyearofjoin in

(

select fyearpublished from t_book

)

(2)any和some集合运算符:在sql server里面,any和some是同义词,二者的用法和功能一样(一样还搞两个,不知道是不是蛋疼)。相比于in运算符,any和some需要与其它的比较符(大于(>)、等于(=)、小于(<)、大于等于(>=)、小于等)共同使用,而且比较符需要在它们的前面。

复制代码 代码如下:

select * from t_reader

where fyearofjoin =any

(

select fyearpublished from t_book

)

注意:和in 运算符不同,any 和some运算符不能与固定的集合相匹配,比如下面的sql 语句是错误的:

复制代码 代码如下:

select * from t_book

where fyearpublished<any(2001,2003,2005)

(3)all集合运算符:在sql server里面,all运算符也需要与其它的比较符(大于(>)、等于(=)、小于(<)、大于等于(>=)、小于等)共同使用,而且比较符需要在它们的前面。

复制代码 代码如下:

select * from t_book

where fyearpublished<all

(

select fyearofjoin from t_reader

)

注意:

i、与any和some 运算符相同,all 运算符同样不能与固定的集合相匹配,比如下面的sql 语句是错误的:

复制代码 代码如下:

select * from t_book

where fyearpublished<all(2001,2003,2005)

ii、关于使用all运算符,还有一项需要注意,那就是这个all子查询结果为空时,匹配的结果并不是以空的方式来处理,而是相当于全部匹配成功。所以在使用all运算符的时候,这一个问题很容易在系统中造成bug,因此使用时必须注意。比如:

复制代码 代码如下:

select * from t_book

where fyearpublished<all

(

select fyearofjoin from t_reader

where fprovince = ‘jiangsu’

)

如果all子查询的结果为空时,则将会取select fyearofjoin from t_reader的全部结果来作为成功匹配的结果。

(4)exists集合运算符:和in、any、some、all等运算符不同,exists运算符是单目运算符,它不与列匹配,因此它也不要求待匹配的集合是单列的。exists运算符用来检查每一行是否匹配子查询,可以认为exists就是用来测试子查询的结果是否为空,如果结果集为空则匹配结果为false,否则匹配结果为true。

复制代码 代码如下:

select * from t_category

where exists

(

select * from t_book

where t_book. fcategoryid = t_category.fid

and t_book. fyearpublished<1950

)

在exists后的子查询中,sql对t_category表中的每一行数据到子查询中进行匹配,测试t_book 表中是否存在fcategoryid 字段值等于当前类别主键值且出版年份在1950 年之前的书籍。

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐