SQL学习日记(3)

创建计算字段

计算字段

不实际存在于数据库表中,是运行时在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支持以下类型的函数:

  1. 处理文本字符串
  2. 对数值数据进行算术操作
  3. 处理日期和时间值
  4. 返回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中是一致且最统一的函数

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值