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文档看,当然购买正版书也是不错的选择。

  • 相关阅读:
    EXTJS 4.2 资料 控件之checkboxgroup的用法(静态数据)
    EXTJS 4.2 资料 控件之Window窗体相关属性的用法
    EXTJS 4.2 资料 控件之textfield文本框加事件的用法
    Entity Framework 学习笔记(一)之数据模型 数据库
    EXTJS 4.2 资料 控件之checkboxgroup的用法(动态数据)
    EXTJS 4.2 资料 控件之Grid 列鼠标悬停提示
    Entity Framework 学习笔记(二)之数据模型 Model 使用过程
    EXTJS 4.2 资料 控件之radiogroup 的用法
    EXTJS API
    vue移动端弹框组件,vue-layer-mobile
  • 原文地址:https://www.cnblogs.com/csdbfans/p/3438254.html
Copyright © 2011-2022 走看看