1 创建计算字段
1.1 计算字段
存储在数据库表中的数据,一般不是应用程序所需要的格式。
比如:
- 需要显示公司名,同时还要显示公司的地址,但这两个信息存储在不同的列表中。
- 城市、州和邮政编码存储在不同的列中,但邮件标签打印程序需要把它们作为一个有恰当格式的字段检索出来。
- 列数据是大小写混合的,但报表程序需要把所有数据按大写表示出来。
- 物品订单表存储物品的价格和数量,不存储每个物品的总价格,单位打印发票,需要物品的总价格。
- 需要根据表数据进行诸如总数、平均数的计算。
在上述这些例子中,存储在表中的数据都不是应用程序所需要的。我们需要从数据库中检索出转换、计算或格式化过的数据,而不是检索出数据,然后在客户端应用程序中重新格式化。
字段(field):基本上与列(column)的意思相同,经常互换使用,不过数据库列一般称为列,而术语字段通常与计算字段一起使用。
1.2 拼接字段
拼接(concatenate):将值连接到一起(将一个值附加到另一个值)构成单个值。
Access和SQL Server使用加号(+),DB2、Oracle、PostgreSQL和SQLite使用两个竖杠(||),MySQL、MariaDB使用concat函数。
生成供应商报表,显示出vend_name和vend_country,并且将vend_country括起来。
SELECT vend_name + '(' + vend_country + ')'
FROM Vendors
ORDER BY vend_name;
SELECT vend_name || '(' || vend_country || ')'
FROM Vendors
ORDER BY vend_name;
SELECT concat(vend_name, '(', vend_country, ')')
FROM Vendors
ORDER BY vend_name;
上面SELECT语句拼接以下元素:
- 存储在vend_name列中的名字。
- 包含一个空格和一个左圆括号的字符串。
- 存储在vend_country列中的国家。
- 包含一个右圆括号的字符串。
有些数据库返回的结果会包含空格,也就是圆括号里的内容是右对齐的,所以为消除这种右对齐现象。可以使用rtrim()函数。(MySQL中不会出现右对齐现象。)
SELECT concat(rtrim(vend_name), '(', rtrim(vend_country), ')')
FROM Vendors
ORDER BY vend_name;
rtrim()去掉字符串右边的空格,ltrim()去掉字符串左边的空格,trim()去掉字符串左右两边的空格。
在上例中,我们可以看到显示的列字段的名字,是SELECT后的检索字段,比如显示为concat(vend_name, '(', vend_country, ')'),怎么让它显示为合适的字段呢?使用别名。
别名(alias)是一个字段或值的替换名。别名用AS关键字赋予。
SELECT concat(rtrim(vend_name), '(', rtrim(vend_country), ')')
AS vend_title
FROM Vendors
ORDER BY vend_name;
1.3 执行算数计算
检索订单号为20008中的所有物品:
SELECT prod_id, quantity, item_price
FROM OrderItems
WHERE order_num = 20008;
汇总物品价格:
SELECT prod_id, quantity, item_price,
quantity * item_price AS expanded_price
FROM OrderItems
WHERE order_num = 20008;
2 使用函数处理数据(文本、日期、数值)
大多数SQL实现支持以下类型的函数:
- 用于处理文本字符串(如删除或填充值,转换值为大写或小写)的文本函数。
- 用于在数值数据上进行算数操作(如返回绝对值,进行代数运算)的数值函数。
- 用于处理日期和时间值并从这些值中提取特定成分(如返回两个日期之差,检查日期有效性)的日期和时间函数。
- 返回DBMS正使用的特殊信息(如返回用户登录信息)的系统函数。
2.1 文本处理函数
常用的文本处理函数
函数 | 说明 |
---|---|
left() | 返回字符串左边的字符 |
right() | 返回字符串右边的字符 |
ltrim() | 去掉字符串左边的空格 |
rtrim() | 去掉字符串右边的空格 |
lower() | 将字符串转换为小写 |
upper() | 将字符串转换为大写 |
length() | 返回字符串的长度 |
soundex() | 返回字符串的SOUNDEX值 |
SELECT vend_name, upper(vend_name) AS vend_name_upcase
FROM Vendors
ORDER BY vend_name;
soundex()指的是两个字符串的发音相似。
SELECT cust_name, cust_contact
FROM Customers
WHERE soundex(cust_contact) = soundex('Michael Green');
因为Michael Green和Michelle Green发音相似,所以它们的soundex值匹配,因此WHERE子句可以正确地过滤出所需数据。
2.2 日期和时间处理函数
日期和时间值一特殊的格式存储,以便能快速和有效地排序或过滤,并且节省物理存储空间。
Orders表中包含的订单都带有订单日期,在SQL Server中检索2012年的所有订单。
SELECT order_num
FROM Orders
WHERE datepart(yy, order_date) = 2012;
在Access中:
SELECT order_num
FROM Orders
WHERE datepart('yyyy', order_date) = 2012;
MySQL和MariaDB可以使用year()函数从日期中提取年份。
SELECT order_num, order_date
FROM Orders
WHERE year(order_date) = 2012;
可以看到,不同DBMS的日期和时间处理函数是不同的,在处理的时候,要参考相应的文档。
2.3 数值处理函数
数值处理函数仅处理数值数据,这些函数主要用于代数、三角或几何运算,因此不想字符串或日期-时间处理函数使用那么频繁。
常用的数值处理函数
函数 | 说明 |
---|---|
PI() | 返回圆周率 |
ABS() | 返回一个数的绝对值 |
EXP() | 返回一个数的指数值 |
SQRT() | 返回一个数的平方根 |
SIN() | 返回一个角度的正弦 |
COS() | 返回一个角度的余弦 |
TAN() | 返回一个角度的正切 |
下面的只是一个例子,没有实际意义,只是为了说明可以用数值处理函数处理数值数据。
如果您发现文中有不清楚或者有问题的地方,请在下方评论区留言,我会根据您的评论,更新文中相关内容,谢谢!