《SQL必知必会》--计算字段

第七课 创建计算字段

前面几章,除去DISTINCT指令,其他全部指令都是在主语句(select…from…)之后,添加条件指令(限制,排序,过滤)。那么说在主语句有没有什么骚操作呢?

请看本章,SELECT语句内的爱恨情仇。

计算字段

计算字段是运行时在SELECT语句内创建的。

字段(field)基本上与列(column)的意思相同,经常相互使用,不过数据库列一般成为列,而术语字段通常与计算字段一起使用。

为什么使用计算字段呢?或者说什么情况下使用计算字段呢?

  • 需要显示公司名,同时显示公司地址,但是这两个信息存储在不同表列中。
  • 公司名和公司地址这两个字段在同一各表列中,但是在打印程序时需要把他们作为有恰当格式的一个字段检索出来。
  • 列数据中大小写混合,但是在打印中需要把所有数据按大写表示出来。
  • 需要根据表数据进行加减乘除等运算(总价格等)。

在上面几个例子中,我们发现,储存在表中的数据往往并不与现实中的需求一一对应。我们需要直接从数据库中检索出转换、计算或格式化过的数据,而不是检索出数据,然后再在客户端应用程序中二次操作,重新格式化。

简单归纳为拼接字段与算术计算。

这,就是计算字段所起到的作用。

拼接字段

字段拼接

字段拼接即将同一表列中两个及以上的字段的数据拼接为一个整体进行输出表示。

在不同DEMS中,略有差异。

Access 和 SQL Server 中的字段拼接:

1
2
3
select cust_id + '(' + cust_name + ')'
from customers
limit 2, 3;

DB2, Oracle, PostgreSQL, SQLite 和 Open Office Base中的字段拼接:

1
2
3
select cust_id || '(' || cust_name || ')'
from customers
order by cust_id;

相信大多数朋友已经看出来两者的区别了,就是拼接符号分别为+||

但是还有一类DBMS具有和这两类的拼接方式不一样,这就是MySQL 和 MarialDB。

1
2
3
select concat (cust_id, '(', cust_name, ')')
from customers
where cust_id >= 10000004;

还需要特别注意一点,在上述三类字段拼接指令中,除了第三类使用特定函数来字段拼接外,其他两种方式在输出结果上都包含了大量的空格,需要使用特定函数RTRIM()来去掉空格。

如下:

1
2
3
select RTRIM( cust_id + '(' + cust_name + ')' )
from customers
limit 2, 3;

使用别名

使用以上的方法进行字段拼接时输出结果的字段名或者没有或者就是一大段文字例如concat (cust_id, '(', cust_name, ')') ,这样输出的结果实际上只是一个值,我们在接下来的客户端是无非直接引用这种值的。那么我们可不可以直接对他们进行命名后输出呢?

这就要提到这一小节要讲的知识了–列别名。

别名(alias)是一个字段或值的替换名。别名用关键字AS赋予。
在所有DBMS中都可以使用类似以下的方法进行列别名命名。

1
2
3
select RTRIM( cust_id + '(' + cust_name + ')' ) AS cust_nid
from customers
limit 2, 3;

输出结果为:

1
2
3
4
5
cust_nid
----------------------
1000000003(Fun4All)
1000000004(Fun4All)
1000000005(The Toy Store)

执行算术计算

在实际应用中,我们常常需要对表中数据进行各种运算。为了避免二次运算,我们可以在DEMS中使用SQL进行运算后输出。

1
2
3
4
5
6
select prod_id,
quantity,
item_price,
quantity*item_price AS expanded_price
from OrderItems
where order_num = 20008

输出结果:

1
2
3
4
5
6
7
prod_id quantity item_price quantity*item_price AS expanded_price
--------------------------------------------------------------------
RGAN01 5 4.99 24.95
BR03 5 11.99 59.95
BNBG01 10 3.49 34.90
BNBG02 10 3.49 34.90
BNBG03 10 3.49 34.90

上面只是举了一个乘法的例子来说明SQL的算术计算是如何进行的,同样的方法可以用在+,- *, /中,也可以对其进行混合运算,优先级为先乘除后加减,使用()可以改变优先级。

小结

本文首先讲解了主语句SELECT处的拼接字段与别名命名,然后又讲了同样处于SELECT指令内的字段算术计算。

从本文开始,属于SQL语法的入门阶段了。