目錄
- 一、計算欄位
- 二、拼接欄位
- 2.1 使用別名
- 三、執行算術計算
- 四、小結
本文介紹什么是計算欄位,如何創建計算欄位,我們用例子說明了計算欄位在字串拼接和算術計算中的用途,以及如何從應用程式中使用別名參考它們,
一、計算欄位
存盤在資料庫表中的資料一般不是應用程式所需要的格式,下面舉幾個例子,
- 需要顯示公司名,同時還需要顯示公司的地址,但這兩個資訊存盤在不同的表列中,
- 城市、州和郵政編碼存盤在不同的列中(應該這樣),但郵件標簽列印程式需要把它們作為一個有恰當格式的欄位檢索出來,
- 列資料是大小寫混合的,但報表程式需要把所有資料按大寫表示出來,
- 物品訂單表存盤物品的價格和數量,不存盤每個物品的總價格(用價格乘以數量即可),但為列印發票,需要物品的總價格,
- 需要根據表資料進行諸如總數、平均數的計算,
在上述每個例子中,存盤在表中的資料都不是應用程式所需要的,我們需要直接從資料庫中檢索出轉換、計算或格式化過的資料,而不是檢索出資料,然后再在客戶端應用程式中重新格式化,
這就是計算欄位可以派上用場的地方了,計算欄位并不實際存在于資料庫表中,計算欄位是運行時在 SELECT 陳述句內創建的,
欄位(field)
基本上與列(column)的意思相同,經常互換使用,不過資料庫列一般稱為列,而欄位這個術語通常在計算欄位這種場合下使用,
需要特別注意,只有資料庫知道 SELECT 陳述句中哪些列是實際的表列,哪些列是計算欄位,從客戶端(如應用程式)來看,計算欄位的資料與其他列的資料的回傳方式相同,
提示:客戶端與服務器的格式
在 SQL 陳述句內可完成的許多轉換和格式化作業都可以直接在客戶端應用程式內完成,但一般來說,在資料庫服務器上完成這些操作比在客戶端中完成要快得多,
二、拼接欄位
為了說明如何使用計算欄位,我們來舉一個簡單例子,創建由兩列組成的標題,
Vendors 表包含供應商名和地址資訊,假如要生成一個供應商報表,需要在格式化的名稱(位置)中列出供應商的位置,
此報表需要一個值,而表中資料存盤在兩個列 vend_name 和 vend_country 中,此外,需要用括號將 vend_country 括起來,這些東西都沒有存盤在資料庫表中,
這個回傳供應商名稱和地址的 SELECT 陳述句很簡單,但我們是如何創建這個組合值的呢?
拼接(concatenate)
將值聯結到一起(將一個值附加到另一個值)構成單個值,
解決辦法是把兩個列拼接起來,在 SQL 中的 SELECT 陳述句中,可使用一個特殊的運算子來拼接兩個列,根據你所使用的 DBMS,此運算子可用加號(+)或兩個豎杠(||)表示,
在 MySQL 和 MariaDB 中,必須使用特殊的函式,
說明:是
+還是||?SQL Server 使用
+號,DB2、Oracle、PostgreSQL 和 SQLite 使用||,詳細請參閱具體的 DBMS 檔案,
下面是使用加號的例子(多數 DBMS 使用這種語法):
SELECT vend_name + '(' + vend_country + ')'
FROM Vendors
ORDER BY vend_name;
輸出:
-----------------------------------------------------------
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
ORDER BY vend_name;
輸出:
-----------------------------------------------------------
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 Concat(vend_name, ' (', vend_country, ')')
FROM Vendors
ORDER BY vend_name;
上面兩個 SELECT 陳述句拼接以下元素:
- 存盤在
vend_name列中的名字; - 包含一個空格和一個左圓括號的字串;
- 存盤在
vend_country列中的國家; - 包含一個右圓括號的字串,
從上述輸出中可以看到,SELECT 陳述句回傳包含上述四個元素的一個列(計算欄位),
再看看上述 SELECT 陳述句回傳的輸出,結合成一個計算欄位的兩個列用空格填充,許多資料庫(不是所有)保存填充為列寬的文本值,而實際上你要的結果不需要這些空格,
為正確回傳格式化的資料,必須去掉這些空格,這可以使用 SQL 的 RTRIM() 函式來完成,如下所示:
SELECT RTRIM(vend_name) + ' (' + RTRIM(vend_country) + ')'
FROM Vendors
ORDER BY vend_name;
輸出:
-----------------------------------------------------------
Bear Emporium (USA)
Bears R Us (USA)
Doll House Inc. (USA)
Fun and Games (England)
Furball Inc. (USA)
Jouets et ours (France)
下面是相同的陳述句,但使用的是 ||:
SELECT RTRIM(vend_name) || ' (' || RTRIM(vend_country) || ')'
FROM Vendors
ORDER BY vend_name;
輸出:
-----------------------------------------------------------
Bear Emporium (USA)
Bears R Us (USA)
Doll House Inc. (USA)
Fun and Games (England)
Furball Inc. (USA)
Jouets et ours (France)
RTRIM() 函式去掉值右邊的所有空格,通過使用 RTRIM(),各個列都進行了整理,
說明:
TRIM函式大多數 DBMS 都支持
RTRIM()(正如剛才所見,它去掉字串右邊的空格)、LTRIM()(去掉字串左邊的空格)以及TRIM()(去掉字串左右兩邊的空格),
2.1 使用別名
從前面的輸出可以看到,SELECT 陳述句可以很好地拼接地址欄位,但是,這個新計算列的名字是什么呢?實際上它沒有名字,它只是一個值,
如果僅在 SQL 查詢工具中查看一下結果,這樣沒有什么不好,但是,一個未命名的列不能用于客戶端應用中,因為客戶端沒有辦法參考它,
為了解決這個問題,SQL 支持列別名,別名(alias)是一個欄位或值的替換名,別名用 AS 關鍵字賦予,請看下面的 SELECT 陳述句:
SELECT RTRIM(vend_name) + ' (' + RTRIM(vend_country) + ')'
AS vend_title
FROM Vendors
ORDER BY vend_name;
輸出:
vend_title
-----------------------------------------------------------
Bear Emporium (USA)
Bears R Us (USA)
Doll House Inc. (USA)
Fun and Games (England)
Furball Inc. (USA)
Jouets et ours (France)
下面是相同的陳述句,但使用的是 || 語法:
SELECT RTRIM(vend_name) || ' (' || RTRIM(vend_country) || ')'
AS vend_title
FROM Vendors
ORDER BY vend_name;
下面是 MySQL 和 MariaDB 中使用的陳述句:
SELECT Concat(RTrim(vend_name), ' (',
RTrim(vend_country), ')') AS vend_title
FROM Vendors
ORDER BY vend_name;
SELECT 陳述句本身與以前使用的相同,只不過這里的計算欄位之后跟了文本 AS vend_title,
它指示 SQL 創建一個包含指定計算結果的名為 vend_title 的計算欄位,
從輸出可以看到,結果與以前的相同,但現在列名為 vend_title,任何客戶端應用都可以按名稱參考這個列,就像它是一個實際的表列一樣,
說明:
AS通常可選在很多 DBMS 中,
AS關鍵字是可選的,不過最好使用它,這被視為一條最佳實踐,
提示:別名的其他用途
別名還有其他用途,常見的用途包括在實際的表列名包含不合法的字符(如空格)時重新命名它,在原來的名字含混或容易誤解時擴充它,
注意:別名
別名的名字既可以是一個單詞,也可以是一個字串,如果是后者,字串應該括在引號中,雖然這種做法是合法的,但不建議這么去做,
多單詞的名字可讀性高,不過會給客戶端應用帶來各種問題,因此,別名最常見的使用是將多個單詞的列名重命名為一個單詞的名字,
說明:匯出列
別名有時也稱為匯出列(derived column),不管怎么叫,它們所代表的是相同的東西,
三、執行算術計算
計算欄位的另一常見用途是對檢索出的資料進行算術計算,舉個例子,Orders 表包含收到的所有訂單,OrderItems 表包含每個訂單中的各項物品,
下面的 SQL 陳述句檢索訂單號 20008 中的所有物品:
SELECT prod_id, quantity, item_price
FROM OrderItems
WHERE order_num = 20008;
輸出:
prod_id quantity item_price
---------- ----------- ---------------------
RGAN01 5 4.9900
BR03 5 11.9900
BNBG01 10 3.4900
BNBG02 10 3.4900
BNBG03 10 3.4900
item_price 列包含訂單中每項物品的單價,如下匯總物品的價格(單價乘以訂購數量):
SELECT prod_id,
quantity,
item_price,
quantity*item_price AS expanded_price
FROM OrderItems
WHERE order_num = 20008;
輸出:
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
輸出中顯示的 expanded_price 列是一個計算欄位,此計算為 quantity*item_price,客戶端應用現在可以使用這個新計算列,就像使用其他列一樣,
SQL 支持表 1 中列出的基本算術運算子,此外,圓括號可用來區分優先順序,關于優先順序的介紹,請參閱 如何使用 SQL AND、OR、IN 和 NOT 過濾回傳的資料,
表 1 SQL 算術運算子
| 運算子 | 說明 |
|---|---|
+ |
加 |
- |
減 |
* |
乘 |
/ |
除 |
提示:如何測驗計算
SELECT陳述句為測驗、檢驗函式和計算提供了很好的方法,雖然
SELECT通常用于從表中檢索資料,但是省略了FROM子句后就是簡單地訪問和處理運算式,例如SELECT 3 * 2;將回傳6,SELECT Trim(' abc ');將回傳abc,SELECT Curdate();使用Curdate()函式回傳當前日期和時間,現在你明白了,可以根據需要使用
SELECT陳述句進行檢驗,
四、小結
本文介紹了計算欄位以及如何創建計算欄位,我們用例子說明了計算欄位在字串拼接和算術計算中的用途,此外,還講述了如何創建和使用別名,以便應用程式能參考計算欄位,
原文鏈接:https://www.developerastrid.com/sql/sql-calculated-fields/
(完)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/472938.html
標籤:其他
下一篇:如何使用 SQL 函式處理資料
