创建计算字段
计算字段
不实际存在于数据库表中,是运行时在select语句内创建的
字段
与列的意思相同,经常互换使用。一般数据库列一般称为列,而术语字段通常与计算字段一起使用。
拼接字段
将值联结到一起成为单值。根据所用的DBMS,此操作符可用+或||表示.如:access和SQL Server用+号,DB2、Oracle、SQLite用||
假若要生成一个供应商报表,须在格式化的名称(位置)中列出供应商的位置
Select vend_name + ‘(‘+ vend_country +’)’
From vendors
Order by vend_name;
Select vend_name ||‘(‘|| vend_country ||’)’
From vendors
Order by vend_name;
在MySQL或MariaDB中需要使用的语句:
Select Concat(vend_name ,‘(‘, vend_country ,’)’)
From vendors
Order by vend_name;
输中一个计算字段的两个列用空格填充,而实际的结果不需要这些空格。为正确返回格式化的数据,必须去掉空格,使用SQL的RTRIM()来完成。
Select RTRIM(vend_name) + ‘(‘+ vend_country +’)’
From vendors
Order by vend_name;
注意:RTRIM()(去掉字符串右边的空格)、LTRIM()(去掉字符串左边的空格)、TRIM()(去掉字符串左右两边的空格)
使用别名
select语句能够很好地拼接地址字段,但是新计算列没有名字,只是一个值。如果仅在SQL中查询结果,没有什么关系;但是未命名的列不能用于客户端应用,因为客户端没有办法引用它。因此SQL支持列别名,别名是一个字段或值的替换名。用AS关键字赋予。
Select RTRIM(vend_name) + ‘(‘+ vend_country +’)’
AS vend_title
From vendors
Order by vend_name;
执行算术计算
SELECT prod_id,
quantity,
item_price,
Quantity*item_price as expanded_price
From OrderItems
Where order_num=20008;
注意:expand_price是一个计算字段。SQL支持基本算术操作符(+、-、*、/),圆括号可用来区分优先顺序
使用函数处理数据
大多数SQL支持以下类型的函数:
- 处理文本字符串
- 对数值数据进行算术操作
- 处理日期和时间值
- 返回DBMS正使用的特殊信息的系统函数
文本处理函数
上文所用RTRIM()来去除列值右边的空格,这次使用upper()函数:
SELECT vend_name,upper(vend_name) as vend_name_upcase
From vendors
Order by vend_name;
注意:SOUNDEX()函数是一个将任何文本串转换为描述语音表示的字母模式的算法。他考虑了类似于发音字符和字节,能够对文本发音进行比较而不是字母比较。
eg:如果库中存在一名名为Y.LEE的客户而搜索的时候的输入错误,下面的sql是不会有任何返回结果的。
SELECT CUSTOMER_NAME FROM CUSTOMER WHERE CUSTOMER_NAME = 'Y LEE'
而如果这样写:
SELECT CUSTOMER_NAME FROM CUSTOMER WHERE SOUNDEX(CUSTOMER_NAME) =SOUNDEX('Y LEE')
因为两者发音相似,所以他们的SOUNDEX值匹配,这样就会返回一条数据。
日期和时间处理函数
应用程序一般不使用日期和时间的存储格式,日期和时间函数总是读取、统计和处理这些值,但是它们很不一致,可移植性最差。
在SQL Server中检索2012年的所有订单:
Select order_num
From orders
Where datepart(yy,order_data)=2012;
在Access中使用如下版本:
Select order_num
From orders
Where datepart(‘yyyy’,order_data)=2012;
注意:DATEPART()有两个参数,分别是返回的成分和返回成分的日期。在上列中,只从order_date列中返回年份
在PostgreSQL中使用名为DATE_PART的类似函数:
Select order_num
From orders
Where date_part(‘year’,order_data)=2012;
在Oracle中没有datepart()函数,不过有类似的日期处理函数:
Select order_num
From orders
Where to_number(to_char(order_data,’YYYY’))=2012;
注意:to_char用来提取日期的成分,to_number()用来提取成分转换为数值,与2012进行比较
使用between操作符:
Select order_num
From orders
Where order_data between to_date(‘01-01-2012’) and to_date(‘12-31-2012’)=2012;
在MySQL和MariaDB可使用YEAR()从日期中提取年份:
Select order_num
From orders
Where year(order_data)=2012;
在SQLite中有个小技巧:
Select order_num
From orders
Where strftime(‘%Y’,order_data)=’2012’;
注意:提取和使用日期的年份,对于月份过滤,按照相同的处理
在不同的DBMS的日期和时间处理函数可能不同
数值处理函数
相较于日期和时间处理函数,数值函数在不同的DBMS中是一致且最统一的函数