計算字段
存儲在數據庫表中的數據一般不是應用程序所需要的格式。下面舉
幾個例子。
- 如果想在一個字段中既顯示公司名,又顯示公司的地址,但這兩
個信息一般包含在不同的表列中。 - 城市、州和郵政編碼存儲在不同的列中(應該這樣),但郵件標簽
打印程序卻需要把它們作為一個恰當格式的字段檢索出來。 - 列數據是大小寫混合的,但報表程序需要把所有數據按大寫表示
出來。 - 物品訂單表存儲物品的價格和數量,但不需要存儲每個物品的總
價格(用價格乘以數量即可)。為打印發票,需要物品的總價格。 - 需要根據表數據進行總數、平均數計算或其他計算。
在上述每個例子中,存儲在表中的數據都不是應用程序所需要的。
我們需要直接從數據庫中檢索出轉換、計算或格式化過的數據;而不是檢索出數據,然后再在客戶機應用程序或報告程序中重新格式化。
這就是計算字段發揮作用的所在了。與前面各章介紹過的列不同,計算字段并不實際存在于數據庫表中。計算字段是運行時在SELECT語句內創建的。
字段(field) 基本上與列(column)的意思相同,經?;Q使用,不過數據庫列一般稱為列,而術語字段通常用在計算字段的連接上。
重要的是要注意到,只有數據庫知道SELECT語句中哪些列是實際的
表列,哪些列是計算字段。從客戶機(如應用程序)的角度來看,計算
字段的數據是以與其他列的數據相同的方式返回的。
拼接字段
為了說明如何使用計算字段,舉一個創建由兩列組成的標題的簡單例子。
vendors表包含供應商名和位置信息。假如要生成一個供應商報表,需要在供應商的名字中按照name(location)這樣的格式列出供應商的位置。
此報表需要單個值,而表中數據存儲在兩個列vend_name和vend_ country中。此外,需要用括號將vend_country括起來,這些東西都沒有明確存儲在數據庫表中。我們來看看怎樣編寫返回供應商名和位置的SELECT語句。
拼接(concatenate) 將值聯結到一起構成單個值。
MySQL的不同之處 多數DBMS使用+或||來實現拼接,
MySQL則使用Concat()函數來實現。當把SQL語句轉換成MySQL語句時一定要把這個區別銘記在心
解決辦法是把兩個列拼接起來。在MySQL的SELECT語句中,可使用
Concat()函數來拼接兩個列。
SELECT Concat(vend_name, '(', vend_country,')')
FROM vendors
ORDER BY vend_name;
Concat()拼接串,即把多個串連接起來形成一個較長的串。
Concat()需要一個或多個指定的串,各個串之間用逗號分隔。
上面的SELECT語句連接以下4個元素:
1.存儲在vend_name列中的名字;
2.包含一個空格和一個左圓括號的串;
3.存儲在vend_country列中的國家;
4.包含一個右圓括號的串。
從上述輸出中可以看到,SELECT語句返回包含上述4個元素的單個列(計算字段)。
通過刪除數據右側多余的空格來整理數據,這可以
使用MySQL的RTrim()函數來完成,如下所示:
SELECT Concat( RTrim(vend_name), '(', RTrim(vend_country), ')' )
FROM vendors
ORDER BY vend_name;
RTrim()函數去掉值右邊的所有空格。通過使用RTrim(),各個列都進行了整理。
Trim函數 MySQL除了支持RTrim()(正如剛才所見,它去掉
串右邊的空格),還支持LTrim()(去掉串左邊的空格)以及
Trim()(去掉串左右兩邊的空格)。
執行算術計算
計算字段的另一常見用途是對檢索出的數據進行算術計算。
- 舉一個例子,orders表包含收到的所有訂單,orderitems表包含每個訂單中的各項物品。下面的SQL語句檢索訂單號20005中的所有物品:
SELECT prod_id, quantity, item_price
FROM orderirems
WHERE order_num = 20005;
item_price列包含訂單中每項物品的單價。
- 如下匯總物品的價格(單價乘以訂購數量):
SELECT prod_id, quantity, item_price, quantity*item_price AS expanded_price
FROM orderitems
WHERE order_num = 20005;
如何測試計算
6SELECT提供了測試和試驗函數與計算的一個
很好的辦法。雖然SELECT通常用來從表中檢索數據,但可以
省略FROM子句以便簡單地訪問和處理表達式。例如,SELECT
3*2;將返回6,SELECT Trim('abc');將返回abc,而SELECT
Now()利用Now()函數返回當前日期和時間。通過這些例子,
可以明白如何根據需要使用SELECT進行試驗。