第七章 创建计算字段

如何创建计算字段以及怎么样从应用程序中使用别名。

计算字段

存储在数据库表中的数据一般不是应用程序所需要的格式,例如:

  • 显示两个信息,但不是在用一个表
  • 不同列中,但程序需要把他们作为一个格式的字段检索出来
  • 列数据是大小混合,但程序需要把所以数据按大写表示。
  • 物品订单表存储的物品的价格和数量,但没有存储物品的总价,打印时,需要物品的总价格。
  • 根据需要表的数据进行总数,平均数等计算。
    上面的情况都我们需要从数据库中转换,计算格式化,而不是索引出来再进行计算。

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

字段(field)

与列(column)意思类似,经常相互转换使用,字段通常用在计算字段的链接上。

在SQL内完成转换和格式化,比在客户机应用程序内完成,处理数度更快。

拼接字段

例子:

vendors 表包含供应商id 跟 位置信息,现在需要生成一个供应商表,需要格式化名称,列出供应商位置。此报表需要单个值,而表中的数据存储在,vend_namevend_country中,还需要建vend_country括起来。

拼接(concatenate)

将值联结到一起创建单个值。

在SQL中使用一个特使操作符来拼接两个列,+操作符用加号(+),两个竖杆(||)表示。

在mysql使用CONCAT()函数把项表链接起来,而|| 通等于操作符OR 而&&通等于AND操作符。

下面是在mysql中执行的结果:

  1. mysql> SELECT CONCAT(vend_name, ' (', vend_country, ')')
  2. -> FROM Vendors
  3. -> ORDER BY vend_name;
  4. +--------------------------------------------+
  5. | CONCAT(vend_name, ' (', vend_country, ')') |
  6. +--------------------------------------------+
  7. | Bear Emporium (USA) |
  8. | Bears R Us (USA) |
  9. | Doll House Inc. (USA) |
  10. | Fun and Games (England) |
  11. | Furball Inc. (USA) |
  12. | Jouets et ours (France) |
  13. +--------------------------------------------+
  14. 6 rows in set (0.01 sec)

解释:

  • 存储vend_name列中的名字
  • vend_name 隔一个空格加一个(圆括号
  • 存储在vend_country列中的国家
  • 包含一个闭圆括号串。

    别名

拼接的地址字段,没有一个名字,无法给客户机应用,所以需要字段别名(alias),另一种叫法导出列(derived column)

别名可以用AS关键字赋予

  1. mysql> SELECT vend_name, CONCAT(vend_name, '(', vend_country, ')') AS vend_titel
  2. -> FROM Vendors
  3. -> ORDER BY vend_name;
  4. +-----------------+------------------------+
  5. | vend_name | vend_titel |
  6. +-----------------+------------------------+
  7. | Bear Emporium | Bear Emporium(USA) |
  8. | Bears R Us | Bears R Us(USA) |
  9. | Doll House Inc. | Doll House Inc.(USA) |
  10. | Fun and Games | Fun and Games(England) |
  11. | Furball Inc. | Furball Inc.(USA) |
  12. | Jouets et ours | Jouets et ours(France) |
  13. +-----------------+------------------------+
  14. 6 rows in set (0.00 sec)

解释: 这样用ASvend_title指定拼接输出结果的列名,

别名的另一个用法,列重命名

  1. mysql> SELECT vend_name AS VEND_TEST FROM Vendors ;
  2. +-----------------+
  3. | VEND_TEST |
  4. +-----------------+
  5. | Bear Emporium |
  6. | Bears R Us |
  7. | Doll House Inc. |
  8. | Fun and Games |
  9. | Furball Inc. |
  10. | Jouets et ours |
  11. +-----------------+
  12. 6 rows in set (0.00 sec)

vend_name输出重命名为VEND_TEST.

执行算术计算

用于检索出数据进行计算。

检索出Orders 表中包含收到的所有订单,OrderItems表包含每个订单中的各项物品,

  1. mysql> SELECT prod_id, quantity, item_price FROM OrderItems WHERE order_num = 20008;
  2. +---------+----------+------------+
  3. | prod_id | quantity | item_price |
  4. +---------+----------+------------+
  5. | RGAN01 | 5 | 4.99 |
  6. | BR03 | 5 | 11.99 |
  7. | BNBG01 | 10 | 3.49 |
  8. | BNBG02 | 10 | 3.49 |
  9. | BNBG03 | 10 | 3.49 |
  10. +---------+----------+------------+
  11. 5 rows in set (0.00 sec)BG03 | 3.49 |
  12. +----------+------------+
  13. 5 rows in set (0.03 sec)

解释: 检索prod_idquantityitem_price 中 订单号码为20008的所有物品。

总汇出物品的价格,item_price 包含每项物品的单价,quantity包含数量。

  1. mysql> SELECT prod_id, quantity, item_price,
  2. -> quantity*item_price AS expanded_price
  3. -> FROM OrderItems
  4. -> WHERE order_num = 20008;
  5. +---------+----------+------------+----------------+
  6. | prod_id | quantity | item_price | expanded_price |
  7. +---------+----------+------------+----------------+
  8. | RGAN01 | 5 | 4.99 | 24.95 |
  9. | BR03 | 5 | 11.99 | 59.95 |
  10. | BNBG01 | 10 | 3.49 | 34.90 |
  11. | BNBG02 | 10 | 3.49 | 34.90 |
  12. | BNBG03 | 10 | 3.49 | 34.90 |
  13. +---------+----------+------------+----------------+
  14. 5 rows in set (0.01 sec)

解释:quantity*item_price ,单价乘以数量,输出expanded_price列为计算字段,客户端使用这个列,就跟使用其他列一样。

支持的运算字符 + 加,- 减,* 乘,除 /

原文: https://cxiaodian.gitbooks.io/mysql/content/chapter6.html