1) 范式:
Ø 如果一个记录不包括重复的组,而且包括一个主键,那么他处于第一范式
Ø 如果一个记录处于第一范式的状态,而且没有部分依赖,那么他处于第二范式
Ø 如果一个处于第二范式的记录消除了所有可传递依赖,那么他属于第三范式
Ø 如果一个记录处于第三范式而且消除了插入删除异常那么他属于B/C范式
Ø 如果一个记录处于B/C范式,而且消除了多值依赖,则处于第四范式
Ø 第五范式尚无明确定义
Ø DK/NF范式(域/关键字范式)消除了更新异常
2) 实体与属性:
具有某些特性的事物我们称之为实体,而实体的这些特性称之为实体的属性。
3) 数据库设计
数据库的设计方法主要有:经验设计法、规范设计法、计算机辅助设计法和自动设计方法几种。
经验设计法决定于设计者的经验和能力,因此越来越不适应信息管理发展的需求。为了改变这种状况。人们提出了规范设计法。将数据库的设计分成:需求分析、信息分析和定义、设计实现、物理数据库设计等四个阶段。常见的规法数据库设计方法有以下几类。
² 基于3NF的数据库设计方法
3NF数据库设计的基本思想是,在需求分析的基础上,识别并确定数据库模式中的全部属性和属性之间的依赖关系,并将他们组织在一个单一的模式当中。然后在分析不符合3NF的约束条件,使用投影和联连的方法将其分解,达到3NF的要求。具体又可以分成五个阶段:设计企业模式、设计数据库的概念模式、设计数据库的存储模式、评价数据库的物理模式、数据库的实现。
² 基于实体关系的数据库设计方法
实体关系数据库设计的基本思想是,在需求分析的基础上,使用E-R图构造一个纯粹反应现实世界的实体之间内在联系的企业模式,然后将此模式转换为制定的数据库管理系统的概念模式。
² 基于视图概念的数据库设计方法
基于视图概念的数据库设计基本思想是,先从分析各个应用的数据入手,为每个应用建立自己的视图然后再把这些视图汇集起来按照一定的原则合并为整个数据库的概念模式。
4) Oracle数据库
A〉 SQL语句
串联与描述表
串联:||
描述表:DESCRIBE|DESC[TABLENAME]
多表连接
笛卡尔连接:在没有使用关联条件的情况下直接将多个表进行联查
相等连接:多张表之间通过明确判断主外键关系是否相等来进行的连接方式
不等连接:例如用一张表中的部分数据与另外一张表中数据进行连接,常用的方式如:BETWEEN AND
自我连接:在一张表中通过自身属性关系进行连接限制
外联结:当一个表中的记录在另一张表中找不到与之相对应的记录时就需要用到外联结
说明:从查询语句的连接方式上大体可以分为两大类:内部连接和外部连接。其中笛卡尔连接、相等连接、不等连接和自我连接属于内联结,是相对于外部连接的连接方式。
常用单行函数
大小写转换函数
Ø LOWER(ARGS)/UPPER(ARGS) 字母大小写转换函数
Ø INITCAP(ARGS) 单词首字母大写转换函数
字符处理函数
Ø SUBSTR(STRING,INDEX,LEN)字符串截取函数
Ø LENGTH(ARGS)字符串长度函数
Ø LPAD(ARGS,LEN,STRING)/RPAD(ARGS,LEN,STRING)字符填充函数
Ø LTRIM(ARGS,STRING)/RTRIM(ARGS,STRING)字符删除函数
Ø REPLACE(ARGS,ARG_STRING,REP_STRING)字符替换函数
Ø CONCAT(ARGS_1,ARGS_2)字符连接函数
数字处理函数
Ø ROUND(ARGS,POINT)四舍五入函数
Ø TRUNC(ARGS,POINT)尾数舍弃函数
说明:在使用ROUND时,如果POINT参数小于“0”,则表示对ARGS在进行四舍五入时从整数部分的第|POINT|位开始,如果是大于“0”则表示从小数点后第POINT位开始。
日期函数
Ø MONTH_BETWEEN(ARG_1,ARG_2)前后两个日期月份差换算函数
Ø ADD_MONTHS(ARG,MONTHS)增加月份函数
Ø NEXT_DAY(DATE,DAY)日期附近一周某天日期换算函数
Ø TO_DATE(DATE,FORMAT)日期格式化函数
说明:
EXAMPLE COMMENTS EXPRESSION
MONTH 全部写出的月份名称 APRIL
MON 月份的3字母简写 APR
MM 月份的2位数字值 09
RM 罗马数字的月份 IV
D 一周中某一天的数值 星期四就是4
DD 一个月某一天的数值 28号就是28
DDD 一年中某一天的数值 12-31就是365
DAY 一周中某天的名称 Monday
DY 一周中某天的3字母简写 Mon
YYYY 显示4位年份 2007
YYY、YY、Y 显示年份的最后3位、2位、1位 007、07、7
YEAR 全部写出年份 TWO THOUSAND SEVEN
B.C. 或A.D. 表示公元前或公元后 2004 A. D.
其他单行函数
Ø NVL(ARG_NULL,REP_STR)/NVL2(ARG,REP_NOTNULL,REP_NULL)空串替换函数
Ø TO_CHAR(ARG,FORMAT)字符格式化函数
Ø DECODE(ARG,L1,R1,L2,R2,…,Ln,Rn)多条件替换函数
Ø SOUNDEX(ARG)声音摹仿函数
Ø ASCII(ARGS)CHAR获取ASCII码函数
Ø CHR(ARGS)ASCII码获取CHAR函数
Ø INSTR(ARGS,SECH_STR,INDEX,FINDID)字符搜索函数
Ø ABS(ARGS)求绝对值函数
Ø CEIL(NUMBER)求取最小整数函数 如 CEIL(3.14)=4;CEIL(3)=3;
Ø EXP(INT)求取e的n次方根函数
Ø FLOOR(NUMBER)截断取整函数 如FLOOR(3.14)=3;
Ø LN(NUMBER)常对数函数
Ø LOG(n1,n2)对数函数
Ø MOD(n1,n2)取余函数
Ø POWER(NUMBER)指数函数
Ø SIGN(NUMBER)求符号函数 如SIGN(-13)=-1;SIGN(0)=0;SIGN(4)=1;
Ø SQRT(+NUMBER)平方根函数
Ø LAST_DAY(DATE)当前月份的最后一天
Ø NEW_TIME(date,'this','that')时区切换函数 指'this'时区的时间date在'that'时区的时间值
Ø SYSDATE
Ø ROWIDTOCHAR(ROWID)此函数无特殊用处
Ø CONVERT(c,dset,sset)
Ø HEXTORAW十六进制转二进制
Ø RAWTOHEXT二进制转十六进制
Ø ROWIDTOCHAR
Ø TO_MULTI_BYTE—尚不知道有何用途
Ø TO_NUMBER转数函数
Ø BFILENAME(dir,file) —尚不知道有何用途
Ø DUMP(s,fmt,start,length)—尚不知道有何用途
Ø GREATEST(ARG1,ARG2,ARG3….)返回一组值中ASCII码最大的数
Ø LEAST(ARG1,ARG2,ARG3….)返回一组值中ASCII码最小的数
Ø UID返回标识当前用户的唯一整数
Ø USER返回当前用户的名字
Ø USERENV返回当前用户环境的信息
Ø EMPTY_BLOB()和EMPTY_CLOB()对大数据类型字段进行初始化
参数如下:
ENTRYID, SESSIONID, TERMINAL, ISDBA, LABLE, LANGUAGE,CLIENT_INFO, LANG, VSIZE
部分单行函数的使用与差异说明:
a. INITCAP(ARG)
情况一(整个字符串):
--------------------------------------------------------------------------------
select initcap('mybookoftable') from dual
INITCAP('MYBOOKOFTABLE')
------------------------
Mybookoftable
--------------------------------------------------------------------------------
情况二(带分割空格的字符串):
--------------------------------------------------------------------------------
select initcap('my book of table') from dual
INITCAP('MYBOOKOFTABLE')
------------------------
My Book Of Table
--------------------------------------------------------------------------------
b. TO_DATE(ARG,FORMAT)
说明:其中ARG是用户输入的日期,而FORMAT则是用户输入日期的格式。
--------------------------------------------------------------------------------
select to_date('09 30,2003','MM DD,YYYY')dates FROM DUAL
DATES
----------------
2003-9-30
1 row selected
--------------------------------------------------------------------------------
c. TO_CHAR(DATE,FORMAT)
--------------------------------------------------------------------------------
select TO_CHAR(sysdate,'YYYY-MM-DD')dates FROM DUAL
2007-02-10
--------------------------------------------------------------------------------
d. ASCII(ARGS)与CHR(ARGS)
--------------------------------------------------------------------------------
SELECT ASCII('魏')NAME FROM DUAL ----52922
SELECT CHR(52922) NAME from DUAL ----魏
--------------------------------------------------------------------------------
e. INSTR(ARGS,SECH_STR,INDEX,FINDID)
--------------------------------------------------------------------------------
SELECT INSTR('my book of table of','of',1,2) FROM DUAL---18
SELECT INSTR('my book of table of','of',1,1) FROM DUAL---9
--------------------------------------------------------------------------------
f. LAST_DAY(ARGS)
--------------------------------------------------------------------------------
SELECT LAST_DAY(SYSDATE) FROM DUAL---- 2007-02-28
SELECT TO_CHAR(LAST_DAY(SYSDATE),'YYYY-MM-DD') FROM DUAL
--------------------------------------------------------------------------------
g. ADD_MONTHS(DATE,NUMBER)
--------------------------------------------------------------------------------
SELECT SYSDATE FROM DUAL ---- 2007-2-10 16:56:53
SELECT ADD_MONTHS(SYSDATE,2) FROM DUAL--- 2007-4-10 16:56:53
--------------------------------------------------------------------------------
h. MONTHS_BETWEEN(DATE_BIG,DATE_LITTLE)
--------------------------------------------------------------------------------
SELECT MONTHS_BETWEEN(ADD_MONTHS(SYSDATE,2),SYSDATE) FROM DUAL---2
--------------------------------------------------------------------------------
i. NEW_TIME(DATE,’TIMEAREA_1’,’TIMEAREA_2’)
--------------------------------------------------------------------------------
SELECT NEW_TIME(SYSDATE,'PDT','GMT') FROM DUAL
说明:关于时区的问题可以查看下面附录的时区简写表
--------------------------------------------------------------------------------
j. USERNV(ARGS)
--------------------------------------------------------------------------------
SELECT USERENV('ISDBA')FROM DUAL
--------------------------------------------------------------------------------
k.
常用组函数
Ø SUM(ARGS)求和函数
Ø ARG(ARGS)平均数函数
Ø COUNT(ARGS)递加函数
Ø MAX(ARGS)峰值函数
Ø MIN(ARGS)谷值函数
Ø STDDEV(NUMBER)标准差函数
Ø VARIANCE(NUMBER)方差函数
Ø 关于WHERE子句 和HAVING子句
WHERE子句 和HAVING子句都用于对查询的数据设置过滤条件,但WHERE子句是在对数据进行查询时直接判断当前数据是否符合WHERE子句的过滤条件,而HAVING子句则是首先将所有的数据都查出来,然后再根据HAVING子句中设置的过滤条件对已经查出的数据进行过滤,很明显,用HAVING子句进行条件过滤时的效率要远远低于前一种过滤方式(使用WHERE子句)
子查询
规则:
Ø 子查询必须自身就是一个完整的查询
Ø 子查询不能包括ORDER BY子句
Ø 子查询必须包括在一组括号中以便将他与外部查询分开
Ø 如果子查询位于外部查询的WHERE、HAVING子句中则其只能位于比较运算符的右边。
单行子查询
多行子查询
关联子查询
嵌套子查询
WHERE子句中的多列子查询
关于EXISTS和IN
关于ANY与ALL
表的维护与约束
规则:
Ø 表和列名不能超过30个字符,必须以字母开始
Ø 表和列名不能有空格,但是带有双引号“”的列名出外
Ø 一个用户权限下的表名和列名必须是唯一的
Ø 表名和列名的命名不能使用ORACLE关键字
Ø 表中最多能有1000个字段
通过子查询创建表
修改现有表
针对视图的DML操作
用户授权
PL/SQL总结
游标与异常
B〉 SQL优化
ORACLE的优化器有3种:
Ø RULE 基于规则的优化器
Ø COST 基于成本的优化器
Ø CHOOSE 基于选择的优化器
C〉 我对索引的理解
对于一个工程而言,我们不仅仅需要设计数据库的基本表结构与表之间的关系,当表的结构呈现出来以后,索引的使用极大的影响到了系统的整体性能(不论是消极的还是积极的)。因此在使用索引是遵循的原则就非常重要。
对于索引而言,我们可以把数据库中的每张表理解为一个LIST,而在这个LIST中的每条记录,我们可以理解为一个封装好的DTO对象。那么,我们可以将索引理解为一个HASHMAP,在这个HASHMAP中KEY就是我们所创建的索引字段中的内容,而VALUE就是一个数组,每个数组中的元素就是一条记录的ROWID。如果我们为某个字段创建了一个索引,数据库就会首先在这个字段上打上一个标记,当我们开始对表中的数据开始查询的时候,数据库会首先查看查询语句的过滤条件中使用的每个字段是否有打上索引标记,如果有索引标记,则数据库就会直接使用它为索引建立好的HASHMAP,然后从HASHMAP的相应KEY值找出所需记录的ROWID。而不需要去对全表中的数据进行遍历来判断。
通过分析索引的原理,我们可以看出,对索引而言,表中的数据量越大索引的作用也就越大(我们暂时可以先这样来理解—因为这句话不是十分准确,我在后面还有相关的准确描述)。对效率的提升也就越明显。而当表中的数据仅仅只有几百条甚至更少时,由于数据库不仅需要维护表结构还需要维护索引,所以,此时不但无法提升系统的性能,而且相反会使系统的性能下降。所以说索引的建立需要权衡考虑表中将来需要存放的数据量。
其次,并不是表中的索引建立越多越好。一个比较夸张的例子就是在表中的每个字段都建立索引,事实上这种方式与表中的任何一个字段都不加索引是没有太多差异的。
索引对应的字段值的类型应该是有限的、可穷举的和可重复的。如果表中待索引字段中的数据是不可重复的,那么对于数据库而言,一旦建立了索引,这个维护代价是相当大的。因为,在这种情况下,存放索引的HASHMAP就需要为每条记录生成一个KEY,而其所对应的VALUE就只有一个值,这个值中仅仅存放了一个大小为“1”的数组。此时,如果你对表中数据进行检索时,事实上与没有建立索引的状况是基本一致的,唯一的差异就在于建立索引后检索过程比后者多了一次操作。从这个意义上讲,建立的索引反倒导致检索的效率产生了些微的降低。其次,字段中存放的数据应该是有限的、可穷举的,因为只有有限的、可穷举的数据才能满足索引的“稀疏型”要求(属于下一个话题)。
用索引检索出来的数据量应该尽量保证远远小于库中所有数据的总量,也就是说,如果你有需求想要在某个字段上建立索引,那你就需要首先保证你使用该索引经常检索的数据应该是“稀疏型”数据(对“稀疏型”数据比较感兴趣的话可以数据结构部分关于“稀疏矩阵”章节的介绍和说明)。因为只有在这种情况下,索引才能产生最优化检索结果。打个很简单的比方,假如我们建立了一张TEST表,在表中有8K万条数据。而我们通常情况下检索的数据是其中的7.999K万条,那么在这种情况下,数据库首先会从HASHMAP中找到我们用来检索的键值,然后找到待检索数据的一个ROWID数组,然后通过遍历这个ROWID数组,获得我们所需要的数据。那么,我们在这种条件下如果不使用任何索引又会是什么结果呢,在没有用到索引的情况下,数据库会直接遍历库中的每条数据,最后直接得到我们需要的数据。显而易见,在这种情况下,如果我们不使用索引反倒提升了系统的检索性能。但是如果我们把这个问题再反过来描述一边,如果我们需要检索的数据仅仅是8K万条中的0.001K万条数据。那么,很显然,这时候建立索引的优势就会凸现出来。
分享到:
相关推荐
Oracle 数据库总结 Oracle 数据库是甲骨文公司的一款关系数据库管理系统,是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。下面是 Oracle 数据库的总结...
oracle数据库总结
oracle数据库总结
C++使用OCILIB连接Oracle数据库总结.pdf
Oracle数据库是全球最广泛使用的数据库管理系统之一,由Oracle公司开发并提供。自1977年成立以来,Oracle公司已经成为信息管理软件的主要供应商,提供数据库系统、应用服务器、开发工具、决策支持工具等一系列企业级...
oracle数据库总结oracle数据库总结oracle数据库总结oracle数据库总结
"查看登录 Oracle 数据库用户记录" Oracle 数据库是一个强大的关系型数据库管理系统,提供了强大的数据存储和管理功能。为了管理和监控数据库的访问情况,需要对登录 Oracle 数据库的用户记录进行跟踪和查看。本文...
Oracle数据库学习总结资料.pdf Oracle数据库学习总结资料.pdf 是一份关于 Oracle 数据库的学习总结资料,涵盖了 Oracle 数据库的各个方面,包括 Oracle 的简介、简单查询、标量函数和算数运算、多表查询、列函数和...
【Oracle数据库概述】 Oracle数据库是全球广泛使用的商业关系型数据库管理系统之一,由甲骨文公司开发和维护。它提供了一种高效、安全且可靠的方式来存储和管理大量的结构化数据。Oracle数据库不仅支持标准的SQL...
### Oracle数据库日志查看方法详解 #### 一、概述 Oracle数据库是企业级应用中广泛使用的数据库管理系统之一,为了确保数据库系统的稳定运行和快速定位问题,掌握Oracle数据库日志查看方法至关重要。本文将详细...
Oracle数据库知识点总结 章节目录 一、Oracle数据库概述 二、Oracle数据库架构与组件 三、SQL语言基础 四、PL/SQL编程 五、数据库对象管理 六、数据备份与恢复 七、性能优化与安全管理 八、如何学习Oracle数据库 九...
总结,Oracle数据库设计与优化是一个涉及多方面知识的复杂过程,包括但不限于物理结构设计、SQL优化、索引策略、存储过程使用、性能监控以及备份恢复策略。理解这些核心概念并灵活应用,将有助于构建高效、稳定且...
Oracle 数据库的启停 Oracle 数据库的启停是数据库管理员的重要任务之一。启停数据库的过程可以细分为三个步骤:启动实例、挂载数据库、打开数据库。下面将详细讲解 Oracle 数据库的启停过程。 启动数据库 启动...
总结,LabVIEW调用Oracle数据库涉及的关键点有:使用ODBC连接数据库、构建和执行SQL命令、创建和操作数据库表。理解这些概念和步骤,将有助于在LabVIEW环境中有效地管理和操作Oracle数据库。在实际应用中,还要考虑...
### C# 版 Oracle 数据库通用操作类解析 在现代软件开发中,数据库操作是必不可少的一部分,而 C# 结合 Oracle 数据库的应用尤为广泛。本文将深入探讨一个用于简化 Oracle 数据库操作的 C# 类——`ConnForOracle`。...