目標(biāo)
7.1 計(jì)算字段
7.2 拼接字段
7.3 執(zhí)行算術(shù)計(jì)算
這一課介紹什么是計(jì)算字段,如何創(chuàng)建計(jì)算字段科侈,以及如何從應(yīng)用程序中使用別名引用它們霉赡。
7.1 計(jì)算字段
存儲(chǔ)在數(shù)據(jù)庫表中的數(shù)據(jù)一般不是應(yīng)用程序所需要的格式,下面舉幾個(gè)例子颤陶。
1. 需要顯示公司名颗管,同時(shí)還需要顯示公司的地址,但這兩個(gè)信息存儲(chǔ)在不同的表列中指郁。
2. 城市忙上、州和郵政編碼存儲(chǔ)在不同的列中(應(yīng)該這樣),但郵件標(biāo)簽打印程序需要把它們作為一個(gè)有恰當(dāng)格式的字段檢索出來闲坎。
3. 列數(shù)據(jù)是大小寫混合的疫粥,但報(bào)表程序需要把所有數(shù)據(jù)按大寫表示出來。物品訂單表存儲(chǔ)物品的價(jià)格和數(shù)量腰懂,不存儲(chǔ)每個(gè)物品的總價(jià)格(用價(jià)格乘以數(shù)量即可)梗逮。但為打印發(fā)票,需要物品的總價(jià)格绣溜。
4. 需要根據(jù)表數(shù)據(jù)進(jìn)行諸如總數(shù)慷彤、平均數(shù)的計(jì)算。
在上述每個(gè)例子中,存儲(chǔ)在表中的數(shù)據(jù)都不是應(yīng)用程序所需要的底哗。我們需要直接從數(shù)據(jù)庫中檢索出轉(zhuǎn)換岁诉、計(jì)算或格式化過的數(shù)據(jù),而不是檢索出數(shù)據(jù)跋选,然后再在客戶端應(yīng)用程序中重新格式化涕癣。
字段(field)
基本上與列(column)的意思相同,經(jīng)城氨辏互換使用坠韩,不過數(shù)據(jù)庫列一般稱為列,而字段這個(gè)術(shù)語通常在計(jì)算字段這種場(chǎng)合下使用炼列。
提示:客戶端與服務(wù)器的格式
在 SQL 語句內(nèi)可完成的許多轉(zhuǎn)換和格式化工作都可以直接在客戶端應(yīng)用程序內(nèi)完成只搁。但一般來說,在數(shù)據(jù)庫服務(wù)器上完成這些操作比在客戶端中完成要快得多俭尖。
7.2 拼接字段?[concat(? ,? ,? ,? )]
拼接(concatenate)
將值聯(lián)結(jié)到一起(將一個(gè)值附加到另一個(gè)值)構(gòu)成單個(gè)值氢惋。
SELECT Concat(vend_name, ' (', vend_country, ')')
FROM Vendors
ORDER BY vend_name;
分析▼
上面兩個(gè) SELECT 語句拼接以下元素:
1.存儲(chǔ)在 vend_name 列中的名字;
2.包含一個(gè)空格和一個(gè)左圓括號(hào)的字符串目溉;
3.存儲(chǔ)在 vend_country 列中的國(guó)家明肮;
4.包含一個(gè)右圓括號(hào)的字符串。
輸出:
/*RTRIM()函數(shù)去掉值右邊的所有空格缭付。通過使用 RTRIM()柿估,各個(gè)列都進(jìn) 行了整理。MySQL 貌似用不到陷猫。
?SELECT RTRIM(vend_name) + ' (' + RTRIM(vend_country) + ')'?
FROM Vendors?
ORDER BY vend_name;*/
說明:TRIM 函數(shù)?
?大多數(shù) DBMS 都支持 RTRIM()(正如剛才所見秫舌,它去掉字符串右邊的 空格)、LTRIM()(去掉字符串左邊的空格)以及 TRIM()(去掉字符 串左右兩邊的空格)绣檬。
使用別名(AS)
SQL 支持列別名足陨。別名(alias)是一個(gè)字段或值的替換名。別名用 AS 關(guān)鍵字賦予娇未。
SELECT Concat(vend_name, ' (', vend_country, ')')?
? ? ? ? ? ? ? ?AS vend_title
?FROM Vendors?
ORDER BY vend_name;
分析▼
SELECT 語句本身與以前使用的相同墨缘,只不過這里的計(jì)算字段之后跟了文本 AS vend_title。它指示 SQL 創(chuàng)建一個(gè)包含指定計(jì)算結(jié)果的名為vend_title 的計(jì)算字段零抬。從輸出可以看到镊讼,結(jié)果與以前的相同,但現(xiàn)在列名為 vend_title平夜,任何客戶端應(yīng)用都可以按名稱引用這個(gè)列蝶棋,就像它是一個(gè)實(shí)際的表列一樣。
輸出:
7.3 執(zhí)行算術(shù)計(jì)算
計(jì)算字段的另一常見用途是對(duì)檢索出的數(shù)據(jù)進(jìn)行算術(shù)計(jì)算忽妒。
SELECT prod_id,quantity,item_price,
? ? ? ? ? ? ? quantity*item_price AS expanded_price
FROM OrderItems
WHERE order_num = 20008;
分析▼
輸出中顯示的 expanded_price 列是一個(gè)計(jì)算字段玩裙,此計(jì)算為 quantity*item_price兼贸。客戶端應(yīng)用現(xiàn)在可以使用這個(gè)新計(jì)算列吃溅,就像使用其他列一樣溶诞。
輸出:
7.4 小結(jié)
本節(jié)課學(xué)習(xí)了字段的計(jì)算,分拼接(Concat關(guān)鍵詞)和算術(shù)計(jì)算(+-*/)兩種决侈,以及別名AS很澄。
-- ----------第7課 創(chuàng)建計(jì)算字段----------------------
-- ---------------------------------
-- 7.1 計(jì)算字段
-- 7.2 拼接字段
SELECT Concat(vend_name, ' (', vend_country, ')')
FROM Vendors
ORDER BY vend_name;
/*RTRIM()函數(shù)去掉值右邊的所有空格。通過使用 RTRIM()颜及,各個(gè)列都進(jìn)
行了整理。MySQL 貌似用不到蹂楣。
SELECT RTRIM(vend_name) + ' (' + RTRIM(vend_country) + ')'
FROM Vendors
ORDER BY vend_name;*/
SELECT Concat(vend_name, ' (', vend_country, ')')
? ? ? ? ? ? ? AS vend_title
FROM Vendors
ORDER BY vend_name;
-- 7.3 執(zhí)行算術(shù)計(jì)算
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;
7.5 挑戰(zhàn)題
1. 別名的常見用法是在檢索出的結(jié)果中重命名表的列字段(為了符合特定的報(bào)表要求或客戶需求)俏站。編寫 SQL 語句,從 Vendors 表中檢索vend_id痊土、vend_name肄扎、vend_address 和 vend_city,將 vend_name重命名為 vname赁酝,將 vend_city 重命名為 vcity犯祠,將 vend_address重命名為 vaddress。按供應(yīng)商名稱對(duì)結(jié)果進(jìn)行排序(可以使用原始名稱或新的名稱)酌呆。
SELECT vend_id,
? ? ? ? ? ? ? vend_name AS vname,
? ? ? ? ? ? ? vend_address AS vaddress,
? ? ? ? ? ? ? vend_city AS vcity
FROM vendors
ORDER BY vname;
2. 我們的示例商店正在進(jìn)行打折促銷衡载,所有產(chǎn)品均降價(jià) 10%。編寫 SQL語句隙袁,從 Products 表中返回 prod_id痰娱、prod_price 和 sale_price。sale_price 是一個(gè)包含促銷價(jià)格的計(jì)算字段菩收。提示:可以乘以 0.9梨睁,得到原價(jià)的 90%(即 10%的折扣)
SELECT prod_id,prod_price,
? ? ? ? ? ? ? ?prod_price*0.9 AS sale_price
FROM products;