不同DBMS实现相同功能所用到的函数名称是不同的,如下表所示。
大多数 SQL 实现支持以下类型的函数。
UPPER()函数,将文本转换为大写。
- SELECT vend_name, UPPER(vend_name) AS vend_name_upcase
- FROM Vendors
- ORDER BY vend_name;
输出:
- vend_name vend_name_upcase
- --------------------------- ----------------------------
- Bear Emporium BEAR EMPORIUM
- Bears R Us BEARS R US
- Doll House Inc. DOLL HOUSE INC.
- Fun and Games FUN AND GAMES
- Furball Inc. FURBALL INC.
- Jouets et ours JOUETS ET OURS
常用的文本处理函数,如下表所示
注:表中的SOUNDEX 是一个将任何文本串转换为描述其语音表示的字母数字模式的算法。SOUNDEX 考虑了类似的发音字符和音节,使得能对字符串进行发音比较而不是字母比较。
例如:
- SELECT cust_name, cust_contact
- FROM Customers
- WHERE SOUNDEX(cust_contact) = SOUNDEX('Michael Green');
输出:
- cust_name cust_contact
- -------------------------- ----------------------------
- Kids Place Michelle Green
在上例中,WHERE子句使用 SOUNDEX() 函数把 cust_contact 列值和搜索字符串转换为它们的 SOUNDEX 值。因为 Michael Green 和 Michelle Green 发音相似,所以它们的 SOUNDEX 值匹配,因此 WHERE 子句正确地过滤出了所需的数据。
为在 Microsoft SQL Server 中检索 2020 年的所有订单,可如下进行:
- SELECT order_num
- FROM Orders
- WHERE DATEPART(yy, order_date) = 2020;
其中,order_date是要提取数据的列,即要从order_date列提取年份(yy)数据,与2020做一个对比,如果等于2020则满足筛选条件。
注:Oracle、DB2,MySQL 和 MariaDB 的时间/日期处理函数都不相同。
仅用于处理数值,这些函数一般主要用于代数、三角或几何运算,因此不像字符串或日期-时间处理函数使用那么频繁。
在主要 DBMS 的函数中,数值函数是最一致、最统一的函数。下表列出一些常用的数值处理函数。
1.我们的商店已经上线了,正在创建顾客账户。所有用户都需要登录名,默认登录名是其名称和所在城市的组合。编写 SQL 语句,返回顾客 ID(cust_id)、顾客名称(customer_name)和登录名(user_login),其中登录名全部为大写字母,并由顾客联系人的前两个字符(cust_contact)和其所在城市的前三个字符(cust_city)组成。例如,我的登录名是 BEOAK(Ben Forta,居住在 Oak Park)。提示:需要使用函数、拼接和别名。
- -- DB2, PostgreSQL
- SELECT cust_id, cust_name,
- UPPER(LEFT(cust_contact, 2)) || UPPER(LEFT(cust_city, 3)) AS user_login
- FROM customers;
- -- SQL Server
- SELECT cust_id, cust_name,
- UPPER(LEFT(cust_contact, 2)) + UPPER(LEFT(cust_city, 3)) AS user_login
- FROM customers;
2.编写 SQL 语句,返回 2020 年 1 月的所有订单的订单号(order_num)和订单日期(order_date),并按订单日期排序。你应该能够根据目前已学的知识来解决此问题,但也可以开卷查阅 DBMS 文档。
- -- DB2, MariaDB, MySQL
- SELECT order_num, order_date
- FROM Orders
- WHERE YEAR(order_date) = 2020 AND MONTH(order_date) = 1
- ORDER BY order_date;
- -- SQL Server
- SELECT order_num, order_date
- FROM Orders
- WHERE DATEPART(yy, order_date) = 2020 AND DATEPART(mm, order_date) = 1
- ORDER BY order_date;