目标:
8.1 函数
8.2 使用函数
这一课介绍什么是函数,DBMS 支持何种函数,以及如何使用这些函数;还将讲解为什么 SQL 函数的使用可能会带来问题。
8.1 函数
可移植(portable)所编写的代码可以在多个系统上运行。
8.2 使用函数
大多数 SQL 实现支持以下类型的函数。
1. 用于处理文本字符串(如删除或填充值,转换值为大写或小写)的文本函数。
2. 用于在数值数据上进行算术操作(如返回绝对值,进行代数运算)的数值函数。
3. 用于处理日期和时间值并从这些值中提取特定成分(如返回两个日期之差,检查日期有效性)的日期和时间函数。
4. 用于生成美观好懂的输出内容的格式化函数(如用语言形式表达出日期,用货币符号和千分位表示金额)。
5. 返回 DBMS 正使用的特殊信息(如返回用户登录信息)的系统函数。
8.2.1 文本处理函数
SELECT vend_name,
UPPER(vend_name) AS vend_name_upcase
FROM Vendors
ORDER BY vend_name;
输出:
SOUNDEX() 函数
是一个将任何文本串转换为描述其语音表示的字母数字模式的算法。使用函数处理数据类似的发音字符和音节,使得能对字符串进行发音比较而不是字母比较。虽然 SOUNDEX 不是SQL 概念,但多数 DBMS 都提供对 SOUNDEX 的支持。
SELECT cust_name, cust_contact
FROM Customers
WHERE SOUNDEX(cust_contact) = SOUNDEX('Michael Green');
分析▼
在这个例子中,WHERE 子句使用 SOUNDEX()函数把 cust_contact 列值和搜索字符串转换为它们的 SOUNDEX 值。因为 Michael Green 和Michelle Green 发音相似,所以它们的 SOUNDEX 值匹配,因此 WHERE子句正确地过滤出了所需的数据。
输出:
8.2.2 日期和时间处理函数
很不一致,可移植性最差。
要求:MySQL使用名为 YEAR()的函数从日期中提取年份
SELECT order_num
FROM Orders
WHERE YEAR(order_date) = 2020;
输出:
8.2.3 数值处理函数
数值处理函数仅处理数值数据。这些函数一般主要用于代数、三角或几何运算,因此不像字符串或日期−时间处理函数使用那么频繁。
在主要 DBMS 的函数中,数值函数是最一致、最统一的函数。
8.3 小结
这一课介绍了如何使用 SQL 的数据处理函数。虽然这些函数在格式化、处理和过滤数据中非常有用,但它们在各种 SQL 实现中很不一致。
-- ----------第8课 使用函数处理数据---------------------
-- 8.2.1 文本处理函数
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 日期和时间处理函数
8.4 挑战题
1. 我们的商店已经上线了,正在创建顾客账户。所有用户都需要登录名,默认登录名是其名称和所在城市的组合。编写 SQL 语句,返回顾客 ID(cust_id)、顾客名称(customer_name)和登录名(user_login),其中登录名全部为大写字母,并由顾客联系人的前两个字符(cust_contact)和其所在城市的前三个字符(cust_city)组成。例如,我的登录名是 BEOAK(Ben Forta,居住在 Oak Park)。提示:需要使用函数、拼接和别名。
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),并按订单日期排序。你应该能够根据目前已学的知识来解决此问题,但也可以开卷查阅 DBMS 文档。
SELECT order_num, order_date
FROM Orders
WHERE YEAR(order_date) = 2020 AND MONTH(order_date) = 1
ORDER BY order_date