《SQL必知必会》读书笔记
1.函数
与几乎所有DBMS都等同地支持SQL语句(如SELECT)不同,每一个DBMS都有特定的函数。事实上,只有少数几个函数被所有主要的DBMS等同支持。
DBMS函数的差异:
可以看到,与SQL语句不一样,SQL函数不是可移植的。这表示为特定SQL实现编写的代码在其他实现中可能不正常。
2.使用函数
大多数SQL实现支持以下类型的函数。
- 用于处理文本字符串(如删除或填充值,转换值为大写或小写)的文本函数。
- 用于在数值数据上进行算术操作(如返回绝对值,进行代数运算)的数值函数。
- 用于处理日期和时间值并从这些值中提取特定成分(如返回两个日期之差,检查日期有效性)的日期和时间函数。
- 返回DBMS正使用的特殊信息(如返回用户登陆信息)的系统函数。
我们在上一课看到函数用作SELECT语句的列表成分,但函数的作用不仅于此。它还可以作为SELECT语句的其他成分,如WHERE子句中使用,在其他SQL语句中使用等,后面会做更多的介绍。
3.文本处理函数
常用的文本处理函数:
- LEFT() 返回字符串左边的字符
- LENGTH() 返回字符串的长度
- LOWER() 将字符串转换为小写
- LTRIM() 去掉字符串左边的空格
- RIGHT() 返回字符串右边的字符
- RTRIM() 去掉字符串右边的空格
- SOUNDEX() 返回字符串的SOUNDEX()
- UPPER() 将字符串转换为大写
SELECT vend_name, UPPER(vend_name) as vend_name_upcase
FROM Vendors
vend_name vend_name_upcase
Bear Emporium BEAR EMPORIUM
Bears R Us BEARS R US
Doll and Inc. DOLL HOUSE INC.
4.日期和时间处理函数
应用程序一般不使用日期和时间的存储格式,因此日期和时间函数总是用来读取、统计和处理这些值。由于这个原因,日期和时间函数在SQL中具有重要的作用。遗憾的是,它们很不一致,可移植性最差。
SQL Serve
SELECT order_num
FROM Orders
WHERE DATEPART(yy,order_date) = 2012
order_num
20005
20006
20007
20008
20009
Access
SELECT order_num
FROM Orders
WHERE DATEPART(yyyy,order_date) = 2012
这个例子中,DATEPART()函数返回日期的一部分。DATEPART()函数有两个参数,它们分别是返回的成分和从中返回成分的日期。
PostgreSQL类似功能的DATE_PART()函数
SELECT order_num
FROM Orders
WHERE DATE_PART('year',order_date) = 2012
Oracle
Oracle没有上述两个函数,不过有几个可用来完成相同检索的日期处理函数。
SELECT order_num
FROM Orders
WHERE to_number(t0_char(order_date,'YYYY')) = 2012
在这个例子中,to_char()函数用来提取日期的成分,to_number()用来将提取出的成分转换为数值,以便能与2012进行比较。
完成相同工作的另一方法是使用BETWEEN操作符:
SELECT order_num
FROM Orders
WHERE order_date BETWEEN to_date('01-01-2012')
AND to_date('12-31-2012')
在此例子中,Oracle的to_date()函数用来将两个字符串转换为日期。
MySQL和MariaDB
MySQL和MariaDB用户可使用名为YEAR()的函数从日期中提取年份:
SELECT order_num
FROM Orders
WHERE YEAR(order_date) = 2012
SQLite
SELECT order_num
FROM Orders
WHERE strftime('%Y',order_date) = 2012
这里给出的例子提取和使用日期的成分(年)。按月份过滤,可以进行相同的处理,指定AND操作符以及年和月份的比较。
大多数DBMS具有比较日期、执行基于日期的运算、选择日期格式等的函数。
5.数值处理函数
数值处理函数仅处理数值数据。
在主要DBMS的函数中,数值函数是最一致、最统一的函数。