1 創(chuàng)建計算字段
1.1 計算字段
存儲在數(shù)據(jù)庫表中的數(shù)據(jù),一般不是應(yīng)用程序所需要的格式。
比如:
- 需要顯示公司名,同時還要顯示公司的地址,但這兩個信息存儲在不同的列表中。
- 城市、州和郵政編碼存儲在不同的列中,但郵件標簽打印程序需要把它們作為一個有恰當格式的字段檢索出來。
- 列數(shù)據(jù)是大小寫混合的,但報表程序需要把所有數(shù)據(jù)按大寫表示出來。
- 物品訂單表存儲物品的價格和數(shù)量,不存儲每個物品的總價格,單位打印發(fā)票,需要物品的總價格。
- 需要根據(jù)表數(shù)據(jù)進行諸如總數(shù)、平均數(shù)的計算。
在上述這些例子中,存儲在表中的數(shù)據(jù)都不是應(yīng)用程序所需要的。我們需要從數(shù)據(jù)庫中檢索出轉(zhuǎn)換、計算或格式化過的數(shù)據(jù),而不是檢索出數(shù)據(jù),然后在客戶端應(yīng)用程序中重新格式化。
字段(field):基本上與列(column)的意思相同,經(jīng)?;Q使用,不過數(shù)據(jù)庫列一般稱為列,而術(shù)語字段通常與計算字段一起使用。
1.2 拼接字段
拼接(concatenate):將值連接到一起(將一個值附加到另一個值)構(gòu)成單個值。
Access和SQL Server使用加號(+),DB2、Oracle、PostgreSQL和SQLite使用兩個豎杠(||),MySQL、MariaDB使用concat函數(shù)。
生成供應(yīng)商報表,顯示出vend_name和vend_country,并且將vend_country括起來。
SELECT vend_name + '(' + vend_country + ')'
FROM Vendors
ORDER BY vend_name;
SELECT vend_name || '(' || vend_country || ')'
FROM Vendors
ORDER BY vend_name;
SELECT concat(vend_name, '(', vend_country, ')')
FROM Vendors
ORDER BY vend_name;
上面SELECT語句拼接以下元素:
- 存儲在vend_name列中的名字。
- 包含一個空格和一個左圓括號的字符串。
- 存儲在vend_country列中的國家。
- 包含一個右圓括號的字符串。
有些數(shù)據(jù)庫返回的結(jié)果會包含空格,也就是圓括號里的內(nèi)容是右對齊的,所以為消除這種右對齊現(xiàn)象。可以使用rtrim()函數(shù)。(MySQL中不會出現(xiàn)右對齊現(xiàn)象。)
SELECT concat(rtrim(vend_name), '(', rtrim(vend_country), ')')
FROM Vendors
ORDER BY vend_name;
rtrim()去掉字符串右邊的空格,ltrim()去掉字符串左邊的空格,trim()去掉字符串左右兩邊的空格。
在上例中,我們可以看到顯示的列字段的名字,是SELECT后的檢索字段,比如顯示為concat(vend_name, '(', vend_country, ')'),怎么讓它顯示為合適的字段呢?使用別名。
別名(alias)是一個字段或值的替換名。別名用AS關(guān)鍵字賦予。
SELECT concat(rtrim(vend_name), '(', rtrim(vend_country), ')')
AS vend_title
FROM Vendors
ORDER BY vend_name;
1.3 執(zhí)行算數(shù)計算
檢索訂單號為20008中的所有物品:
SELECT prod_id, quantity, item_price
FROM OrderItems
WHERE order_num = 20008;
匯總物品價格:
SELECT prod_id, quantity, item_price,
quantity * item_price AS expanded_price
FROM OrderItems
WHERE order_num = 20008;
2 使用函數(shù)處理數(shù)據(jù)(文本、日期、數(shù)值)
大多數(shù)SQL實現(xiàn)支持以下類型的函數(shù):
- 用于處理文本字符串(如刪除或填充值,轉(zhuǎn)換值為大寫或小寫)的文本函數(shù)。
- 用于在數(shù)值數(shù)據(jù)上進行算數(shù)操作(如返回絕對值,進行代數(shù)運算)的數(shù)值函數(shù)。
- 用于處理日期和時間值并從這些值中提取特定成分(如返回兩個日期之差,檢查日期有效性)的日期和時間函數(shù)。
- 返回DBMS正使用的特殊信息(如返回用戶登錄信息)的系統(tǒng)函數(shù)。
2.1 文本處理函數(shù)
常用的文本處理函數(shù)
函數(shù) | 說明 |
---|---|
left() | 返回字符串左邊的字符 |
right() | 返回字符串右邊的字符 |
ltrim() | 去掉字符串左邊的空格 |
rtrim() | 去掉字符串右邊的空格 |
lower() | 將字符串轉(zhuǎn)換為小寫 |
upper() | 將字符串轉(zhuǎn)換為大寫 |
length() | 返回字符串的長度 |
soundex() | 返回字符串的SOUNDEX值 |
SELECT vend_name, upper(vend_name) AS vend_name_upcase
FROM Vendors
ORDER BY vend_name;
soundex()指的是兩個字符串的發(fā)音相似。
SELECT cust_name, cust_contact
FROM Customers
WHERE soundex(cust_contact) = soundex('Michael Green');
因為Michael Green和Michelle Green發(fā)音相似,所以它們的soundex值匹配,因此WHERE子句可以正確地過濾出所需數(shù)據(jù)。
2.2 日期和時間處理函數(shù)
日期和時間值一特殊的格式存儲,以便能快速和有效地排序或過濾,并且節(jié)省物理存儲空間。
Orders表中包含的訂單都帶有訂單日期,在SQL Server中檢索2012年的所有訂單。
SELECT order_num
FROM Orders
WHERE datepart(yy, order_date) = 2012;
在Access中:
SELECT order_num
FROM Orders
WHERE datepart('yyyy', order_date) = 2012;
MySQL和MariaDB可以使用year()函數(shù)從日期中提取年份。
SELECT order_num, order_date
FROM Orders
WHERE year(order_date) = 2012;
可以看到,不同DBMS的日期和時間處理函數(shù)是不同的,在處理的時候,要參考相應(yīng)的文檔。
2.3 數(shù)值處理函數(shù)
數(shù)值處理函數(shù)僅處理數(shù)值數(shù)據(jù),這些函數(shù)主要用于代數(shù)、三角或幾何運算,因此不想字符串或日期-時間處理函數(shù)使用那么頻繁。
常用的數(shù)值處理函數(shù)
函數(shù) | 說明 |
---|---|
PI() | 返回圓周率 |
ABS() | 返回一個數(shù)的絕對值 |
EXP() | 返回一個數(shù)的指數(shù)值 |
SQRT() | 返回一個數(shù)的平方根 |
SIN() | 返回一個角度的正弦 |
COS() | 返回一個角度的余弦 |
TAN() | 返回一個角度的正切 |
下面的只是一個例子,沒有實際意義,只是為了說明可以用數(shù)值處理函數(shù)處理數(shù)值數(shù)據(jù)。
如果您發(fā)現(xiàn)文中有不清楚或者有問題的地方,請在下方評論區(qū)留言,我會根據(jù)您的評論,更新文中相關(guān)內(nèi)容,謝謝!