谓词和表达式

时间:2024-03-23 13:16:42

一、谓词

1、什么是谓词

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

函数与谓词的区别:通常的函数返回值可能是数字、字符串、日期等,但谓词返回值全是真值。

2、like谓词

         字符串部分的一致查询。即模糊查询。

         部分一致大体分为:前方一致、中间一致、后方一致。

        谓词和表达式

         前方一致查询:

        谓词和表达式

         %代表0字符以上的任意字符串。

         _代表任意一个字符。

         中间一致查询:

        谓词和表达式

         中间一致查询就是取出查询对象字符串中含有作为查询条件的字符串。无论该字符串出现在对象字符串的最后还是中间都没有关系。

         后方一致查询:

        谓词和表达式

         使用like和_进行后方一致查询:

        谓词和表达式    

      “abcddd”也是以abc开头的字符串,但ddd是三个字符,而两个下划线表示两个字符。

        谓词和表达式
  

         Like的转义字符:escape

        谓词和表达式
    

         例:找出字符串A%dMH.

        谓词和表达式
  

         使用escape转义。

        谓词和表达式

3、between谓词

         范围查询。该谓词与其他谓词不同的是使用了3个参数。

         例如:查询销售单价在100和1000日元之间的商品。

        谓词和表达式

         特点:包含两个临街值。若想不包含,就得只有<和>。

        谓词和表达式

4、is null和is not null谓词

         判断是否为空。选取某些包含null列的数据不能使用=,只能使用is null。

         例:选出进货单价为null的商品。

        谓词和表达式

         与此相反,若想获取null以外的数据时,需要使用isnot null。

        谓词和表达式

5、in和not in谓词

         Or的简便用法。

         例:选出进货单价为320、500、5000的商品。

        谓词和表达式

         使用in谓词来代替上面的SQL。

        谓词和表达式

         反之用not in。即选出进货单价不是320、500、5000的商品。

        谓词和表达式

         注:使用in和not in时无法获取null数据。若not in里边包含null,结果也是null。因为null终究是需要is null或is not null判断。

         In和not in可以使用子查询作为参数。

6、exists和not exists谓词

         Exists只要在子查询中找到一个行值就行,如果子查询中有行值,就立即停止子查询的搜索。然后返回true,如果没有相应的行值,则返回true。

         Exists显式emp表中哪些员工不是普通员工。

        谓词和表达式

         子查询中的x只是占位,关联查询只是关心子查询中是否存在。

not exists

         显式dept表中还没有员工的部门。

        谓词和表达式

         引入exists的目的:在一些情况下,只需要子查询返回一个真值或是假值。如果只考虑是否满足判断条件,而数据本身并不重要,可以使用exists操作符来定义子查询。

        谓词和表达式

         以上SQL语句如果子查询(select* from dept where deptno = ‘40’)有结果,那么exists前面的语句会执行,如果exists后面的没结果,那么其前面的不会执行。

         In和not in可以使用子查询作为参数。

二、case表达式

1、语法

         复杂形式:

Case when <求值表达式> then<表达式>

       when <求值表达式> then <表达式>

                   when<求值表达式> then <表达式>

                   ······

                   Else<表达式>

         End

         简单形式:

         Case<表达式>

                   When<表达式> then <表达式>

                   When<表达式> then <表达式>

                   When<表达式> then <表达式>

                   ······

                   Else<表达式>

         End

         Case表达式会从最开始的when子句中的<求值表达式>进行求值开始执行。如果结果是true就执行then。Case执行就结束,若结果是false,则执行下一条when,若执行到最后一条when都返回false,则执行else。

例:product包含衣服,办公用品,厨房用具3中商品类型,如何将类型显式出如下结果。

         A:衣服

         B:办公用具

         C:厨房用具

解析:通过case表达式将ABC字符加入到商品类型中。

            谓词和表达式

         Elsenull就是上述情况之外的返回空。Else子句可以不写,默认为else null。

         Case表达式改写,如上,可以改写成以下简单形式:

        谓词和表达式

三、decode表达式

         语法:

         decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值)

        将case中的例子用decode改写,也可以实现效果,如下:

        谓词和表达式

1、使用decode判断字符串是否一样

        DECODE(value,if1,then1,if2,then2,if3,then3,...,else)

        含义为

        IF 条件=值1 THEN

    RETURN(value1)

        ELSIF 条件=值2 THEN

    RETURN(value2)

    ......

        ELSIF 条件=值n THEN

    RETURN(value3)

        ELSE

    RETURN(default)

        END IF

sql测试:

        谓词和表达式

2、使用decode比较大小

selectdecode(sign(var1-var2),-1,var 1,var2) from dual

sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1

sql测试

        谓词和表达式

        100-90=10>0 则会返回1,所以decode函数最终取值为90

        反之

        select decode(sign(100-90),1,100,90) fromdual

        输出结果

        100

        谓词和表达式

        100-90=10>0返回1,判断结果为1,返回第一个变量100,最终输出结果为100

3、使用decode函数分段

工资大于5000为高薪,工资介于3000到5000为中等,工资小于3000为低薪

sql测试

        谓词和表达式

4、利用decode实现表或者试图的行列转换

sql测试

        谓词和表达式
        

5、使用decode函数来使用表达式来搜索字符串

    decode (expression, search_1, result_1,search_2, result_2, ...., search_n, result_n, default)

    decode函数比较表达式和搜索字,如果匹配,返回结果;如果不匹配,返回default值;如果未定义default值,则返回空值。

    sql测试

        谓词和表达式