SQL谓词与CASE表达式
0|1什么是谓词
谓词就是返回值为真值的函数。对于通常的函数来说,返回值有可能是数字、字符串和日期等,但是谓词的返回值全部是真值。这也是谓词和函数的最大区别。
谓词主要有以下几种:
- LIKE
- BETWEEN
- IS NULL、IS NOT NULL
- IN
- EXISTS
0|1LIKE谓词—字符串的部分一致查询
截止目前,我们使用字符串作为查询条件的例子使用的都是=。这里的=只有在字符串完全一致时才为真。与之相反,LIKE谓词更加模糊一些,当需要进行字符串的部分一致查询时需要使用该谓词。
部分一致大体可以分为前方一致、中间一致和后方一致三种类型。接下来就让我们看一看具体示例吧。
首先,我们先创建一张用作示例的表:
向表中插入数据
确认一下我们创建的表的内容:
执行结果:
0|1前方一致查询
使用Like进行前方一致查询
执行结果:
其中的%代表“0字符以上的任意字符”的特殊符号,上例表示“以ddd开头的所有字符”。
0|1中间一致查询
使用LIKE进行中间一致查询
执行结果:
在字符串的起始和结束位置加上%,就能取出“包含ddd的字符串”。
0|1后方一致查询
使用LIKE进行后方一致查询
执行结果:
此外,我们还可以使用_(下划线)来代替%,与%不同的是,它代表“任意一个字符”,下面我们就来尝试一下:
执行结果:
再举个例子:
执行结果:
0|1BETWEEN谓词—范围查询
使用BETWEEN可以进行范围查询。该谓词与其他谓词或者函数不同的是它使用了3个参数。
执行结果:
BETWEEN的特点就是结果会包含100和1000这两个临界值。如果不想让结果包含临界值,那就必须使用<和>。
执行结果:
0|1IS NULL、IS NOT NULL—判断是否为NULL
为了选取某些值为NULL的列的数据,不能使用=,而只能使用特定的谓词IS NULL。
执行结果:
与之相反,如果选取NULL以外的数据,需要使用谓词IS NOT NULL。
执行结果:
0|1IN谓词—OR的简便用法
通过OR指定多个进货单价进行查询:
执行结果:
我们使用IN 谓词来替换上述SQL语句:
执行结果:
反之,否定形式可以使用NOT IN来实现:
执行结果:
注释:使用IN 和NOT IN 时是无法取出NULL数据的,NULL终究是需要使用IS NULL和IS NOT NULL来进行判断。
0|1使用子查询作为IN谓词的参数
0|1IN谓词和子查询
IN谓词(NOT IN谓词)具有其他谓词所没有的用法,那就是可以使用子查询来作为其参数。子查询在之前已经学过,就是SQL内部生成的表。
为了掌握更详尽的使用方法,我们再创建一张新表:
向表ShopProduct中插入数据
确认创建的表的内容:
执行结果:
使用子查询作为IN谓词的参数:
执行结果:
如果在SELECT语句中使用了子查询,那么即使数据发生了变更,还可以继续使用同样的SELECT语句。像这样能够应对数据变更的程序,称为‘易维护程序’。
0|1NOT IN 和子查询
使用子查询作为NOT IN 的参数:
执行结果:
0|1EXISTS谓词
0|1EXISTS谓词的使用方法
一言以蔽之,谓词的作用就是“判断是否存在某种满足条件的记录”。如果存在这样的记录就返回真(TRUE),如果不存在这样的记录就返回假(FALSE)。EXISTS(存在)谓词的主语是“记录”。
执行结果:
注释:
- 通常指定关联子查询作为EXISTS的参数。
- 作为EXISTS参数的子查询中通常使用SELECT *。
0|1使用NOT EXISTS替换NOT IN
就像EXISTS可以替换IN一样,NOT IN 也可以用NOT EXISTS 来替换。
执行结果:
0|1CASE表达式
0|1什么是CASE表达式
CASE表达式是一种进行运算的功能,它是SQL中最重要的功能之一。CASE表达式是在区分情况下使用,这种情况的区分在编程中通常叫做条件(分支)。类似于C语言中的if……else….语句。
0|1CASE表达式的语法
CASE表达式的语法分为简单CASE表达式和搜索CASE表达式两种。但是搜索CASE表达式包含了简单CASE表达式的全部功能,所以我们学习搜索CASE表达式的语法就可以了。
CASE表达式会从最初的WHEN子句中的“ <求值表达式> ”进行求值运算。所谓求值,就是要调查该表达式的真值是什么,如果结果为真(TRUE),那么就返回THEN子句中的表达式,CASE表达式的执行到此为止。如果结果不为真,那么就跳转到下一条的WHEN子句的求值之中。如果知道最后的WHEN子句为止返回结果都不为真,那么就会返回ELSE中的表达式,执行结束。
0|1CASE表达式的使用方法
咱们用一个例子说明:
执行结果:
注释:
- 虽然CASE表达式中的ELSE子句可以省略,但是最好不要省略。
- CASE表达式中的END不能省略。
0|1CASE表达式可以实现行列互换
使用GRUOP BY无法实现行列转换:
执行结果:
但是使用CASE表达式可以实现行列转换
执行结果:
今天的学习到此结束。加油!
__EOF__
作 者:SmithBee 嘿嘿
出 处:https://www.cnblogs.com/SmithBee/p/16031076.html
关于博主:编程路上的小学生,热爱技术,喜欢专研。评论和私信会在第一时间回复。或者直接私信我。
版权声明:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本。
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)