zoukankan      html  css  js  c++  java
  • SQL的集合运算符介绍

    最近学习了SQL SERVER方面的知识,毕竟做Web应用,少不了跟数据库打交道。学习的来源主要是《程序员的SQL金典》这本书。

    今天介绍数据库里面的集合运算符,它是指匹配集合的每一个结果。数据库集合运算符包括:IN、ANY、SOME、ALL、EISTS及EXCEPT和INTERSECT等。

    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
    )
    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)
    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的全部结果来作为成功匹配的结果。

    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 年之前的书籍。

    注:EXISTS的子查询如果为空则返回false,但是如果是直接查询空,那则会返回true。也就是说下面的例子将会返回表中所有的结果。 

    SELECT DepartmentID, Name 
    FROM HumanResources.Department 
    WHERE EXISTS (SELECT NULL)
    EXCEPT和INTERSECT集合运算符

    谢谢博友dgdyq提出的意见,在此加上EXCEPT和INTERSECT集合运算符。此处的内容转载了WizardWu的相关部分来介绍,觉得他介绍得比较好懂。

    • EXCEPT: 提取只在 EXCEPT 左侧存在,但右侧不存在的行,参考下图 1。用更口语化的说法:「只给我 A 里才有,但 B 里没有的行」。
    • INTERSECT: 只提取两个结果集里,都存在的行。 INTERSECT 很类似 inner join,但 INTERSECT 并不会对特定的「列 (column)」去做处理。

    SELECT ProductID 
    FROM Production.Product
    EXCEPT
    SELECT ProductID 
    FROM Production.WorkOrder ;
    SELECT ProductID 
    FROM Production.Product
    INTERSECT
    SELECT ProductID 
    FROM Production.WorkOrder ;

    以上的SQL代码都为《程序员的SQL金典》(作者:杨中科)例子,书的例子更详细,大家有兴趣的话,可以网上下载PDF文档看,当然购买正版书也是不错的选择。

  • 相关阅读:
    一个编译器的实现0
    《穿越计算机的迷雾》笔记
    C#WinForm应用程序实现自动填充网页上的用户名和密码并点击登录按钮
    一个编译器的实现2——从文法到LL(1)分析表的概念和算法
    使用百度地图API的例子
    过桥问题 Bridge and torch problem
    (译)跟媳妇解释面向对象设计
    批量照片缩小器展示多线程控件BackgroundWorker后台工作使用方法
    图解:邮件(消息)的加密解密和数字签名
    一个编译器的实现1——开篇
  • 原文地址:https://www.cnblogs.com/csdbfans/p/3438254.html
Copyright © 2011-2022 走看看