目標(biāo):
8.1 函數(shù)
8.2 使用函數(shù)
這一課介紹什么是函數(shù)展东,DBMS 支持何種函數(shù),以及如何使用這些函數(shù)炒俱;還將講解為什么 SQL 函數(shù)的使用可能會帶來問題盐肃。
8.1 函數(shù)
可移植(portable)所編寫的代碼可以在多個系統(tǒng)上運行爪膊。
8.2 使用函數(shù)
大多數(shù) SQL 實現(xiàn)支持以下類型的函數(shù)。
1. 用于處理文本字符串(如刪除或填充值砸王,轉(zhuǎn)換值為大寫或小寫)的文本函數(shù)推盛。
2. 用于在數(shù)值數(shù)據(jù)上進(jìn)行算術(shù)操作(如返回絕對值,進(jìn)行代數(shù)運算)的數(shù)值函數(shù)谦铃。
3. 用于處理日期和時間值并從這些值中提取特定成分(如返回兩個日期之差耘成,檢查日期有效性)的日期和時間函數(shù)。
4. 用于生成美觀好懂的輸出內(nèi)容的格式化函數(shù)(如用語言形式表達(dá)出日期驹闰,用貨幣符號和千分位表示金額)瘪菌。
5. 返回 DBMS 正使用的特殊信息(如返回用戶登錄信息)的系統(tǒng)函數(shù)。
8.2.1 文本處理函數(shù)
SELECT vend_name,?
? ? ? ? ? ? ? ?UPPER(vend_name) AS vend_name_upcase?
FROM Vendors?
ORDER BY vend_name;
輸出:
SOUNDEX() 函數(shù)
是一個將任何文本串轉(zhuǎn)換為描述其語音表示的字母數(shù)字模式的算法疮方。使用函數(shù)處理數(shù)據(jù)類似的發(fā)音字符和音節(jié)控嗜,使得能對字符串進(jìn)行發(fā)音比較而不是字母比較。雖然 SOUNDEX 不是SQL 概念骡显,但多數(shù) DBMS 都提供對 SOUNDEX 的支持疆栏。
SELECT cust_name, cust_contact
FROM Customers
WHERE SOUNDEX(cust_contact) = SOUNDEX('Michael Green');
分析▼
在這個例子中,WHERE 子句使用 SOUNDEX()函數(shù)把 cust_contact 列值和搜索字符串轉(zhuǎn)換為它們的 SOUNDEX 值惫谤。因為 Michael Green 和Michelle Green 發(fā)音相似壁顶,所以它們的 SOUNDEX 值匹配,因此 WHERE子句正確地過濾出了所需的數(shù)據(jù)溜歪。
輸出:
8.2.2 日期和時間處理函數(shù)
很不一致若专,可移植性最差。
要求:MySQL使用名為 YEAR()的函數(shù)從日期中提取年份
SELECT order_num
FROM Orders
WHERE YEAR(order_date) = 2020;
輸出:
8.2.3 數(shù)值處理函數(shù)
數(shù)值處理函數(shù)僅處理數(shù)值數(shù)據(jù)蝴猪。這些函數(shù)一般主要用于代數(shù)调衰、三角或幾何運算,因此不像字符串或日期?時間處理函數(shù)使用那么頻繁自阱。
在主要 DBMS 的函數(shù)中嚎莉,數(shù)值函數(shù)是最一致、最統(tǒng)一的函數(shù)沛豌。
8.3 小結(jié)
這一課介紹了如何使用 SQL 的數(shù)據(jù)處理函數(shù)趋箩。雖然這些函數(shù)在格式化、處理和過濾數(shù)據(jù)中非常有用加派,但它們在各種 SQL 實現(xiàn)中很不一致叫确。
-- ----------第8課 使用函數(shù)處理數(shù)據(jù)---------------------
-- 8.2.1 文本處理函數(shù)
SELECT vend_name, UPPER(vend_name) AS vend_name_upcase
FROM Vendors
ORDER BY vend_name;
SELECT cust_name, cust_contact
FROM Customers
WHERE SOUNDEX(cust_contact) = SOUNDEX('Michael Green');
-- 8.2.2 日期和時間處理函數(shù)
8.4 挑戰(zhàn)題
1. 我們的商店已經(jīng)上線了,正在創(chuàng)建顧客賬戶芍锦。所有用戶都需要登錄名竹勉,默認(rèn)登錄名是其名稱和所在城市的組合。編寫 SQL 語句醉旦,返回顧客 ID(cust_id)饶米、顧客名稱(customer_name)和登錄名(user_login)桨啃,其中登錄名全部為大寫字母,并由顧客聯(lián)系人的前兩個字符(cust_contact)和其所在城市的前三個字符(cust_city)組成檬输。例如照瘾,我的登錄名是 BEOAK(Ben Forta,居住在 Oak Park)丧慈。提示:需要使用函數(shù)析命、拼接和別名。
SELECT cust_id, cust_name,
? ? ? ? CONCAT(UPPER(LEFT(cust_contact, 2)), UPPER(LEFT(cust_city, 3))) AS user_login
FROM customers;
2. 編寫 SQL 語句逃默,返回 2020 年 1 月的所有訂單的訂單號(order_num)和訂單日期(order_date)鹃愤,并按訂單日期排序。你應(yīng)該能夠根據(jù)目前已學(xué)的知識來解決此問題完域,但也可以開卷查閱 DBMS 文檔软吐。
SELECT order_num, order_date
FROM Orders
WHERE YEAR(order_date) = 2020 AND MONTH(order_date) = 1
ORDER BY order_date