关系型数据:是以关系数学模型来表示的数据。它以二维表的形式来描述数据
关系型数据库系统:硬件(客户机、服务器)、操作系统、关系型数据库管理系统和数据库、关系型数据应用系统、用户
什么是数据仓库
什么是联机分析
什么是数据挖掘
什么是集群技术
oracle2种工作模式:C/S和B/S
数据库服务器体系结构
进程结构(用户进程、服务器进程)
内存结构(系统全局区SGA(用户进程和服务器进程共用),程序全局区PGA(用户进程私用))
数据库逻辑结构(数据库、表空间、逻辑对象(表、索引、视图)、数据段(数据段、索引段、临时段、回滚段)、数据区间、数据块)
数据存储结构(数据库、物理文件(数据文件、控制文件、日志文件)、物理块)
注:
数据块 Data Block
数据区间 Data Extent
数据段 Data Segment
逻辑对象 Logic Object
表空间 TableSpace
数据库发展历史
网状数据库、层次数据库、关系数据库。
关系数据库的3个含义
1.在关系数据库中,信息被存放在二维结构表中
2.这些表之间是相互关联的
3.数据库不仅仅包含表,而且还包含了其他数据库对象
关系数据库的特点
关系(二维表)
元组(记录)
属性(字段)
域(属性的取值范围)
候选码(关系中能唯一标识元组的最小的属性集合)
主码(一组可以唯一标识元组的属性)
关系模式(指对关系的描述,通常称为表结构)
完整性
域完整性(字段属性的约束)
实体完整性(记录的唯一性)
参照完整性(对外键的约束)
数据库范式
第一范式(每一列不可分割)
第二范式(非主属性要完全依赖主属性,所谓完全依赖是指不能存在仅依赖主关键字一部分的属性(复合主键),如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。)
第三范式(非主属性之间不能相互依赖,属性不依赖于其它非主属性[消除传递依赖] )
关系数据库
通常包括:客户端应用程序、数据库服务器、数据库
数据库
一系列物理文件(数据文件、控制文件、联机日志)的集合或与之对应的逻辑结构(表空间、段等)被称为数据库
表空间
数据库结构提供对数据文件的逻辑映射,允许不同类型的数据分开存储,这些逻辑划分称做表空间。
数据库实例
SGA(System Global Area)存储结构,用来存储最近从数据库中查询的数据。
数据块缓存区和sql共享池是SGA最大的组成部分。
数据库实例也叫服务器,是用来访问数据库文件集的存储结构及后台进程的集合。在oracle并行服务器选项下,一个数据库可以被多个实例访问。
sql子语言
数据定义语言(Data Definition Language)DDL
数据查询语言(Data Query Language)DQL
数据操纵语言(Data Manipulation Language)DML(增加修改删除等操作)
数据控制语言(Data Control Language)DCL(设置或者更改数据库用户或角色权限的语句)
事务控制语言(Transaction Control Language)TCL
PL/SQL基本语法
PL/SQL不区分大小写
所有保留字都采用大写、用户定义的基本采用骆驼命名法。
分隔符(一句可以分多行)
引用字符串(注意:数字不用单引号,以及单引号转义)
括号
PL/SQL数据类型
标量、复合、引用、LOB
》标量类型
1.数字类型
NUMBER(p,s)
NUMBERIC(p,s)
FLOAT
DEC
DECIMAL
INT/INTEGER
BINARY_INTENER
PLS_INTEGER
SMALLINT
SIMPLE_INTEGER
REAL
DOUBLE_PRECISION
BINARY_DOUBLE
BINARY_FLOAT
2.字符类型
CHAR(size) 最大2000B
NCHAR(size) 最大1000B
VARCHAR2(size) 最大4000B
NVARCHAR2(size) 最大2000B
LONG
RAW(size)
LONG RAW
3.日期类型
DATE(定义日期和时间)
TIMESTAMP(定义日期和时间,不仅显示日期还会显示时间和上下午标记)
INTERVAL(存储2个TIMESTAMP之间的时间差异)
4.行标识符
ROWID(支持物理行标识,不支持逻辑行标识)和UROWID (支持物理行标识,也支持逻辑行标识)
5.布尔类型BOOLEAN
值有:TRUE、FALSE、NULL
(注意:它是PL/SQL数据类型,不支持表列数据类型)
》复合类型
PL/SQL记录、PL/SQL集合
其中PL/SQL集合包含:联合数组、嵌套表、VARRAY(变长数组) 3种复合数据类型
PL/SQL记录语法
TYPE name IS RECORD(定义成员列表)
联合数组
TYPE table_type_name IS TABLE OF scalar_type INDEX BY index_datatypes;
嵌套表
TYPE table_name IS TABLE OF table_type [NOT NULL]
VARRAY(变长数组)
TYPE type_name IS [VARRAY | VARYING ARRAY] (max size) OF element_type [NOT NULL]
》引用类型
REF CURSOR类型、REF类型
》LOB类型
CLOB 存储单字节字符数据
BLOB 存储非结构化的二进制数据
NCLOB 存储定宽Unicode多字节字符数据
BFILE 存储大型二进制文本的指针
PL/SQL基本结构
声明部分、执行部分(必需的部分)、异常处理部分
变量
变量名 类型标识符 [NOT NULL]:=值
TYPE%
ROWTYPE%
常量
常量名 CONSTANT 类型标识符 [NOT NULL]:=值
表达式
数值表达式:+ ,-, *, /, **(乘方)
字符表达式: ||(链接运算符)
关系表达式:<,>,=,<=,>=,!=,ALL,
ANY,SOME,
BETWEEN,
EXISTS
IN
IS
LIKE
逻辑表达式:NOT、AND,OR ,优先次序为 NOT、AND,OR
集合运算符:INTERSECT、MINUS、UNION、UNIONALL
行运算符:ALL,DISTINCT、PRIOR
流程控制
IF condition THEN
......
END IF
IF...THEN...ELSE
IF...THEN...ELSEIF
CASE(有2种)
LOOP 语句 END LOOP
其中包含EXIT或EXIT ...WHRN 跳出2种方式
循环标签(增强可读性)
WHTN...LOOP
FOR...LOOP
如
FOR i IN 1...3 LOOP
执行语句体
END LOOP
注意:i不能被赋值(即计数器不能被赋值)
注意:REVERSE反转
注意:循环的边界可以是文字,变量,表达式,但它们必须都是数字。否则PL/SQL会抛出预定义异常。
GOTO语句,要设置标签名(略)
NULL语句,本身并不做什么,只是简单地将控制权转交给下一个语句而已。
PL/SQL常用语句
DDL,DQL,DML,DCL,TCL
其中DCL用于实现权限授予(GRANT)和撤销(REVOKE)
PL/SQL常用的部分权限
CREATE USER
DROP USER
SELECE ANY TABLE
CREATE ANY TABLE
DROP ANY TABLE
CREATE VIEW
CREATE SEQUENCE
CREATE PROCEDURE
如:GRANT CREATE ANY TABLE TO USER1
REVOKE CREATE ANY TABLE FROM USER1
TCL事务控制语句
1.提交事务COMMIT
出现以下情况时会自动提交事务
执行DDL语句,执行DCL语句,退出SQL*PLUS
2.设置事务回滚点(也叫事务保存点)SAVEPOINT
如SAVEPOINT A;或EXEC DBMS_TRANSACTION.SAVEPOINT('A');
3.回滚事务(ROLLBACK)
指定回滚到某个事物保存点
ROLLBACK TO A或EXEC DBMS_TRANSACTION.ROLLBACK_SAVEPOINT('A');
回滚全部事务
ROLLBACK或EXEC DBMS_TRANSACTION.ROLLBACK
游标、过程、函数(与过程类似,但必须有一个返回类型)
包:DBMS_OUTPUT,DBMS_TRANSACTION等
集合:即是前面介绍的联合数组,嵌套表,可变数组
EXCEPTION:分为编译时错误和运行时错误
引发异常有2种方法
发生ORACLE错误自动触发
RAISE显式地触发异常
注意:OTHERS子句
PL/SQL异常又分:预定义异常和非预定义异常(标准的异常和程序员定义的异常需要使用raise显式触发)
注意:使用Raise_Application_Error
如Raise_Application_Error(-20001,‘表中已经存在该记录’)
其中-20001必须在-20000到-20999之间,防止与oracle的任何错误码发生冲突,后一个参数不超过2KB
注意在WHEN OTHERS中使用:SQLCODE或SQLERRM
常用开发工具SQL*PLUS和SQL Developer
设置执行格式、显示格式(略)
在Oracle内部,每个数据表都有一个伪列ROWID,用于存放ROWID类型的二进制值。每个ROWID代表了一行数据的存储地址。物理ROWID 能够标识普通数据表中的一行信息,而逻辑ROWID能够标识索引组织表(index-organized table)中的一行信息。其中ROWID类型只能存储物理内容,而UROWID(universal rowid)类型可以存储物理或者逻辑ROWID。
建议:只有在旧的应用程序中,为了兼容性我们才使用ROWID数据类型。对于新的应用程序,应该使用UROWID数据类型。
水平分区将表分为多个表。每个表包含的列数相同,但是行更少。例如,可以将一个包含十亿行的表水平分区成 12 个表,每个小表表示特定年份内一个月的数据。任何需要特定月份数据的查询只需引用相应月份的表。
而垂直分区则是将原始表分成多个只包含较少列的表。
表散列与水平分割相似,但没有水平分割那样的明显分割界限,
据表基本操作
数据库的数据逻辑上是存储在表空间中,物理上是存储在数据文件中。
创建数据表
CREATE TABLE TABLE1(ID NUMBER(3) NOT NULL,NAME VARCHAR2(20) NULL);
或
CREATE TABLE TABLE1 AS SELECT ID,NAME FROM TABLE2;
注意:如果查询涉及到Long数据类型,那么CREATE TABLE ...AS SELECT 不会工作。
修改数据表
增加列
ALTER TABLE TABLE1 ADD createDate DATE;
修改列
ALTER TABLE TABLE1 MODIFY NAME VARCHAR(30);
注意:大部分时候列的值为空才能修改。
删除数据列
ALTER TABLE TABLE1 DROP COLUMN NAME ;
更改表名
RENAME oldname TO newname;
删除表
DROP TABLE TABLE1;
清空表数据
TRUNCATE TABLE TABLE1;
注意区别
区别
1。delete from后面可以写条件,truncate不可以
2。delete from记录是一条条删的,所删除的每行记录都会进日志,而truncate一次性删掉整个页,因此日至里面只记录页释放,简言之,delete from更新日志,truncate基本不,所用的事务日志空间较少
3。delete from删空表后,会保留一个空的页,truncate在表中不会留有任何页
4。当使用行锁执行 DELETE 语句时,将锁定表中各行以便删除。truncate始终锁定表和页,而不是锁定各行。
5。如果有identity产生的自增id列,delete from后仍然从上次的数开始增加,即种子不变,而truncate后,种子会恢复初始
6。truncate不会触发delete的触发器,因为truncate操作不记录各个行删除
约束
非空约束 NO TNULL(简单不用演示)
唯一 UNIQUE
column_name data_type constraint 约束名 unique//单列数据
constraint 约束名(多列) unique using index tablespace(table_name) storage(stored clause)
添加约束
alter table 表名 add constraint 约束名 unique(列名) using index tablespace 表空间名
主键 PRIMARY
列名后面直接加上主键约束
itemid varchar2(20) constraint pk_items primary key
如果主键约束保护多个列,必须作为一个表约束创建
constraint pk_items primary key(itemid,itemname) using index tablespace(table_name) storage(stored clause)
禁用或删除
alter table items drop primary key;
alter table items disable primary key
外键 FOREIGN KEY
alter table invency
add constraint fk_invency_items
foreign key(itemid) references items(itemid);
条件 CHECK
条件列约束不保护log数据类型和数据列和对象、嵌套表、varry、ref等
constraint chk_status check(status in('正常','出差','休假'));
约束的维护
禁用约束 alter table 表名 disable constraint 约束名
启用约束 alter table 表名 enable constraint 约束名
删除约束 alter table 表名 drop constraint 约束名
序列的创建
create sequence sequence1
increment by 1
start with 1
maxvalue 10000
minvalue 1
nocycle
cache 20或nocache
noorder //不指定排序
;
sequence1.currval
sequence1.nextval
drop sequence sequence1;
--------------------------------------------------------------------------------------------
索引
如果没有建立索引的话,那么查询该表的任何记录都会通过顺序地逐行扫描得到,这会导致大量的磁盘i/o,从而会大大降低数据库系统的效率,索引通常用于提高查询效率。当然过多的索引也会使更新、插入、删除操作花费更多的时间。
B-tree索引(如唯一索引、主键索引)也就是B-树索引。基本上这些索引存储的是所在的列值以及用来查找自身行的指向实际数据表的指针。
注意:如果索引是创建在多个列上的话,那么第一列非常重要。第一列会单独扫描。后面列不会。
函数索引(基于函数建立的)
反转键索引(不能对位图索引和索引组织表进行反转键索引)
位图索引(为相异值很少的列创建的),一般而言,只有当对表中值相宜度较小的多个不同的列都使用位图索引,这样位图索引才会有用。
位图连接索引
压缩索引
降序索引(可以显著优化order by x,y,z desc子句查询)
分区索引
其他:索引组织表、簇索引、域索引、隐藏索引、虚拟索引等
创建索引
创建不唯一索引
create index idx_itemname on item(name) tablespace 表空间名;
创建唯一索引
create unique index idx_itemid on item(id) tablespace 表空间名;
创建位图索引
create bitmap index idx_itemsdeleted on item(isdeleted) tablespace 表空间名;
创建反转键索引
create unique index reidx_delivey on delivey(did,date) tablespace 表空间名 reverse;
创建函数索引(既可以是普通的B-树索引,也可以是位图索引)
create index idx_sub on item(substr(itemid,1,4))tablespace 表空间名;
注意:
导入数据后再创建索引
不需要为很小的表创建索引
对于取值范围很小的字段(如性别)应当建立位图索引
限制表中的索引数目
为索引设置合适的pctfree值
存储索引的表空间最好单独设置
使用索引
全表扫描(Full table scan):就是顺序地访问表中的每条记录。oracle采用一次读入多个数据块的方式优化全表扫描。
索引扫描(index scan):可以采用基于rowid的方式访问以提高访问表的效率。rowid包含了表中记录的物理位置。oracle采用索引实现了数据和存放数据的物理位置rowid之间的联系。通常索引提供了快速访问rowid的方法,因此基于索引列的查询就可以得到性能上的提高。
索引唯一扫描(index unique scan)
索引范围扫描(index range scan)使用于2种情况:范围的索引、非唯一性的索引
注意:全表扫描需要读入的数据块数等于该表的实际数据块数
oracle评价使用索引的代价时有2个重要的数据
CF:每读入一个索引块要对应读入多少个数据块
FF:sql语句所选择的结果集占总的数据量的百分比
一般的估算公式是:FF*(CF+索引块个数)
索引不是越多越好
很多时候,单列索引不如复合索引
用于多表连接的字段,加上索引列会很有用
----------------------------------------------------------------------------------
Meger更新
meger into t1 using t on(条件)
when matched then ××××
when not matched then ××××
oracle常用函数和命令
1、set linesize 100; 设置长度
2、set pagesize 30; 设置每页显示数目
3、em a.sql 打开记事本
4、@ a 执行文件a中的代码,可指定文件的路径 @d:a.txt
5、conn 用户名/密码 根据用户名和密码连接数据库 如果连接超级管理员(sys) 则应加上as sysdba;
6、show user; 显示当前连接的用户
7、select * from tab; 得到当前用户下的所有表
8、desc temp; 查看表结构
9、/ 继续执行上一个查询语句
clear scr; 清屏
字符函数
10、select upper('coolszy') from dual; 将小写字母转换成大写,dual 为一虚表
11、select lower('KUKA') from dual; 将大写字母转换成小写
12、select initcap('kuka') from dual; 将首字母大写
13、select concat('Hello',' world') from dual; 连接字符串,但没有||好用select concat('Hello','world') from dual;
14、select substr('hello',1,3) from dual; 截取字符串
15、select length('hello') from dual; 求字符串长度
16、select replace('hello','l','x') from dual; 替换字符串
17、select substr('hello',-3,3) from dual; 截取后三位
补充:trim、lpad、rpad、instr
数值函数
18、select round(789.536) from dual; 四舍五入,舍去小数
19、select round(789.536,2) from dual; 保留两位小数
20、select round(789.536,-1) from dual; 对整数进行四舍五入
21、select trunc(789.536) from dual; 舍去小数,但不进位
22、select trunc(789.536,2) from dual;
23、select trunc(789.536,-2) from dual;
24、select mod(10,3) from dual; 返回10%3的结果
补充:abs、ceil、floor、power、rand、sqrt、
日期函数
25、select sysdate from dual; 返回当前日期
26、select months_between(sysdate,'16-6月 -08') from dual; 返回之间的月数
27、select add_months(sysdate,4) from dual; 在日期上加上月数
28、select next_day(sysdate,'星期一') from dual; 求下一个星期一
29、select last_day(sysdate) from dual; 求本月的最后一天
补充、trunc、round
其中sysdate的格式
CC:世纪
WW:为一年中的周
W:为一个月中的周
D:为星期几
DDD:为一年中的第几天
YEAR:为年
MONTH:为月
DAY:为日
转换函数
30、select to_char(sysdate,'yyyy') year,to_char(sysdate,'mm'),to_char(sysdate,'dd') from dual;
31、select to_char(sysdate,'yyyy-mm-dd') from dual;
32、select to_char(sysdate,'fmyyyy-mm-dd') from dual; 取消月 日 前面的0
33、select to_char('20394','99,999') from dual; 分割钱 9表示格式
34、select to_char('2034','L99,999') from dual; 加上钱币符号
35、select to_number('123')*to_number('2') from dual;
36、select to_date('1988-07-04','yyyy-mm-dd') from dual;
其中日期格式
YYYY:完整的年份号码
YEAR:当前的年份拼出来
RR:年份中阿拉伯数字的最后2位
MM:2位数的月份
MONTH:当前的月份拼出来
MON:月份的前3个字母
DY:用3个字母来表示当前的星期数
DAY:当前星期数的全拼
DD:数字的月份日期值
HH24:二十四进制的小时数
MM:分钟数
SS:秒数
数字的显示格式
9 :代表一个数字
L:强制显示一个当地的货币符号
0:强迫0显示
.:显示一个小数点
$:显示美元符号
,:显示一个千位分隔符号
to_number函数
to_date函数
decode函数
decode(exp,sl,r1,s2,r2....sn,rn)可以理解成增强型的if else
greatest(n1,n2,n3,...n)返回序列中最大的值
least(n1,n2,n3,...n)返回序列中最小的值
nullif(c1,c2)如果两个指定的表达式相等,则返回空值。
nvl(c1,c2)如果c1为NULL,则NVL函数返回c2的值,否则返回c1的值。
注意事项:c1和c2必须为同一数据类型,除非显示的使用TO_CHAR函数。
nvl2(c1,c2,c3)如果参数表达式c1值为NULL,则NVL2()函数返回参数表达式c3的值;如果参数表达式c1值不为NULL,则NVL2()函数返回参数表达式c2的值。
通用函数
37、select nvl(null,0) from dual; 如果为null,则用0代替
38、select decode(1,1,'内容是1',2,'内容是2',3,'内容是3') from dual; 类似于 switch...case...
事务处理
39、commit; 提交事务
40、rollback; 回滚事务
41、select rownum from table; 在没一列前面显示行号
42、drop table 表名 cascade constraint
on delete casecade 当父表中的内容被删除后,子表中的内容也被删除
43、desc表名 显示表的结构
44、create user [username] identified by [password] 创建新的用户
45、grant 权限1、权限2...to 用户 给创建用户权限
ex:grant create session to [username] 此时只能连接到数据库
grant connect,resource to [username] 此时权限能满足要求
46、alter user [username] identified by [password] 修改用户密码
47、alter user [username] password expired 下次登录时提示修改密码
48、alter user [username] account lock 锁住用户
49、alter user [username] account unlock 解锁锁用户
50、grant select,delete on scott.emp to [username] 把scott下emp表的两个权限给用户
51、revoke select ,delete on scott.emo from [username] 回收权限
定量谓词
some、any、all
in 不如 exists 不如 连接查询
概念
子查询(标量子查询、比较子查询、相关子查询、嵌套子查询)
集合操作(union、union all、intersect、minus)
注意
对于blob、clob、bfile、varry或嵌套表类型的列,不能使用集合操作符
对于long类型的列,不能使用集合操作符union、intersect、minus
多表连接
基本连接(多个表之间用逗号隔开)
交叉连接(cross join)实际就是一个 inner join on true
自连接(对同一个表进行多次的引用)
自然连接 natural join
条件连接(有on条件)主要有内连接、外连接(左外、右外)、全外连接
层次化查询
select [level],exp......
from table_name
[where 条件]
[start with 开始条件]
[connect by prior 连接的条件]