IS NOT NULL
LESSON 3 单行函数的使用
在Oracle的数据检索中,当简单的运算,例如加、减等不能满足对数据列的处理时,可以通过使用功能更强大的单行函数来达到目标,基本格式如下:
Function_name (column|expression, [arg1, arg2, ……]) SQL中共有两种列函数,一是单行函数,另一是多行函数,单行函数主要有四种类型:字符函数、数字函数、日期函数和转换函数。单行函数对数据检索中的每一行作用,每一行返回一个结果。 如下一一介绍各类型函数的使用: 字符函数
如下是用来处理类型为字符类型的数据或数据列:
LOWER(col|expr)、UPPER(col|expr)、INITCAP(col|expr) CONCAT(col|expr1, col|expr2)、SUBSTR(col|expr, m[, n]) LENGTH(col|expr) NVL(col|expr1, col|expr2)
其中,LOWER函数是把字符串全部转换为小写;UPPER函数功能与LOWER刚好相反,它是把全部字符串转换为大写;CONCAT是用来连接两个字符串,类似于运算符‘||‘;SUBSTR是用来截取母字符串中的一个子串,在SQL中较常用到;LENGTH是来册字符串的长度;而NVL具有所有NVL的通用性,即是在列值为空时,用后者取而代之。 例:
SQL>SELECT substr(?STRING‘, 2,3) from dual SQL>TRI 数值函数
如下是用来处理类型为数值类型的数据或数据列:
ROUND TRUNC MOD
注意:round和trunc函数具有不同之处,截取的方法不同,如下有一些示例,说明这两则的不同用法,如下:
例:round(23535.7476, 2) ==> 23535.75 round(23535.7476, 0) ==> 23536
8
Company Confidential - For internal use only
round(23535.7476, -1) ==> 23530 trunc(23535.7476, 2) ==>23535.74 trunc(23535.7476) ==>23535
trunc(23535, -1) ==> 23530
日期函数
如下是用来处理类型为日期类型的数据或数据列的函数:
MONTH_BETWEEN(date1,date2) ADD_MONTHS(date,n) NEXT_DAY(date,‘char’) LAST_DAY(date) ROUND(date[,‘fmt’]) TRUNC(date[,‘fmt’]) 日期函数有其特性: 例:
add_months(to_date(?2001-05-01‘,‘yyyy-mm-dd‘), 2) ==>2001-07-01 add_months(to_date(?2001-05-01‘,‘yyyy-mm-dd‘), -2) ==>2001-03-01 注意:
两个日期不可相加,但可做减法,结果为number型,日期型数据加/减数值型数据结果为日期型,日期型数据间不可做乘除法,其他运算借助于日期函数。 SYSDATE:
SYSDATE是一个返回系统日期和时间的函数,可以把SYSDATE作为任何表中都具有的普通列。 DUAL:
DUAL是用户SYS的一个表,可以被任何用户使用,它只包含一个列DUMMY,且只具有一行值“x”,这是一个非常有用的表,常用来返回一些常量、单值等等。 例如:
SQL>SELECT SYSDATE FROM DUAL 转换函数
很多时候,不仅要在同一类型中进行运算,还要把某一类型数据转换为其他类型,以例运算或显示,如下是用来进行处理数据或数据列的类型的类型转换函数:
TO_CHAR(number/date, [?fmt‘])
9
Company Confidential - For internal use only
TO_NUMBER(char) TO_DATE(char, [?fmt‘])
转换函数即用来变换数据的类型,如把字符串按格式转换成日期型、数值型,八数值型、日期型转换成字符串等等。
在to_date的函数中,注意[?fmt‘]的使用,区别‘yyyy‘ 和‘RRRR‘,‘RR‘,‘yy‘等,如下是to_date格式的详细情况: 格式 SCC or CC YYYY or SYYYY YYY or YY or Y Y,YYY IYYY, IYY, IY, I SYEAR or YEAR BC or AD Q MM MONTH MON RM WW or W DDD or DD or D DAY DY J 例:
SELECT TO_CHAR(sysdate,‘DAY‘) FROM DUAL;
SELECT TO_DATE(?2001-07-14‘,‘YYYY-MM-DD‘) FROM DUAL 单行函数使用的例子: 例:
例1:SELECT last_name||‘.‘||first_name, employee_id, manager_id
描述 世纪,S则在BC日期前加- 年,S则在BC日期前加- 年份的后3或2或1位数字 年份,中间以“,”号隔开 ISO标准的年份,分别为四位,三位,两位和一位 年的拼写,S则在BC日期前加- 年份的BC或AD的标示 季度 月份,数值 月份的全拼写 月份的拼写,前三位 罗马数字月份 一年中的星期或月中的星期 年或月或星期中的天 天的星期,全拼写 天的星期,前三位拼写 Julia天,从4713BC开始
10
Company Confidential - For internal use only
FROM s_emp
WHERE trunc(start_date) = to_date(?2001-05-12‘,‘yyyy-mm-dd‘) And length(last_name)<10
LESSON 4多表数据查询
在数据的检索中,常常要按一定的联系同时从多个表中获取数据,尤其是数据库设计时遵循范式规则,这是就是一种所谓的多表数据查询,本节从建立表的联系开始,讲述多表数据的查询:
多表数据查询的首要条件是如何把多个数据表按一定的规则连接起来,从而获取多个表的、组织好的信息。连接的方式有多种,可按不同的要求进行选择。 连接
即是最简单的等号连接,以分别两个表中某列建立联系: SELECT table.column, table.column FROM table1, table2 WHERE table1.column1=table2.colmn2; 表别名
在多表数据检索中,由于检索的数据列可能存在于多个表中,且具有同一列名,这时必须在列名前加上表名以示区别,而对于较长的表名,写起来太麻烦,故可用表别名来区分各个不同的表,如下:
SELECT T1.column, T2.column…… FROM table1 T1, table2 T2 WHERE T1.column1=T2.colmn2; 非等号连接
即不使用等号来连接两个或两个以上的表 例如: 外连接
对于两个表,如记录不能一一连接,而又不想漏掉数据,可使用外连接
使用:>=、<、between
SELECT T1.column, T2.column…… FROM table1 T1, table2 T2 WHERE T1.column1=T2.colmn2(+);
11
Company Confidential - For internal use only
自连接
对于某些情况,必须要有表自身的连接,这时可利用表别名的作用,即把表完全看作两个不同的表来处理
对于已连接好的多表数据查询,如同一张“大数据表”,进行类似的数据查询。 例:
SELECT T1.fist_name, T2.first_name manager…… FROM t_emp T1, T_emp T2 WHERE T1.employee_id=T2.employee_id(+); 对多于两个以上的表连接具有相同的处理方法,如下是一多表连接例子: 例:
SELECT t1.item_name, t2.quantity, t3.last_name FROM t_item t1,
T_sales t2, T_emp t3
WHERE t1.item_id=t2.item_id And t2.emp_id=t3.employee_id And t2.approval_flag=‘Y‘
LESSON 5组函数
在数据检索中,我们不仅仅要检索出数据信息,同时还需要一些加工,例如一些统计信息等等,而数据库表中的数据总是离散在许许多多的列中,要组织起来就会用到另一类列函数,即是组函数。
从基本的格式讲起,如何组织数据,分组,以及使用HAVING语句筛选出所需组信息。 基本格式
SELECT column, group_function FROM table [WHERE condition] [GROUP BY group_by_expr] [HAVING group_condition] [ORDER BY column??] * GROUP BY: 对列进行分组 * HAVING: 条件限制组查询
12
Company Confidential - For internal use only