Oracle从新手到高手
上QQ阅读APP看书,第一时间看更新

5.4 转换与分组函数

在操作表中的数据时,经常需要将某个数据从一种数据类型转变为另一种数据类型。这时就需要使用数据转换函数。而分组函数,则是在GROUP BY子句中所进行的分组操作。

5.4.1 转换函数

转换函数是对数字格式相互转换的一系列函数,包括TO_CHAR()函数、TO_DATE()函数和TO_NUMBER()函数等。

1. TO_CHAR()函数

TO_CHAR()函数是最常用的转换函数,该函数可以把指定的表达式转变成字符串。TO_ CHAR()函数的语法形式如下:

     TO_CHAR(X[,FORMAT])

在上面的语法中,参数X表示将要转变的表达式;FORMAT参数用于指定X表达式的格式。可用的格式如下表所示。

下面的示例使用TO_CHAR()函数,将当前系统时间按指定格式转变为字符串。

      SQL> select to_char(sysdate,'HH12-MI-SS') 时间 from dual;

      时间
      --------
      04-50-02

2. TO_DATE()函数

该函数将字符串转化为Oracle中的一个日期。TO_DATE()函数的语法格式如下:

     TO_DATE (c[,fmt])

其中,如果参数FMT不为空时,则按照FMT中指定格式进行转换。注意这里的FMT参数,如果FMT为J则表示按照公元制转换,为C则必须为大于0并小于5373484的正整数。

例如:

3. TO_NUMBER()函数

可以使用TO_NUMBER()函数把某个表达式转变成数字。表达式的格式可以使用可选的格式描述。TO_NUMBER()函数的语法形式如下:

     TO_NUMBER(c[,fmt])

下面的示例使用TO_NUMBER()函数实现将16进制数转换为10进制数。

5.4.2 分组函数

在SELECT语句中,可以使用GROUP BY子句进行分组操作,并可以使用HAVING子句提供分组条件。

在下面的查询中,将对SCOTT模式中的EMP表进行分组,以统计各部门的员工数量。

HAVING子句通常与GROUP BY子句一起使用,以便在完成分组统计后,可以使用HAVING子句对分组的结果进行进一步筛选。如果不使用GROUP BY子句,HAVING子句的功能与WHERE子句相同,对整个表进行筛选。

在下面的查询中,将搜索出员工数量大于等于5的所有部门。

这里要注意SELECT语句中的各子句的执行次序。在SELECT语句中,首先执行FROM子句找到表,而WHERE子句则在FROM子句输出的数据中进行筛选,HAVING子句则在GROUP BY、WHERE或FROM子句执行后对其结果进行筛选。

下面的示例分别演示了HAVING和WHERE子句对SELECT语句的影响。第一个检索语句使用HAVING子句对分组的结果进行筛选;第二个检索语句则使用WHERE子句对表中的数据进行筛选后再分组,如下所示。

从查询结果可以看出,WHERE子句直接从表中筛选数据,过滤掉了部分员工信息;而HAVING子句则在分组后进行筛选。