大部分内容是必知必会教材中的内容,不会因为我表述或者转述就变成我的文字,提供练习和截图仅为了回顾复习和相互督促,所以事先声明。
这一课学习什么是函数,DBMS支持何种函数,以及如何使用这些函数;还将了解到为什么SQL函数的使用可能会带来问题。
目录
8.1 函数
终于讲到了函数,类比其他计算机语言,SQL同样使用函数处理数据。
由于不同的DBMS支持不同的函数,这句话怎么理解呢?也就是说SQL语句基本上都能够得到所有DBMS的支持,函数虽然可以在每个DBMS中应用,但具体的函数名称和语法,要参看文档。可以举个栗子看看,DBMS函数哪种不一样。
可移植(portable) 所编写的代码可以在多个系统上运行。
与SQL语句不一样,SQL函数不是可移植的。意味着为特定SQL实现编写的代码在其他实现中可能不正常。这也是为什么上一课中,MySQL的concat函数直接实现了“+连接符与RTRIM函数”所完成的工作。
函数使用问题:作者建议使用本身没有问题,应该保证做好代码注释,了解SQL代码的含义,便于后期维护或可移植。
8.2 使用函数
大多数SQL实现支持以下类型的函数。
□ 用于处理文本字符串(如删除或填充值,转换值为大写或小写)的文本函数。
□ 用于在数值数据上进行算术操作(如返回绝对值,进行代数运算)的数值函数。
□ 用于处理日期和时间值并从这些值中提取特定成分(如返回两个日期之差,检查日期有效性)的日期和时间函数。
□ 返回DBMS正使用的特殊信息(如返回用户登录信息)的系统函数。
上一课函数作用于SELECT后面的列名,但函数的作用不仅于此。它还可以作为SELECT语句的其他成分,如在WHERE子句中使用,在其他SQL语句中使用等,后面会学习到更多的用法。
① 文本处理函数
使用的是UPPER()函数,将文本转换为大写。
SELECT vend_name ,UPPER(vend_name) AS vend_name_upcase FROM Vendors ORDER BY vend_name;
结果是确实将第一列vend_name的值全部大写了。再看看其他的文本处理函数LEFT()、LENGTH()、LOWER()等:
其中SOUNDEX是一个将任何文本串转换为描述其语音表示的字母数字模式的算法。SOUNDEX考虑了类似的发音字符和音节,使得能对字符串进行发音比较而不是字母比较。虽然SOUNDEX不是SQL概念,但多数DBMS都提供对SOUNDEX的支持。
我们来跟进一个实例:Customers表中有一个顾客Kids Place,其联系名为Michelle Green。但如果这是错误的输入,此联系名实际上应该是MichaelGreen,该怎么办呢?显然,按正确的联系名搜索不会返回数据,那么我们来检索试试:
确实检索不到相关信息。
再加上SOUNDEX函数试试:
过滤得到所需的结果。
② 日期和时间处理函数
日期和时间采用相应的数据类型存储在表中,每种DBMS都有自己的特殊形式。
日期和时间值以特殊的格式存储,以便能快速和有效地排序或过滤,并且节省物理存储空间。应用程序一般不使用日期和时间的存储格式,因此日期和时间函数总是用来读取、统计和处理这些值。由于这个原因,日期和时间函数在SQL中具有重要的作用。遗憾的是,它们很不一致,可移植性最差。
实例说话,Orders表中包含的订单都带有订单日期。为检索出2012年的所有订单:
文中基于不同DBMS做了演示,比如SQL Server、Access、PostgreSQL以及Oracle的其他类似日期处理函数:
MySQL具有各种日期处理函数,但没有DATEPART()。MySQL可使用名为YEAR()的函数从日期中提取年份。
比如,提取年份为2012的订单编号:
还有其他的日期-时间处理函数,参阅对应文档。
③ 数值处理函数
数值处理函数仅处理数值数据。这些函数一般主要用于代数、三角或几何运算。
不像字符串或日期-时间处理函数使用那么频繁。在主要DBMS的函数中,数值函数是最一致、最统一的函数。
这一课就跟完了,虽然这节课主要讲的是三个函数,但各有不同,文本、时间、数值是我们在日常生活中最常见的三类数据类型,在各种DBMS中虽都有对应实现,但具体用法各不相同,最后学习的数值处理函数,倒是较于其他函数来说,更为统一,所以在具体使用过程中,要考虑到差异性。
刻意练习,每日精进。