常用组函数
AVG、COUNT、MAX、MIN STDDEV、SUM、VARIANCE
组值函数如sum、avg、stddev等等,反映的是一组值的某种整体状况、一些统计信息。同时,要注意的是,组值函数忽略NULL值,在做计算时将其排除在外,如avg函数,如数据中含有较多的空值时,avg返回的统计信息偏差较大,而count函数出外,它是一种特殊情况,它可以处理NULL值,并总是返回一个数值,所求出的值决不会是NULL。 例:
SELECT T1.name, T2.item_name, sum(T3.quantity), min(T3.rec_date) FROM t_inventory T1,
T_item T_onhand
T2, T3
Where T1.warehouse_id=T3.warehouse_id And T3.item_id=T3.item_id GROUP BY T1.name, T2.item_name HAVING sum(T3.quantity)>100
所有的组值函数都有一个distinct或all选项,缺省的选项为all,count函数就是一个说明起作用的例子: 注意如下查询的结果:
SELECT count(distinct item_id), count(item_id), count(*) FROM t_onhand HAVIGN与WHERE:
WHERE语句作用在数据检索的每一列上,对每一列进行判定,HAVING语句则是作用在每一组上,对每一组进行判定,WHERE语句在HAVING起作用前作用。
考虑以下SQL语句的查询:
SELECT t1.last_name, sum(t2.quantity*t2.price) FROM s_emp t1, S_sales t2
WHERE t1.emp_id=t2.emp_id And nvl(t2.cancel_flag,‘N‘)<>‘Y‘ And nvl(t2.approval_flag,‘N‘)=‘Y‘
13
Company Confidential - For internal use only
Having sum(t2.quantity*t2.price)>10000;
LESSON 6 子查询
子查询是一段嵌入在另一段SQL语句中SELECT语句,通过子查询,可以建立功能强大的查询语句,尤其在检索某以数据表时,又依奈这张表本身的一些情况。 格式
SELECT select_list FROM table WHERE expr operator (SELECT select_list FROM table) 注:
I. II. III.
Expr 与子查询的select_list有相应的结构和数据类型 子查询无order by 语句 子查询必须在operator的右面
下名通过一些例子来说明子查询的应用。 例:
SELECT t1.item_id, t1.quantity, t1.rec_date FROM t_onhand t1
WHERE rec_date = ( SELECT min(x.rec_date) FROM t_onhand x
WHERE x.item_id = t1.item_id)
当然,很多时候子查询也可由组函数实现,比较一下下面查询的结果与前者的情况: SELECT T1.item_id, T1.quantity, T1.rec_date FROM t_onhand T1,
(SELECT item_id, min(rec_date) rec_date FROM t_onhand) T2 WHERE T1.item_id = T2.item_id And T1.rec_date = T2.rec_date
可用于operator的运算符很多,分为单行子查询和多行子查询,单行子查询即是在自查询的结果中,至多返回一行值,可用于单行子查询的逻辑运算符有: =、>、<、>= 或者<=
多行子查询相对于单行子查询,即在子查询中可返回多行数据结果,可用于多行子查询的逻辑运算有:
14
Company Confidential - For internal use only
in、not in
还有一种存在性相关子查询,即exists语句,它与in子查询相似,但有两点不同:
i. 不能匹排一列或多列 ii.
只能用于相关子查询
例:
SELECT T1.item_name, T1.description FROM t_item T1
Where exists ( SELECT * from t_sales
WHERE item_id = T1.item_id) Company Confidential - For internal use only
15
UNIT3数据库
单元培训目标
?
理解Oracle数据库的概念和作用;
能创建常用的数据库对象(如表、索引、视图和序列); 学会使用数据库字典,记住一些常用视图
?
?
LESSON 1系统开发周期和数据关联
大型数据库应用系统的开发都是以一定的标准流程开发的,而重要的一条就以系统开发周期为参照,定制开发流程和开发计划,逐步实施。
深刻理解数据关联的概念时非常重要的,这对数据库应用系统的设计,具体到数据库对象的设计都是深刻影响的,一个性能优越的数据库应用系统很大程度上依耐于数据库结构的设计,而理解数据关联的实质有利于数据库的设计。 系统开发周期
通过使用系统开发周期策略,实现数据库从概念到产品的转变,系统开发周期包含多个开发过程和步骤。这种由上到下、系统的方法可把实际的业务需求变成可操作的数据库概念。 有如下步骤(流程): I.
分析,策略: 根据企业的实际业务和将要扩展的业务需求,分析所要提供的信息和企业及系统特性,建立相应系统模型;
设计:数据库设计,把实体模型映射成数据库表之间的关联,外键关联和约束;
开发和创建文档:开发业务流程,建立用户界面,操作流程,并创建相应文档(如帮助文档、操作手册等)
产品化:集成各模块功能,统一成一个完整产品,并做好各项测试准备; 测试:功能测试、业务流程测试、出错流程测试最后的安装测试等。
II.
III.
IV. V.
在这几步步骤中,第二步尤为重要,直接影响开发的成败和效率,在第二步中,应用开发者重点要要考虑以下一些因数:
效率:最初的设计是最终设计的一个雏形,要充分考虑业务的效率;
系统集成:系统的多个模块间不是孤立的,应有紧密的结合,这种结合并非看起来或感觉上的,是从逻辑上和业务流程上的角度来分析的;
与其他系统的集成:企业与运作时,往往有多个系统的存在,但同时各个系统间是有结合的、联系的,如数据上、业务上的,同时还要考虑未来业务需求的标准接口等等;
16
Company Confidential - For internal use only
数据关联
系统开发周期第二步的重点工作就是建立逻辑模型,逻辑模型是业务数据的非常规范化的流程图。懂得数据分解的原因和方法是理解模型的基础,而模型又是建立长期支持业务应用程序的基础。
规范化的过程通常用“范式“一词来讨论,最常见就是第一、二、三范式,其中第三范式是最高的规范化层次。 I.
第一范式(1NF):具体做法就是将每一个表中具有相似类型的数据存入不同的表中,并给每个表确定一个主关键字(即是:Primary Key)----- 唯一的标号或标示符,消除重复数据;
第二范式(2NF):即是表中数据列只依赖主关键字;
第三范式(3NF):即是找出不只是依赖于主关键字的说有数据列。
II. III. 约束
为实现数据结构的规范化标准,即是各级范式,可以在定义表结构时,定一各个列和表的约束,从而严格表中的数据,格式如下: 数据列级约束:
Column [ CONSTRAINT constraint_name ] constraint_type Column [ CONSTRAINT constraint_name ] constraint_type 数据表级约束: 约束主要要以下几种: I. II.
Primary Key(PK):由一列或多列构成的唯一标示各行的列;
Foreign Key(FK):即由表中一列或列组合来映射同一表或别的表的PK或UK(unique key); NOT NULL UNIQUE CHECK
III. IV. V.
对于建立约束的例子,可在建立数据表中参考。
LESSON 2创建表、序列、视图和索引
下面从最基本的数据库对象建立讲起,逐步理解系统开发周期的意义,以及数据关联的意义。
17
Company Confidential - For internal use only