1 創(chuàng)建計(jì)算字段
1.1 計(jì)算字段
存儲(chǔ)在數(shù)據(jù)庫(kù)表中的數(shù)據(jù)呻畸,一般不是應(yīng)用程序所需要的格式。
比如:
- 需要顯示公司名悼院,同時(shí)還要顯示公司的地址伤为,但這兩個(gè)信息存儲(chǔ)在不同的列表中。
- 城市据途、州和郵政編碼存儲(chǔ)在不同的列中绞愚,但郵件標(biāo)簽打印程序需要把它們作為一個(gè)有恰當(dāng)格式的字段檢索出來(lái)。
- 列數(shù)據(jù)是大小寫混合的颖医,但報(bào)表程序需要把所有數(shù)據(jù)按大寫表示出來(lái)位衩。
- 物品訂單表存儲(chǔ)物品的價(jià)格和數(shù)量,不存儲(chǔ)每個(gè)物品的總價(jià)格熔萧,單位打印發(fā)票糖驴,需要物品的總價(jià)格。
- 需要根據(jù)表數(shù)據(jù)進(jìn)行諸如總數(shù)佛致、平均數(shù)的計(jì)算贮缕。
在上述這些例子中,存儲(chǔ)在表中的數(shù)據(jù)都不是應(yīng)用程序所需要的俺榆。我們需要從數(shù)據(jù)庫(kù)中檢索出轉(zhuǎn)換感昼、計(jì)算或格式化過(guò)的數(shù)據(jù),而不是檢索出數(shù)據(jù)肋演,然后在客戶端應(yīng)用程序中重新格式化抑诸。
字段(field):基本上與列(column)的意思相同烂琴,經(jīng)常互換使用蜕乡,不過(guò)數(shù)據(jù)庫(kù)列一般稱為列奸绷,而術(shù)語(yǔ)字段通常與計(jì)算字段一起使用。
1.2 拼接字段
拼接(concatenate):將值連接到一起(將一個(gè)值附加到另一個(gè)值)構(gòu)成單個(gè)值层玲。
Access和SQL Server使用加號(hào)(+)号醉,DB2、Oracle辛块、PostgreSQL和SQLite使用兩個(gè)豎杠(||)畔派,MySQL、MariaDB使用concat函數(shù)润绵。
生成供應(yīng)商報(bào)表线椰,顯示出vend_name和vend_country,并且將vend_country括起來(lái)尘盼。
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語(yǔ)句拼接以下元素:
- 存儲(chǔ)在vend_name列中的名字憨愉。
- 包含一個(gè)空格和一個(gè)左圓括號(hào)的字符串。
- 存儲(chǔ)在vend_country列中的國(guó)家卿捎。
- 包含一個(gè)右圓括號(hào)的字符串配紫。
有些數(shù)據(jù)庫(kù)返回的結(jié)果會(huì)包含空格,也就是圓括號(hào)里的內(nèi)容是右對(duì)齊的午阵,所以為消除這種右對(duì)齊現(xiàn)象躺孝。可以使用rtrim()函數(shù)底桂。(MySQL中不會(huì)出現(xiàn)右對(duì)齊現(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)是一個(gè)字段或值的替換名应又。別名用AS關(guān)鍵字賦予宙项。
SELECT concat(rtrim(vend_name), '(', rtrim(vend_country), ')')
AS vend_title
FROM Vendors
ORDER BY vend_name;
1.3 執(zhí)行算數(shù)計(jì)算
檢索訂單號(hào)為20008中的所有物品:
SELECT prod_id, quantity, item_price
FROM OrderItems
WHERE order_num = 20008;
匯總物品價(jià)格:
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實(shí)現(xiàn)支持以下類型的函數(shù):
- 用于處理文本字符串(如刪除或填充值尤筐,轉(zhuǎn)換值為大寫或小寫)的文本函數(shù)汇荐。
- 用于在數(shù)值數(shù)據(jù)上進(jìn)行算數(shù)操作(如返回絕對(duì)值,進(jìn)行代數(shù)運(yùn)算)的數(shù)值函數(shù)盆繁。
- 用于處理日期和時(shí)間值并從這些值中提取特定成分(如返回兩個(gè)日期之差掀淘,檢查日期有效性)的日期和時(shí)間函數(shù)。
- 返回DBMS正使用的特殊信息(如返回用戶登錄信息)的系統(tǒng)函數(shù)油昂。
2.1 文本處理函數(shù)
常用的文本處理函數(shù)
函數(shù) | 說(shuō)明 |
---|---|
left() | 返回字符串左邊的字符 |
right() | 返回字符串右邊的字符 |
ltrim() | 去掉字符串左邊的空格 |
rtrim() | 去掉字符串右邊的空格 |
lower() | 將字符串轉(zhuǎn)換為小寫 |
upper() | 將字符串轉(zhuǎn)換為大寫 |
length() | 返回字符串的長(zhǎng)度 |
soundex() | 返回字符串的SOUNDEX值 |
SELECT vend_name, upper(vend_name) AS vend_name_upcase
FROM Vendors
ORDER BY vend_name;
soundex()指的是兩個(gè)字符串的發(fā)音相似革娄。
SELECT cust_name, cust_contact
FROM Customers
WHERE soundex(cust_contact) = soundex('Michael Green');
因?yàn)镸ichael Green和Michelle Green發(fā)音相似,所以它們的soundex值匹配冕碟,因此WHERE子句可以正確地過(guò)濾出所需數(shù)據(jù)拦惋。
2.2 日期和時(shí)間處理函數(shù)
日期和時(shí)間值一特殊的格式存儲(chǔ),以便能快速和有效地排序或過(guò)濾安寺,并且節(jié)省物理存儲(chǔ)空間厕妖。
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í)間處理函數(shù)是不同的挠羔,在處理的時(shí)候井仰,要參考相應(yīng)的文檔。
2.3 數(shù)值處理函數(shù)
數(shù)值處理函數(shù)僅處理數(shù)值數(shù)據(jù)破加,這些函數(shù)主要用于代數(shù)俱恶、三角或幾何運(yùn)算,因此不想字符串或日期-時(shí)間處理函數(shù)使用那么頻繁范舀。
常用的數(shù)值處理函數(shù)
函數(shù) | 說(shuō)明 |
---|---|
PI() | 返回圓周率 |
ABS() | 返回一個(gè)數(shù)的絕對(duì)值 |
EXP() | 返回一個(gè)數(shù)的指數(shù)值 |
SQRT() | 返回一個(gè)數(shù)的平方根 |
SIN() | 返回一個(gè)角度的正弦 |
COS() | 返回一個(gè)角度的余弦 |
TAN() | 返回一個(gè)角度的正切 |
下面的只是一個(gè)例子合是,沒有實(shí)際意義,只是為了說(shuō)明可以用數(shù)值處理函數(shù)處理數(shù)值數(shù)據(jù)锭环。
如果您發(fā)現(xiàn)文中有不清楚或者有問(wèn)題的地方聪全,請(qǐng)?jiān)谙路皆u(píng)論區(qū)留言,我會(huì)根據(jù)您的評(píng)論辅辩,更新文中相關(guān)內(nèi)容难礼,謝謝!