zoukankan      html  css  js  c++  java
  • DML数据操作语言之谓词,case表达式

    谓词:就是返回值是真值的函数。

    前面接触到的“>” “<” “=”等称为比较运算符,它们的正式名称就是比较谓词。因为它们比较之后返回的结果是真值。

    由于谓词 返回的结果是一个真值 ,即true , false,unknown,所以常常用在用来筛选记录的where子句 或者 having子句中。

    谓词 与 函数的最大区别 : 谓词返回值是真值 ,函数 返回值是数字,字符串,日期等值。

    常用的谓词:

    1.like  ——字符串的部分一致查询

    前方一致:

    select  *  from tb_student  t  where  t.name  like  'james%'; --  %代表0个或者多个字符

    将会选出 name以 james开头的记录。
    中间一致:

    select  *  from  tb_student  t    where  t.name  like  '%james%' ; --  %代表0个或者多个字符

    将会选出 name中 包含 james的记录。   这个条件包含了前方一致和后方一致,最宽泛。
    后方一致:

    select  *  from  tb_student  t   where  t.name like  '%james' ; --%代表0个或者多个字符

    将会选出name以 james结尾的记录。

    %代表0个或者多个字符    _代表1个字符

    select   *  from  tb_student  t   where   t.name   like   '_ _james_ _'; --_代表1个字符

    将会选出name前面有两个字符,中间是james,后面有两个字符的记录。
    通过like谓词的查询 又叫模糊查询。通过制定模式匹配规则,来筛选记录。

    2.betweent ——范围查询  

    筛选记录的某列的值在某一个范围内,可以使用betweent谓词 。

    select   *   from  tb_student  t  where   t.score  betweent   500  and   600 ;

    将会筛选出 score在500到600之间的记录。 包含500和600.

    上面这句相当于

    select  *   from   tb_student  t    where   t.score  <= 600  and  t.score  >= 500 ;

    若要筛选score在 500和600之间 但是不包含500和600的记录,只能使用:

    select  *   from   tb_student  t    where   t.score  < 600  and  t.score  > 500 ;

    3.is null , is  not  null  ——判断是否是null

    筛选记录的某列的值是不是null ,不能使用 = 或 != ,只能使用  is null  或 is  not  null 谓词。

    select   *   from  tb_student  where   t.birthday  is   null ;

    将筛选出 birthday的值为null的记录 。

    select   *   from  tb_student  where   t.birthday  is  not   null ;

    将筛选出 birthday的值不为null的记录。

    4.in , not  in  —— or逻辑运算符的简易用法

    select   *    from   tb_student    t   where   t.age   in   (21,24,26);

    将筛选出 age是 21  或  24  或 26 的记录 。

    select  *   from   tb_student   t   where   t.age   not   in  (21,24,26);

    将筛选出age不是 21 或24 或26的记录。(不包括 age是null的记录)。

    需要注意的一点是:in  ,not  in 是无法选出 指定列是 null的记录的,null终究还是 需要使用 is null 和 not is null

    使用子查询的结果表作为in谓词的参数 :

    要求子查询的结果表是 N行1列的表。这一列的每一个值 ,自动转化为 in谓词中的参数。

    select  *  from   tb_studen  t   where   t.studentId   in   ( select   c.stuId  from  tb_class  c   where  c.className = '高一九班' ) ;

    通过子查询 从tb_class表中得到是一个 N行一列 的结果表。这个表中的数据 转化成横向的参数列表,传给in谓词后面的参数列表。

    同样 not  in 谓词也可以使用 子查询的结果表作为 not  in 谓词的参数。

    5.exist

    exist谓词是一个特殊的谓词:

    exist的使用方法与之前的都不相同;exists的语法理解起来比较困难;实际上即使不使用exist,基本上也都可以使用in(或者not  in) 来完成相同的任务。

    case表达式 :

    我们知道java语言中  用if语句来实行根据指定条件判断时候为true来产生分支执行。

    而case表达式 就是 SQL语句中的类似于if语句的效果的表达式。

    case表达式 可以分为 简单case表达式 和 搜索case表达式 :

    搜索case表达式 的基本语法格式:

    case   
              when   <判断表达式1>    then     <执行表达式1> 
              when   <判断表达式2>    then     <执行表达式2>
              when   <判断表达式3>    then     <执行表达式3>
     
    ...
    else <执行表达式n> end

    从上向下执行 ,先根据 判断表达式1 的真值结果 ,如果是true 就返回后面的 执行表达式1的结果,case表达式到此结束,后面的不再执行;如果判断表达式1的真值结果是false,

    就向下 进行判断表达式2的判断,看返回的真值结果判断后面的执行表达式2是否执行 。

    如果没有 就返回 else 后面的执行表达式n的结果。

    可见无论case表达式 中的条件分支写了有多少,最终 只会执行其中一条符合 判断表达式的的那一条 when ...   then  ...   ,最终会返回一个数字,字符串,日期等简单的值。

    else <执行表达式n>  这一条最好不要省略,虽然省略之后,会自动加上 else  null ;  但为了阅读性 ,最好不要省略。

    case表达式的书写位置 :

    由于case表达式 ,最终总会返回一个数字,字符创,日期等值的地方 ,均可以使用 case表达式 。

    简单case表达式 的基本语法格式:

    case   <表达式>
              when   <表达式1>    then     <执行表达式1> 
              when   <表达式2>    then     <执行表达式2>
              when   <表达式3>    then     <执行表达式3>
     
              ...
              else    <执行表达式n>
    end
  • 相关阅读:
    Qt使用第三方库3rdparty
    Qt5.5以来对Network的改进(包括对SSL的功能支持,HTTP的重定向等等)
    ddd
    C# ICSharpCode.SharpZipLib
    OWIN
    C#/.NET code
    ABP启动配置
    Oracle表空间及分区表
    Grunt和Gulp构建工具在Visual Studio 2015中的高效的应用
    WebAPI使用多个xml文件生成帮助文档
  • 原文地址:https://www.cnblogs.com/wangliyue/p/4182404.html
Copyright © 2011-2022 走看看