計算欄位 存儲在資料庫表中的數據一般不是應用程式所需要的格式。下麵舉 幾個例子。 * 如果想在一個欄位中既顯示公司名,又顯示公司的地址,但這兩 個信息一般包含在不同的表列中。 * 城市、州和郵政編碼存儲在不同的列中(應該這樣),但郵件標簽 列印程式卻需要把它們作為一個恰當格式的欄位檢索出來。 * 列 ...
計算欄位
存儲在資料庫表中的數據一般不是應用程式所需要的格式。下麵舉
幾個例子。
* 如果想在一個欄位中既顯示公司名,又顯示公司的地址,但這兩
個信息一般包含在不同的表列中。
* 城市、州和郵政編碼存儲在不同的列中(應該這樣),但郵件標簽
列印程式卻需要把它們作為一個恰當格式的欄位檢索出來。
* 列數據是大小寫混合的,但報表程式需要把所有數據按大寫表示
出來。
* 物品訂單表存儲物品的價格和數量,但不需要存儲每個物品的總
價格(用價格乘以數量即可)。為列印發票,需要物品的總價格。
* 需要根據表數據進行總數、平均數計算或其他計算。
在上述每個例子中,存儲在表中的數據都不是應用程式所需要的。
我們需要直接從資料庫中檢索出轉換、計算或格式化過的數據;而不是
檢索出數據,然後再在客戶機應用程式或報告程式中重新格式化。
這就是計算欄位發揮作用的所在了。與前面各章介紹過的列不同,
計算欄位並不實際存在於資料庫表中。計算欄位是運行時在 SELECT 語句
內創建的。
欄位(field) 基本上與列(column)的意思相同,經常互換使
用,不過資料庫列一般稱為列,而術語欄位通常用在計算欄位的
連接上。
重要的是要註意到,只有資料庫知道 SELECT 語句中哪些列是實際的
表列,哪些列是計算欄位。從客戶機(如應用程式)的角度來看,計算
欄位的數據是以與其他列的數據相同的方式返回的。
客戶機與伺服器的格式 可在SQL語句內完成的許多轉換
和格式化工作都可以直接在客戶機應用程式內完成。但一
般來說,在資料庫伺服器上完成這些操作比在客戶機中完
成要快得多,因為DBMS是設計來快速有效地完成這種處
理的。
拼接欄位
拼接(concatenate) 將值聯結到一起構成單個值。
解決辦法是把兩個列拼接起來。在MySQL的 SELECT 語句中,可使用
Concat() 函數來拼接兩個列
MySQL的不同之處 多數DBMS使用 + 或 || 來實現拼接,
MySQL則使用 Concat() 函數來實現。當把SQL語句轉換成
MySQL語句時一定要把這個區別銘記在心。
Concat() 拼接串,即把多個串連接起來形成一個較長的串。
Concat() 需要一個或多個指定的串,各個串之間用逗號分隔。
上面的 SELECT 語句連接以下4個元素:
- 存儲在 vend_name 列中的名字;
- 包含一個空格和一個左圓括弧的串;
- 存儲在 vend_country 列中的國家;
- 包含一個右圓括弧的串。
從上述輸出中可以看到, SELECT 語句返回包含上述4個元素的單個列
(計算欄位)。
通過刪除數據右側多餘的空格來整理數據,這可以
使用MySQL的 RTrim() 函數來完成,如下所示:
Trim 函數 MySQL除了支持 RTrim() (正如剛纔所見,它去掉
串右邊的空格),還支持 LTrim() (去掉串左邊的空格)以及
Trim() (去掉串左右兩邊的空格)。
使用別名
從前面的輸出中可以看到, SELECT 語句拼接地址欄位工作得很好。
但此新計算列的名字是什麼呢?實際上它沒有名字,它只是一個值。如
果僅在SQL查詢工具中查看一下結果,這樣沒有什麼不好。但是,一個未
命名的列不能用於客戶機應用中,因為客戶機沒有辦法引用它。
為瞭解決這個問題,SQL支持列別名。別名(alias)是一個欄位或值
的替換名。別名用 AS 關鍵字賦予。請看下麵的 SELECT 語句
SELECT 語句本身與以前使用的相同,只不過這裡的語句中計算
欄位之後跟了文本 AS vend_title 。它指示SQL創建一個包含
指定計算的名為 vend_title 的計算欄位。從輸出中可以看到,結果與以
前的相同,但現在列名為 vend_title ,任何客戶機應用都可以按名引用
這個列,就像它是一個實際的表列一樣
別名的其他用途 別名還有其他用途。常見的用途包括在實際
的表列名包含不符合規定的字元(如空格)時重新命名它,在
原來的名字含混或容易誤解時擴充它,等等
導出列 別名有時也稱為導出列(derived column),不管稱為
什麼,它們所代表的都是相同的東西
執行算術計算
計算欄位的另一常見用途是對檢索出的數據進行算術計算
如何測試計算 SELECT 提供了測試和試驗函數與計算的一個
很好的辦法。雖然 SELECT 通常用來從表中檢索數據,但可以
省略 FROM 子句以便簡單地訪問和處理表達式。例如, SELECT
3*2; 將返回 6 , SELECT Trim('abc'); 將返回 abc ,而 SELECT
Now() 利用 Now() 函數返回當前日期和時間。通過這些例子,
可以明白如何根據需要使用 SELECT 進行試驗。
本章介紹了計算欄位以及如何創建計算欄位。我們用例子說明瞭計
算欄位在串拼接和算術計算的用途。此外,還學習瞭如何創建和使用別
名,以便應用程式能引用計算欄位。