《SQL必知必会》读书笔记

存储在数据库表中的数据一般不是应用程序所需要的格式,下面举几个例子。

  • 需要显示公司名,同时还需要显示公司的地址,但这两个信息存储在不同的表列中。
  • 城市、州和邮政编码存储在不同的列中(应该这样),但邮件标签打印持续需要把它们作为一个有恰当格式的字段检索出来。
  • 列数据是大小写混合的,但报表程序需要把所有数据按大写表示出来。
  • 物品订单表存储物品的价格和数量,不存储每个物品的总价格(用价格乘以数量即可)。但为打印发票,需要物品的总价格。
  • 需要根据表数据进行诸如总数、平均数的计算。

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

1.拼接字段

Vendors表包含供用商名和地址信息。假如要生成一个供应商报表,需要格式化的名称中列出供应商的位置。

拼接:将值联结在一起(将一个值附加到另一个值)构成单个值。

解决方法是把两个列拼接起来。在SQL中的SELECT语句中,可使用一个特殊的操作符来拼接两个列。+(在Access和SQL Serve)或 || (在DB2、Oracle、PostgreSQL、SQLite和Open Office Base),另外在MySQL和MariaDB中,必须使用特殊的函数。

SELECT vend_name + '(' + vend_country + ')'
FROM Vendors

Bear Emporium       (USA    )
Bears R Us          (USA    )
Doll House Inc.     (USA    )
Fun and Games       (England)
Furball Inc.        (USA    )
Jouets et ours      (France )

下面是相同的语法,但使用的是||语法:

SELECT vend_name || '(' || vend_country || ')'
FROM Vendors

Bear Emporium       (USA    )
Bears R Us          (USA    )
Doll House Inc.     (USA    )
Fun and Games       (England)
Furball Inc.        (USA    )
Jouets et ours      (France )

下面是使用MySQL或MariaDB时需要使用的语句:

SELECT vend_name , '(' , vend_country , ')'
FROM Vendors

为正确返回格式化的数据,必须去掉这些空格。这可以用SQL的RTRIM()函数来完成,如下所示:

SELECT RTRIM(vend_name) + '(' + RTRIM(vend_country) + ')'
FROM Vendors

Bear Emporium (USA)
Bears R Us (USA)
Doll House Inc. (USA)
Fun and Games (England)
Furball Inc. (USA)
Jouets et ours (France)

说明:TRIM函数

RTRIM()函数去掉字符串右边的空格。
LTRIM()函数去掉字符串左边的空格。
TRIM()函数去掉字符串左右两边的空格。

使用别名:

从前面的输出可以看到,SELECT语句可以很好地拼接地址字段。我们利用AS关键字为该字段赋予别名,就可以引用它了。

SELECT RTRIM(vend_name) + '(' + RTRIM(vend_country) + ')'
    AS vend_title
FROM Vendors

vend_title

Bear Emporium (USA)
Bears R Us (USA)
Doll House Inc. (USA)
Fun and Games (England)
Furball Inc. (USA)
Jouets et ours (France)

别名有时也称导出列。

别名的其他用途:
1. 实际的表列名包含不合法的字段(如空格)时重命名它
2. 在原来的名字含混或容易误解时扩充它。

2.执行算术计算

计算字段的另一常见用途是对检索出的数据进行算术计算。

SELECT prod_id,
       quantity,
       item_price,
       quantity*item_price AS expended_price
FROM OrderItems
WHERE order_num =2008


prod_id     quantity    item_price  expanded_price
RGAN01      5           4.9900      24.9500
BR03        5           11.9900     59.9500
BNBG01      10          3.4900      34.9000
BNBG02      10          3.4900      34.9000
BNBG03      10          3.4900      34.9000

SQL算术操作符:+、-、*、/,此外圆括号原来区分优先顺序。