[SQL] SQL 基础知识梳理(六)- 函数、谓词、CASE 表达式
SQL 基础知识梳理(六)- 函数、谓词、CASE 表达式

目录
- 函数
- 谓词
- CASE 表达式
一、函数
1.函数:输入某一值得到相应输出结果的功能,输入值称为“参数”,输出值称为“返回值”。
2.函数的种类:
(1)算术函数 - 数值计算
(2)字符串函数 - 字符串操作
(3)日期函数 - 日期操作
(4)转换函数 - 转换数据类型
(5)聚合函数 - 数据聚合
3.算术函数(加、减、乘、除):+、-、*、/
【备注】数据类型 NUMBERIC(全体位数,小数位数)可以指定数值的大小。
CREATE TABLE SampleMath
(
m NUMERIC(10, 3) ,
n INTEGER ,
p INTEGER
); BEGIN TRAN; INSERT INTO dbo.SampleMath
( m, n, p )
VALUES ( 500, -- m - numeric
0, -- n - integer
NULL -- p - integer
);
INSERT INTO dbo.SampleMath
( m, n, p )
VALUES ( -180, -- m - numeric
0, -- n - integer
NULL -- p - integer
);
INSERT INTO dbo.SampleMath
( m, n, p )
VALUES ( NULL, -- m - numeric
NULL, -- n - integer
NULL -- p - integer
);
INSERT INTO dbo.SampleMath
( m, n, p )
VALUES ( NULL, -- m - numeric
7, -- n - integer
3 -- p - integer
);
INSERT INTO dbo.SampleMath
( m, n, p )
VALUES ( NULL, -- m - numeric
5, -- n - integer
2 -- p - integer
);
INSERT INTO dbo.SampleMath
( m, n, p )
VALUES ( NULL, -- m - numeric
4, -- n - integer
NULL -- p - integer
);
INSERT INTO dbo.SampleMath
( m, n, p )
VALUES ( 8, -- m - numeric
NULL, -- n - integer
3 -- p - integer
);
INSERT INTO dbo.SampleMath
( m, n, p )
VALUES ( 2.27, -- m - numeric
1, -- n - integer
NULL -- p - integer
);
INSERT INTO dbo.SampleMath
( m, n, p )
VALUES ( 5.555, -- m - numeric
2, -- n - integer
NULL -- p - integer
);
INSERT INTO dbo.SampleMath
( m, n, p )
VALUES ( NULL, -- m - numeric
1, -- n - integer
NULL -- p - integer
);
INSERT INTO dbo.SampleMath
( m, n, p )
VALUES ( 8.76, -- m - numeric
NULL, -- n - integer
NULL -- p - integer
); COMMIT;
初始化数据
(1)ABS - 绝对值:不考虑数值的符号,表示一个数到原点距离的数值。
绝对值的计算方法:0 和正数的绝对值就是其本身,负数的绝对值就是去掉符号后的结果。
--语法: ABS(数值)

图:第 2 行:-180 的绝对值为 180
(2)MOD - 取余、求余
--语法: MOD(被除数,除数)
【备注】Oracle、DB2、PostgreSQL、MySQL 支持该函数,而 SQL Server 不支持该函数,所以这里用“%”代替。

(3)ROUND - 四舍五入
如果指定四舍五入的位数为 1,那么会对小数点第 2 位进行四舍五入;如果指定位数为 2,那么就会对第 3 位进行四舍五入。
4.字符串函数
CREATE TABLE SampleStr
(
str1 VARCHAR(40),
str2 VARCHAR(40),
str3 VARCHAR(40)
) BEGIN TRAN;
INSERT INTO dbo.SampleStr
( str1, str2, str3 )
VALUES ( 'opx', -- str1 - varchar(40)
'rt', -- str2 - varchar(40)
NULL -- str3 - varchar(40)
); INSERT INTO dbo.SampleStr
( str1, str2, str3 )
VALUES ( 'abc', -- str1 - varchar(40)
'def', -- str2 - varchar(40)
NULL -- str3 - varchar(40)
); INSERT INTO dbo.SampleStr
( str1, str2, str3 )
VALUES ( 'aaa', -- str1 - varchar(40)
NULL, -- str2 - varchar(40)
NULL -- str3 - varchar(40)
); INSERT INTO dbo.SampleStr
( str1, str2, str3 )
VALUES ( 'aaa', -- str1 - varchar(40)
NULL, -- str2 - varchar(40)
NULL -- str3 - varchar(40)
); INSERT INTO dbo.SampleStr
( str1, str2, str3 )
VALUES ( NULL, -- str1 - varchar(40)
'xyz', -- str2 - varchar(40)
NULL -- str3 - varchar(40)
); INSERT INTO dbo.SampleStr
( str1, str2, str3 )
VALUES ( '@!#$%', -- str1 - varchar(40)
NULL, -- str2 - varchar(40)
NULL -- str3 - varchar(40)
); INSERT INTO dbo.SampleStr
( str1, str2, str3 )
VALUES ( 'ABC', -- str1 - varchar(40)
NULL, -- str2 - varchar(40)
NULL -- str3 - varchar(40)
); INSERT INTO dbo.SampleStr
( str1, str2, str3 )
VALUES ( 'aBC', -- str1 - varchar(40)
NULL, -- str2 - varchar(40)
NULL -- str3 - varchar(40)
); INSERT INTO dbo.SampleStr
( str1, str2, str3 )
VALUES ( 'abc太郎', -- str1 - varchar(40)
'abc', -- str2 - varchar(40)
'ABC' -- str3 - varchar(40)
); INSERT INTO dbo.SampleStr
( str1, str2, str3 )
VALUES ( 'abcdefabc', -- str1 - varchar(40)
'abc', -- str2 - varchar(40)
'ABC' -- str3 - varchar(40)
); INSERT INTO dbo.SampleStr
( str1, str2, str3 )
VALUES ( 'micmic', -- str1 - varchar(40)
'i', -- str2 - varchar(40)
'T' -- str3 - varchar(40)
); COMMIT;
初始化数据
(1)拼接:+

(2)LEN - 字符串长度
--语法: LEN(字符串)

(3)LOWER - 小写转换
--语法:LOWER(字符串)

(4)REPLACE - 字符串的替换
--语法:REPLACE(对象字符串, 替换前的字符串, 替换后的字符串)

(5)SUBSTRING - 字符串的截取
--语法:SUBSTRING(对象字符串,截取的起始位置,截取的字符数)

(6)UPPER - 大写转换
--语法:UPPER(字符串)

5.日期函数
(1)获取当前日期和时间:

(2)DATEPART - 截取日期元素

6.转换函数
(1)CAST - 类型转换

(2)COALESCE - 将 NULL 转换为其他值
作用:返回可变参数中左侧开始的第一个不是 NULL 的值(参数是可变的,即可以个数是无限的)。
--语法:COALESCE(数据1, 数据2, 数据3 ...)

图

图
二、谓词
1.谓词:返回值为真值(TRUE/FALSE/UNKNOWN)的函数。
2.LIKE - 字符串的部分一致查询
【备注】= 运算符:字符串完全一致。
CREATE TABLE SampleLike
(
strcool VARCHAR(6) NOT NULL,
PRIMARY KEY(strcool)
) BEGIN TRAN;
INSERT INTO dbo.SampleLike
( strcool )
VALUES ( 'abcddd' -- strcool - varchar(6)
); INSERT INTO dbo.SampleLike
( strcool )
VALUES ( 'dddabc' -- strcool - varchar(6)
); INSERT INTO dbo.SampleLike
( strcool )
VALUES ( 'abdddc' -- strcool - varchar(6)
); INSERT INTO dbo.SampleLike
( strcool )
VALUES ( 'ddabc' -- strcool - varchar(6)
) INSERT INTO dbo.SampleLike
( strcool )
VALUES ( 'abddc' -- strcool - varchar(6)
) COMMIT;
初始化数据
%:0 字符以上的任意字符串。
_:任意 1 个字符。

图:前部分一致

图:中间一致

图:后部分一致

后面 ddd 是 3 个字符,所以“abc__(2个 _)”不满足条件。
3.BETWEEN - 范围查询

BETWEEN 会在结果中包含临界值(100 和 1000)。如果不想包含临界值可以使用 < 和 >。

4.IS NULL、IS NOT NULL - 判断是否为 NULL
为了选取部分值为 NULL 的列的数据,不能使用 =,只能使用 IS NULL。

取反(不为空的数据),请使用 IS NOT NULL。

5.IN - OR 的简便用法

用 IN 替换上述语句:

否定形式 NOT IN:

【备注】IN 和 NOT IN 是无法选取 NULL 数据的。
6.使用子查询作为 IN 谓词的参数
IN 和 NOT IN 谓词具有其它谓词没有的用法,它的参数可以是子查询。
-- DDL:创建表
CREATE TABLE TenpoShohin
(tenpo_id CHAR(4) NOT NULL,
tenpo_mei VARCHAR(200) NOT NULL,
shohin_id CHAR(4) NOT NULL,
suryo INTEGER NOT NULL,
PRIMARY KEY (tenpo_id, shohin_id)); -- DML:插入数据 INSERT INTO TenpoShohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES ('000A', '东京', '', 30);
INSERT INTO TenpoShohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES ('000A', '东京', '', 50);
INSERT INTO TenpoShohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES ('000A', '东京', '', 15);
INSERT INTO TenpoShohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES ('000B', '名古屋', '', 30);
INSERT INTO TenpoShohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES ('000B', '名古屋', '', 120);
INSERT INTO TenpoShohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES ('000B', '名古屋', '', 20);
INSERT INTO TenpoShohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES ('000B', '名古屋', '', 10);
INSERT INTO TenpoShohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES ('000B', '名古屋', '', 40);
INSERT INTO TenpoShohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES ('000C', '大阪', '', 20);
INSERT INTO TenpoShohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES ('000C', '大阪', '', 50);
INSERT INTO TenpoShohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES ('000C', '大阪', '', 90);
INSERT INTO TenpoShohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES ('000C', '大阪', '', 70);
INSERT INTO TenpoShohin (tenpo_id, tenpo_mei, shohin_id, suryo) VALUES ('000D', '福冈', '', 100);
测试数据

图

7.EXIST
很多时候基本上可以使用 IN 或 NOT IN 来代替该谓词。
作用:判断是否存在满足某种条件的记录。


NOT EXIST 与 EXIST 相反,不存在:

三、CASE 表达式
1.CASE 表达式:(条件)分歧。
2.语法
--语法
--CASE WHEN <判断表达式> THEN <表达式>
-- WHEN <判断表达式> THEN <表达式>
-- ...
-- ELSE <表达式>
--END
判断表达式类似“键 = 值”的形式,返回值为真值(TRUE/FALSE/UNKNOW)的表达式。如果结果为真,就会返回 THEN 子句中的表达式;如果不为真,就跳转到下一条 WHEN 子句的判断中;如果到最后的 WHEN 子句都不为真,就执行最后一条 ELSE 的表达式。

下面是简化版的 CASE 表达式:

3.行转列


备注
这里采用 MS SQL Server 进行验证,不保证所有的 DBMS 执行结果正确。
《SQL 基础知识梳理》系列
《SQL 基础知识梳理(六)- 函数、谓词、CASE 表达式》
【博主】反骨仔
【原文】http://www.cnblogs.com/liqingwen/p/6572284.html
【参考】《SQL ゼロからはじめるデータベース操作》
[SQL] SQL 基础知识梳理(六)- 函数、谓词、CASE 表达式的更多相关文章
- 【SQL】- 基础知识梳理(二) - SQL简介
一.引言 在梳理这些知识之前,说实话,如果有人问我SQL是什么?我可能会回答就是“INSERT,DELETE,UPDATE,SELECT”语句呗,还能是啥. 二.SQL概念 SQL是什么? SQL是S ...
- 【SQL】- 基础知识梳理(六) - 游标
游标的概念 结果集,结果集就是select查询之后返回的所有行数据的集合. 游标(Cursor): 是处理数据的一种方法. 它可以定位到结果集中的某一行,对数据进行读写. 也可以移动游标定位到你需要的 ...
- 【SQL】- 基础知识梳理(七) - 索引
索引的概念 在关系型数据库中,索引是对数据库表中一列或多列的值进行排序的一种结构. SQL SERVER中有索引的类型:按存储结构区分:“聚集索引(又称聚类索引,簇集索引)”,“分聚集索引(非聚类索引 ...
- 【SQL】- 基础知识梳理(一) - 数据库
一.引言 知识分享这个事情在公司会议上被提出过几次,可一直因各种事情耽搁下来,“我不如地狱,谁入地狱”,怀着这样一种心态,写下了 数据库系列知识分享. 本文将一步步通过循序渐进的方式带你去了解数据库. ...
- 【SQL】- 基础知识梳理(四) - 存储过程
存储过程的概念 存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行 存储过程的好处 A. 存储过程允许标准组件式编程 ...
- 【SQL】- 基础知识梳理(八) - 事务与锁
事务的概念 事务:若干条T-SQL指令组成的一个操作数据库的最小执行单元,这个整体要么全部成功,要么全部失败.(并发控制) 事务的四个属性:原子性.一致性.隔离性.持久性.称为事务的ACID特性. 原 ...
- 【SQL】- 基础知识梳理(三) - SQL连接查询
一.引言 有时为了得到一张报表的完整数据,需要从两个或更多的表中获取结果,这时就用到了"连接查询". 二.连接查询 连接查询的定义: 数据库中的表通过键将彼此联系起来,从而获取这些 ...
- 【SQL】- 基础知识梳理(五) - 触发器
触发器的概念 触发器对表进行插入.更新.删除的时候会自动执行的特殊存储过程 触发器的语法 create trigger tgr_name on table_name with encrypion –加 ...
- python基础知识梳理-----7函数
基本内容梳理 1:函数定义,函数名,函数体以及函数的调用方式 2:函数的返回值 3:函数的参数 4:函数---动态传参数 5:名称空间,局部名称的加载顺序,全局名称空间,作用域,加载顺序 6:函数的嵌 ...
随机推荐
- jq基础
$(function() { $(".dd").attr("class","cc").append("<h ...
- twemproxyRedis协议解析探索——剖析twemproxy代码正编
这篇文章会对twemproxyRedis协议解析代码部分进行一番简单的分析,同时给出twemproxy目前支持的所有Redis命令.在这篇文章开始前,我想大家去简单地理解一下有限状态机,当然不理解也是 ...
- We Chall-Training: Stegano I-Writeup
MarkdownPad Document html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,ab ...
- 无线网络中,使用MDK3把指定的用户或者热点踢到掉线
准备 1:系统环境为ubuntu16.04, 2:需要mdk3, mdk3这个软件需要通过apt安装, 需要kali系统的源 3:需要安装aircrack-ng套件 今天这套东西,可以在未连接上靶机网 ...
- 【死磕Java并发】-----深入分析volatile的实现原理
通过前面一章我们了解了synchronized是一个重量级的锁,虽然JVM对它做了很多优化,而下面介绍的volatile则是轻量级的synchronized.如果一个变量使用volatile,则它 ...
- C++ 头文件系列 (bitset)
简介 该头文件有关位集,实际上是vector 位 位本质上对应bool的概念,只有0或1,true或false两种对立的值. 但很可惜,字节才是机器上最小的存储单元,所以bool基本上是由一个字节大小 ...
- CentOS 7 网卡命名修改为ethx格式
Linux 操作系统的网卡设备的传统命名方式是 eth0.eth1.eth2等,而 CentOS7 提供了不同的命名规则,默认是基于固件.拓扑.位置信息来分配.这样做的优点是命名全自动的.可预知的,缺 ...
- 前端基本知识(一):W3C标准&&冒泡事件,捕获事件,W3C DOM对象模型,对比分析
W3C标准是万维网联盟, 其他的可以参考万维网版本的更新内容 一.W3C标准 二.W3C DOM事件 三.冒泡事件 四.捕获事件 一.W3C标准 其实网页是由三分部组成:1.结构(structure) ...
- git 命令用法 流程操作
Git 是一款免费的.开源的.分布式的版本控制系统.旨在快速高效地处理无论规模大小的任何软件工程. 每一个 Git克隆 都是一个完整的文件库,含有全部历史记录和修订追踪能力,不依赖于网络连接或中心服务 ...
- Android中Handler使用浅析
1. Handler使用引出 现在作为客户,有这样一个需求,当打开Activity界面时,开始倒计时,倒计时结束后跳转新的界面(思维活跃的朋友可能立马想到如果打开后自动倒计时,就类似于各个APP的欢迎 ...