前言
1. 关系数据库理论:
<1> 数据库由一系列对象组成
<2> 通过一系列操作作用于这些对象
<3> 为了保证数据的完整性,插入数据库的数据必须要遵循一定得规则(数据约束)
2. sql命令:
<1>data retrieval 数据获取语言 :select
<2>DML 数据操纵语言 insert , update ,delete
<3>DDL 数据定义语言 create ,alter ,drop , renamed ,truncate
<4>事务控制: commit ,rollback ,savePoint
<5>数据控制: grant ,revoke
------------------------------------------------------------------------------------------
1 . select
select id "ID" from test; 别名要用双引号
双引号的使用位置:
1 .别名
2.日期处理时,将某一字符串原样输出
2. ||
数据连接: 用|| 将两个数据
select 'stuId:'||id from test;
3. NVL 空值置换函数:
NVL函数可把NULL转换成其它类型的符号
编程技巧: NVL函数在多条件模糊查询的时候比较有用
NVL函数可返回多种数据类型:
返回日期 NVL(start_date,'2002-02-01')
返回字符串 NVL(title,'no title')
返回数字 NVL(salary,1000)
select salary*nvl(salary,0) from emp;(表示: 如果salary为空,则,salary=0)
注意: 在查询操作时,只要有一列为空则整个列都为空,所以必须使用空值置换函数进行处理
4 .Oracle基本数据类型:
<1> 数字:number(n,m)
1 number 当精度省略不写时表示一个很大的数
2. number(3,2)表示长度为3,其中小数点后为两位
例:number(5,2) 2010.3256-->(先比较刻度)2010.33(四舍五入)-->(再比较精度)超出长度放不下
number(3,-1) 2009 -->(先比较刻度)201.0(四舍五入)(负数表示左移)-->(再比较精度)2010(共四位正好放下)(总长度为4=3+1)
<2> 字符串 :
1.定长: char(n) 如果n不写默认长度为1个字节(长度时固定的)
2.变长: varchar(n),varchar2(n)(oracle特定类型) 其中n必须写(在限制长度内,长度是多少,实际存储长度就是多少)
<3>date日期类型世纪,分,时,秒,年,月,日
4 oracle 的客户端软件(sql*plus)命令使用:
1. save 文件名 : 表示保存当前sql语句到服务区制定的文件中
2. get 文件名: 表示读取制定文件中sql语句到内存buffer中
3. start,@ 文件名 :表示读取制定文件中sql语句到内存buffer中,并且执行读取到的sql语句
4. spool录屏命令: spool 开始录屏 ,spool off 关闭录屏
5. a[ppend] 追加内容到buffer当中
6. c[hange] 改变某行的内容 例如: c/ss//tt 表示将某行的ss替换为tt(直接替换某行行号 空格隔开+内容)
7. c[lear] buff[er] :表示清楚内存buffer当中的内容
8. del n 表示删除buffer 当中的第n行
9. i[nput] 内容: 表示追加内容到buffer最后一行的后面
10. l[ist] n 表示查看buffer中某行的命令(不加n 表示全部查看)
11. / 表示执行当前buffer 中的命令
12 .col[umn] 列名 for[mat] hea[ding] jus[tify]
1. for: 表示格式 使用时为:
例: column name for a10; 表示将所有的只要是匹配name的列设为长度为10
2. jus :取值(left,right,center) 表示对齐方式
例:column name jus left;
3. hea : 表示设置显示标头
例: column name hea 'NAME' :类似于设置别名
13. SQL> disc table; 显示表结构
SQL> select * from tab; 查看用户下所有的表
SQL> set pause on; 可以使大量结果集在用户按“Enter”(回车)后翻页
SQL> set page size 100; 设定SQL语句返回结果集一页的行数100, 默认值是14
SQL> set linesize 100; 设定SQL语句返回结果集一行的宽度100, 默认值是80
-----------------------------------------------------------------------------------------------
5 order by :排序语句 在查询之后
1. order by 后面可以加的类型:
| a. 列名
order by+| b. 列号
| c. 别名
| d. 表达式
2. order by 后面 可以加上 多个列 :
当有多个列时先按第一个排序,如果第一个能够区分出大小,就不会再按第二种排序
例:1.select* from t_salary order by salary,name:
表示先salary排序,拍完后salary相同的再按nane排序
6.wherer(筛选结果集:)
a: 比较操作:
1. in 表示某几个取值范围
2. between .. and .. 表示在某个连续的范围
3. like 模糊匹配
1. % : 表示任意 多个 字符
2. - : 表示任意 一个 字符
例: select *from test where name like 'a%';
注:当名字中含有% 或- 时就要就行转义: oracle中任意一个字符都可以代表转义字符;
例:select *from test where name like 'a\-%' escape '\';
4. not null
b:逻辑操作
1. and or not
注:优先级: sql比较操作>and>or
当进行条件限制时为按比较级从上到下就近组合,特别组合时要加()进行条件限制
--------------------------------------------------------------------------
7.单行函数:
1. lower(str) :将字符串输设为小写 例: select lower('name') from dual;
2. upper(str): 将字符串输设为大写
3. initcap(str):将字符串输首字母设为da写,其余小写
4. concat('good', 'str')---->输出为: goodstr; 字符串连接
5. substr('string',1,3)表示从第一个开始,截取3个字符
6. lengtn('string') 求string的changdu
7. 1. round 四舍五入
2. trunc 舍去小数
3. mod 取余
8. 日期处理:
1. month_between :两个日期相差多少个月
2. add_months : 添加一个月
3. next_day :离给定日期最近的下一个日期几
4. round 过半则加一
5. trunc 直接舍去
6. to_char: 转化为字符串 to_char(date,'fmt'):(当前日期为2010.01.24,星期天)
yyyy:年 例:select to_char(sysydate,'yyyy') from dual; -------> 2010
mm:月 例:select to_char(sysydate,'mm') from dual; -------> 01
fm:去掉前导零:select to_char(sysydate,'fmmm') from dual; -------> 1
d: 星期的第几天:select to_char(sysydate,'fmd') from dual; -------> 1
dd:本月第几天: select to_char(sysydate,'dd') from dual; -------> 24
ddd:本年第几天:select to_char(sysydate,'dd') from dual; -------> 124
year:哪一年(英文格式):select to_char(sysydate,'year') from dual; -------> twenty-ten
month那一月(系统格式):select to_char(sysydate,'month') from dual; -------> 一月
ddsp:英文基数表示本月第几天select to_char(sysydate,'ddsp') from dual; -------> twenty-four
ddspth英文序数表示本月第几天select to_char(sysydate,'ddsp') from dual; -------> twenty-fourth
day:给定日期是星期几select to_char(sysydate,'day') from dual; -------> 星期天
dy:给定日期是星期几(英文前三个字符或中文全名)select to_char(sysydate,'day') from dual; -------> 星期天
7. to_number: 转化问数字 select to_number('1234');----->1234
8. to_date: select to_date('2010,01,24','yyyy:mm:dd');注:前面用什么隔开后面就用什么隔开(,)
9.
-------------------------------------------------------------------
8. :多表联合查询
1.等连接(equijoin):
例:
select * from table1,table2
from table1,table2
where table1.column1=table2.column1;
2.非等连接(non-equijoin):
<1>between..and..
例:
select * from table1
from table1
where id between 1 and 5;
<2>同上:in,like
3. 外连接:
<右连接>
select * from table1,table2
from table1,table2
where table1.column1(+)=table2.column1; 注意:右连接,+ 加在左边
例:
t_stu
-------------------------
id name stu_id stu_name dept_id dept_name
1 sw --------------------------------------
2 tom 1 sw 1 aa
kate (右连接)查询后 2 tom 2 bb
--------------> 3
t_dept -------------->
-------------------------
id name
1 aa
2 bb
3
select * from table1,table2
from table1,table2
where table1.column1=table2.column1(+); 注意:左连接,+ 加在右边
t_stu
-------------------------
id name id stu_name dept_name
1 sw -----------------------------
2 tom 1 sw aa
kate (左连接)查询后 2 tom bb
--------------> kate
t_dept -------------->
-------------------------
id name
1 aa
2 bb
3
标准sql中:
左连接:
select * from table1,table2
from table1 left [out] join table2
on table1.column1=table2.column1;
右连接:
select * from table1,table2
from table1 right [out] join table2
on table1.column1=table2.column1;
4.自连接:
select a.id ,b.id
from stu a,stu b
where a.dept_id=b.id;
连接技巧:
连接N个表, 需要N-1个连接操作
被连接的表最好建一个单字符的别名, 字段名前加上这个单字符的别名
BETWEEN .. AND.. 比用 >= AND <= 要好
连接操作的字段名上最好要有索引
连接操作的字段最好用整数数字类型
有外连接时, 不能用OR或IN的比较操作
9. 组函数: 是否可以使用组函数(只要是在查询结果之后的都可以) 执行顺序
having 可以 3
group by 不可以 2
order by 可以 4
where 不可以 1
注:只要查询语句使用了组函数,没有出现组函数的列必须出现在group by 语句中
10 .子查询:
1. 外围语句:
select insert create
2. 出现位置
where having from
11. oracle特别语法:
1. rownum:伪列(只能从1开始)
2. rowid 标记某列数据的唯一地址(永不重复)
3. & 用法: 表示设置某个运行时变量
insert into table stu values(&id,'&name');
注意事项:
一次最多只能获取9个&变量, 变量名称只能是从&1,&2到&9
变量名后不要加特殊的结束符号
如果在SQL*PLUS里要把&符号保存在ORACLE数据库里,要修改sql*plus环境变量define
SQL> set define off;
----------------------------------------------------------------------
12 .DDL :数据定义:
五种约束:
1. 主键 (pk)唯一且不重复
1.代理主键
2.自然主键
注:当有多个主键列时,多个主键作为联合主键,联合唯一,单列非空
2. 外键(fk)
注:外键列可以为空,不为空时则为与其对应的列值
当有多个外键列时作为联合主键(联合相对于一个表中的几个列来说,当外键列不是同一张表时不能作为联合外键)
3. 非空
not null
4. 唯一
注:取值不能重复,当加在多个列时称作联合为一
5. 自定义 (ckeck)
插入的数据必须满足用户需求,自定的规则
13. 关系模型:
#* :代表主键约束
* :代表非空约束
(#)*:代表唯一非空约束
o :没有任何约束
->---------: 表示额外的增加一个外键列,并且,时多对一关系
->-|--------:表示外键列要同时作为联合主键
------ : 虚线表示可以为空
- 实线可以表示:必须有值
14.概述数据模型和数据库设计
1. 系统开发的阶段
Strategy and Analysis
Design
Build and Document
Transition
Production
2. 数据模型
Model of system in client's mind
Entity model of client's model
Table model of entity model
Tables on disk
3. 实体关系模型 (ERM)概念
ERM ( entity relationship modeling)
实体 存有特定信息的目标和事件 例如: 客户,订单等
属性 描述实体的属性 例如: 姓名,电话号码等
关系 两个实体间的关系 例如:订单和产品等
实体关系模型图表里的约定
Dashed line (虚线) 可选参数 “may be”
Solid line (实线) 必选参数 “must be”
Crow's foot (多线) 程度参数 “one or more”
Single line (单线) 程度参数 “one and only one”
4. 实体关系模型例子
每个订单都必须有一个或几个客户
每个客户可能是一个或几个订单的申请者
5. 实体关系的类型
1:1 一对一 例如: 的士和司机
M:1 多对一 例如: 乘客和飞机
1:M 一对多 例如: 员工和技能
6. 校正实体关系的原则
属性是单一值的, 不会有重复
属性必须依存于实体, 要有唯一标记
没有非唯一属性依赖于另一个非唯一的属性
7. 定义结构时的注意事项
减少数据冗余
减少完整性约束产生的问题
确认省略的实体,关系和属性
8. 完整性约束的要求
Primary key 主关键字 唯一非NULL
Foreign key 外键 依赖于另一个Primary key,可能为NULL
Column 字段名 符合定义的类型和长度
Constraint 约束条件 用户自定义的约束条件,要符合工作流要求
例如: 一个销售人员的提成不能超过它的基本工资
Candidate key 候选主关键字 多个字段名可组成候选主关键字, 其组合是唯一和非NULL的
9. 把实体关系图映射到关系数据库对象的方法
把简单实体映射到数据库里的表
把属性映射到数据库里的表的字段, 标明类型和注释
把唯一标记映射到数据库里的唯一关键字
把实体间的关系映射到数据库里的外键
其它的考虑:
设计索引,使查询更快
建立视图,使信息有不同的呈现面, 减少复杂的SQL语句
计划存储空间的分配
重新定义完整性约束条件
10. 实体关系图里符号的含义
PK 唯一关键字的字段
FK 外键的字段
FK1,FK2 同一个表的两个不同的外键
FK1,FK1 两个字段共同组成一个外键
NN 非null字段
U 唯一字段
U1,U1 两个字段共同组成一个唯一字段
---------------------------------------------------------------
14. table 操作:
创建表时的命名规则和注意事项
表名和字段名的命名规则:必须以字母开头,可以含符号A-Z,a-z,0-9,_,$,#
大小写不区分
不用SQL里的保留字, 一定要用时可用双引号把字符串括起来.
用和实体或属性相关的英文符号长度有一定的限制
注意事项:
建表时可以用中文的字段名, 但最好还是用英文的字段名
创建表时要把较小的不为空的字段放在前面, 可能为空的字段放在后面
建表时如果有唯一关键字或者唯一的约束条件,建表时自动建了索引
一个表的最多字段个数也是有限制的,254个.
-------------------------------
用子查询建表的注意事项
可以关连多个表及用集合函数生成新表,注意选择出来的字段必须有合法的字段名称,且不能重复。
用子查询方式建立的表,只有非空NOT NULL的约束条件能继承过来, 其它的约束条件和默认值都没有继承过来.根据需
要,可以用alter table add constraint ……再建立其它的约束条件,如primary key等.
----------------------------------
在创建Foreign Key时可以加可选参数:
ON DELETE CASCADE它的含义是如果删除外键主表里的内容,子表里相关的内容将一起被删除.
如果没有ON DELETE CASCADE参数,子表里有内容,父表里的主关键字记录不能被删除掉.
------------------------------------
ORACLE里的数据字典
1. 什么是数据字典?
ORACLE的数据字典是数据库的重要组成部分之一,它随着数据库的产生而产生, 随着数据库的变化而变化, 体现为
sys用户下所有的一些表和视图.
2. 数据字典里存的内容:
用户信息
用户的权限信息
所有数据对象信息表的约束条件统计分析数据库的视图等
不能手工修改数据字典里的信息.
3. 常用的数据字典
Dictionary 存放所有数据表,视图,同义词名称和解释
Dict_columns 数据字典里字段名称的和解释
Dba_users 用户 Dba_tablespaces 表空间
Dba_data_files 数据库的文件 Dba_free_space 空闲表空间
Dba_rollback_segs 回滚段
User_objects 数据对象 User_constraints 约束条件
User_sequences 序列号 User_views 视图
User_indexes 索引 User_synonyms 同义词
Session_roles 用户的角色 User_role_privs 用户的角色权限
User_sys_privs 用户的系统权限 User_tab_privs 用户的表级权限
V$session 实时用户情况 V$sysstat 实时系统统计
V$sesstat 实时用户统计 V$sgastat 实时SGA使用
V$locked_object 实时锁 V$controlfile 控制文件
V$logfile 日志文件 V$parameter 参数文件
4. 数据字典的分类
数据字典四大类别
User_ 用户下所有数据库对象
All_ 用户权限范围内所有的数据库对象
Dba_ 所有的数据库对象
V$Content$nbsp; 统计分析数据库的视图 赋于oem_monitor权限非DBA用户也可查询V$*视图
5. 查询数据字典
SQL> select * from dictionary where instr(comments,'index')>0;
SQL> select constraint_name, constraint_type,
2 search_condition, r_constraint_name
3 from user_constraints
4 where table_name = ‘&table_name';
---------------------------------------------
1.create table:
create table [那个数据库.]tableName
column datatype [default value] column_constraint(列级别约束)
......
table_constraint(表级别约束)
约束:
a. 表级别
1. 联合主键,
例: create table t3(
id number ,
name varchar2(10),
constraint table_u_pk primary key(id,name)
);
2. 联合外键,
例: create table t6(
id number not null,
name varchar2(10) not null ,
constraint table_u_fk foreign key(id,name) references t(id,name) on delete cascade 外键列要:联合为一
);
3. 联合为一,
例: create table t(
id number(2) ,
name varchar2(10),
constraint t_id_name_uu unique(id,name)
);
4.check(自定义)
例: create table t7(
id number(2) ,
name varchar2(10),
constraint t_id_ck check(id>5)
);
b. 列级别
1. not null
2. unique
例: create table t2(
id number
constraint t1_id_uu unique 同时加多个列时中间没有分隔符
constraint t1_id_nn not null
);
3. primary key
例: create table t1(
id number
constraint t1_id_pk primary key
);
4. foreign key
例: create table t4(
id number
constraint t1_id_fk primary key,
stu_id number references t1(id) on delete cascade
);
-------------
2.更新表内容:
a.插入数据(insert into):
insert into table_name(column1,column2) values(
values,values);
例:
insert into t7(id,name) values(1,'sw');
b. update 数据:
例:
update t1
set id = 2
where id = 1;
SQL> UPDATE 表名 SET 字段名1=值1, 字段名2=值2, …… WHERE 条件;
如果修改的值N没有赋值或定义时, 将把原来的记录内容清为NULL,
最好在修改前进行非空校验;
值N超过定义的长度会出错, 最好在插入前进行长度校验.
新功能,可以修改子查询后的结果集
例子:SQL> update (select * from s_dept) set id=50 where id=60;
c delete 数据:
例:
delete from t1
where id = 2;
d .truncate table 清空表
truncate table t1 cascade;
DML操作的注意事项
以上SQL语句对表都加上了行级锁, 确认完成后, 必须加上事物处理结束的命令COMMIT 才能正式生效,
否则改变不一定写入数据库里.行级锁也未能得到释放. 如果想撤回这些操作, 可以用命令 ROLLBACK 复原.
在运行INSERT, DELETE 和 UPDATE 语句前最好估算一下可能操作的记录范围, 应该把它限定在较小 (一万
条记录) 范围内,. 否则ORACLE处理这个事物用到很大的回退段. 程序响应慢甚至失去响应. 如果记录数上十万
以上这些操作, 可以把这些SQL语句分段分次完成, 其间加上COMMIT 确认事物处理. 太过频繁的commit不好
--------------
3. 修改表结构:
1. 改变表的几种情况(1) 运行时会加表级锁
改变表的名称
SQL> RENAME 表名1 TO 表名2; SQL> ALTER TABLE 表名1 RENAME TO 表名2;
在表的后面增加一个字段
SQL> ALTER TABLE 表名 ADD 字段名 字段名描述 [ DEFAULT expr ][ NOT NULL ][ ,字段名2 ……];
修改表里字段的定义描述
SQL> ALTER TABLE 表名 MODIFY 字段名1 字段名1描述 [ DEFAULT expr ][ NOT NULL ][ ,字段名2 ……];
记录为空时,可以减少字段长度,改变字段类型修改DEFAULT值只作用于修改后的INSERT和UPDATE的
记录修改NOT NULL约束只对现存含非空记录的字段起作用
2. 改变表的几种情况(2) 运行时会加表级锁
删除表里的某个字段
SQL> ALTER TABLE 表名 DROP 字段名;
给表里的字段加上/禁止/启用约束条件
SQL> ALTER TABLE 表名 ADD | DISABLE | ENABLE CONSTRAINT 约束名 PRIMARY KEY (字段名1[,字段
名2 ……]);
SQL> ALTER TABLE 表名 ADD | DISABLE | ENABLE CONSTRAINT 约束名 UNIQUE (字段名1[,字段名2 …
…]);
加唯一关键字或者唯一约束条件时自动建立索引
说明:禁止唯一关键字和唯一约束时索引仍然存在,可以被使用.
3. 改变表的几种情况(3) 运行时会加表级锁
删除表里的约束条件
SQL> ALTER TABLE 表名 DROP CONSTRAINTS 约束名 [CASCADE];
会把约束相关的索引一起删除. CASCADE能同时删去外键的约束条件.
把表放在或取出数据库的内存区
SQL> ALTER TABLE 表名 CACHE;
SQL> ALTER TABLE 表名 NOCACHE;
改变表存储的表空间
SQL> ALTER TABLE 表名 MOVE TABLESPACE 表空间名 ;
注意: 如果被转移表空间的表含有索引, 表转移后索引变得不可用.
我们要删除旧索引,建立新索引
a. 重命名表:
例: rename t7 to t8;
b. 重命名列
alter table t1
rename column id to t_id;
c. 重命名约束
alter table t1
rename constraint t1_id_pk to t1_id_s_pk;
d. 删除表
drop table t2 [cascade constraints];
e. 删除列
alter table t1
drop column name;
f. 删除约束
alter table t1
drop constraint t1_id_s_pk;
g.增加列
alter table t1
add( name varchar2(10));
h. 增加约束(全是表级别)
alter table t8
add constraint t8_name_fk foreign key(id) references t1(t_id);
i. 修改列
alter table t1
modify( id number(5));
j. 失约束失效
alter table t8
disable constraint t8_name_fk cascade;
k. 失约束生效
alter table t8
enable constraint t8_name_fk ;
------------------------------------------------------------------------------------------
15 事务操作
1. 事务的四大特性:
1. 原子性 :事务要么同时成功,要么同时失败
2. 一致性:事务前后数据要保持一致
3. 隔离性:多个事务同时进行中,相互不可见
4. 持久性:一个事务结束后,要将数据持久保存到数据库
2.事务的边界:
开始:
a. 开始连接到数据库就意味着一个事务的开始
b. 上一个事务的结束就意味着下一个事务ideas开始
结束:
a. 手动去提交 commit
b. 执行roolback;
c. 执行非 DDL语句等能够自动提交事务的操作
3.设置回滚点
savePoint a;
回滚:
rollback to a;
4. 执行dml语句出错时,仅仅回滚到出错位置
---------------------------------------------------------------------------
16. 数据库用户权限控制:
1. 对象权限:
a. 系统权限: 用户直接对数据库的进行访问的权限 grant privs/roos to user/rols
b. 对象权限 用户对其他的数据库的对象(如视图,表格)进行访问的权限 grant privs/roos on object_name(table ....) to user/rols
2. 角色:(由一系列权限组成的)
a. 预定义角色
b. 自定义角色
3.授权:
grant privs/roos to user/rols
grant privs/roos on object_name(table ....) to user/rols
4.回收:
revoke privs/roos from user/rols
revoke privs/roos on object_name(table ....) from user/rols
-------------------------------------------------------------------------------
17 .索引:
1.索引的概念
索引是数据库里的一种数据对象;它利用B*树, hash, bitmap结构直接快速地访问数据;它和表是分开存放的两个
实体;索引创建好了后, 由系统自动调用和管理.
2. 什么时候创建索引?
自动创建的索引: 唯一关键字, 唯一的约束条件
手工需要创建的索引: 大表查询时, sql语句where后经常用到的字段或字段组合
字段内容差别很大有大量NULL值表很大, 返回记录数较少
3. B*树索引的结构
每个索引由字段值和指针或ROWID组成
4.创建索引的语法
CREATE INDEX 索引名 ON 表名 ( 字段1, [字段2, ……] ) TABLESPACE 表空间名;
5.创建索引的注意事项
创建索引时会加行级独占锁
一个表的索引最好不要超过三个 (特殊的大表除外)
最好用单字段索引
索引最好和表分不同的表空间存放
结合SQL语句的分析执行情况, 也可以建立多字段的组合索引和基于函数的索引
大表的索引会占用很大的存储空间
不要建唯一的索引, 而应该加唯一的约束条件
6.查询索引的方法
查询数据字典user_indexes和user_ind_columns
例子:
SQL> SELECT ic.index_name, ic.column_name,
2 ic.column_position col_pos,ix.uniqueness
3 FROM user_indexes ix, user_ind_columns ic
4 WHERE ic.index_name = ix.index_name
5 AND ic.table_name = 'S_EMP';
注意: 数据字典里存放的字符都是大写的.
7. 不用索引的地方
表很小
where后不经常使用的比较字段
表被频繁修改
返回记录数很多
where后含IS NULL /IS NOT NULL/ like ‘%输入符%’等条件
8. 重建索引的语法
ALTER INDEX 索引名 REBUILD TABLESPACE 原来表空间名 NOLOGGING;
定期重建索引可以减少索引的碎片, 更有效地使用表空间.
9. 删除索引
SQL> drop index 索引名;
SQL> alter table 表名 drop constraint 约束名;
1. create 索引
create index t_inx
on table (column..);
例:
create index t_id_inx
on t5 (id);
2. drop index
例:drop t_id_inx;
=--------------------------------------------
18. 视图:
1. 什么叫视图?
视图也是一种对象,能进行DML操作,但是并没与表结构,仅仅是一条sql语句(虚表)
2. 视图的分类:
表的数量 是否有函数 group by 能否执行DML
-- -----------------------------------------------
1. 简单视图 1 没有 没有 能
2. 复杂视图 至少一张 有 有 不能
3. 用子查询创建视图时若含有组函数,则子查询语句必须加别名
例:create or replace view dept_view
as select dept_no, sum(salary) total_sal, count(*) count
from emp group by dept_no;
4 .视图的概念和优点
视图是基于一个或多个表及视图的一些查询语句, 它象显示数据的视窗, 它本身是不存储数据的.
视图可以限制数据库的访问, 更好的控制权限;使用户使用简单的查询语句;数据的非依赖性;
同一数据的不同表现形式
可以简化查询
在视图上可以用DML命令吗?
可以, 但有一定的限制条件
没有下面的情况, 可以删除view里的记录. group function, group by, distinct
没有上面和下面的情况, 可以修改view里的记录. 字段表达式,
例如: salary*12 含rownum的view
没有上面两种情况, 且view里含基表里所有非空字段的情况, 可以往view里插入记录.
-------------------------------------------------------------------
19. 序列:(仅仅用在oracle)
序列是oracle中的一种特殊对象,能够产生一系列整数值,通常将其作为主键的生成方式,
数据库为了提高效率,往往会在缓存中一次性生成一定数量的
序列值,无论使用成功与否,序列都不会重新生成,会继续下一个.
create sequence name
increment by n 步长
start with n 开始值
maxvalue n | (nomaxvalue) 最大值
minvalue n | (nominvalue) 最小值
cycle | nocycle 是否循环(默认不循环)
cache | nocache 缓存大小(默认缓存20个)
使用:
id.nextval 下一个值
id.currval 当前值
修改序列(不能修改起始值)
create sequence name
increment by n 步长
maxvalue n | (nomaxvalue) 最大值
minvalue n | (nominvalue) 最小值
cycle | nocycle 是否循环(默认不循环)
cache | nocache 缓存大小(默认缓存20个)
不能用序列号的nextval和currval的地方
视图的查询
有distinct的查询
有group by,having,order by的查询
有子查询的查询
表里的缺省值
--------------------------------------------------------------------
20 ,授权
1.常用的角色及其权限
CONNECT 8 privs 连上Oracle,做最基本操作
RESOURCE 8 privs 具有程序开发最的权限
DBA 114 privs 数据库管理员所有权限
EXP_FULL_DATABASE 5 privs 数据库整个备份输出的权限
IMP_FULL_DATABASE 64 privs 数据库整个备份输入的权限
查看角色明细的系统权限
SQL> select * from role_sys_privs;
2.角色的概念和管理
角色是命名多个相关权限的组合. 能把它赋于其它的用户或角色我们能创建角色, 使权限管理更容易一些.
21.补充:(rownum rowid)
(1)在oralce上的分页需要用到伪列.(sql级别的分页)
只所以这么做,是因为oralce不支持rownum比较;比如说找出第三行纪录,那就是:
select last_name, salary
from (select rownum a, b.*
from s_emp b)
where a=3
如果找出第10行到第20行的数据的话,那就必须用到
select last_name, salary
from (select rownum a, b.*
from s_emp b)
where a > 10 and a < 2;
这是sql级别的分页,优点是速度快,缺点是可移植性差;
23.数据库设计的关键因素
性能:**表的设计(与class一一对应,尽量避免数据的冗余) **数据量的确定(算法) 操作的确定(操作的方法适当的确定查
找概率比较高的列的索引)
完整性 用户自定义完整性
和其他系统的融合
文档和沟通
可扩展性
避免重复发明轮子 不要造成冗余(主要体现在表)
****************************************************************************************
实体关系模型的好处
和人们思想的概念交互
能高效的收集并且文档化一个公司组织的信息需求
提供一个容易理解的系统图解
清晰的定义了信息的范围
**从动态的商业操作中分隔了信息需求
实体:明确需求信息的事物(表)
属性:用于描述或形容一个实体
关系:两个实体之间的联系
虚线:可有可无
实线:必须
#:唯一 以后可能表示为主键
*:非空
范式
设计关系数据库时要满足的要求.
第一范式:所有属性值必须是单个值;(没有表中表)
第二范式:所有属性值必须依赖于整个实体的UID,和主键的依赖关系
1.值可以是字面值,表达式或sql函数等
2.如果选择另一个列名作为默认值,则为非法默认值
3.默认值的类型必须和列的数据类型匹配
限制规则
系统依赖Sys_Cn格式命名一个约束或者自己命名约束
驼峰式:studentName
foreign key:创建外键约束
references:与其他表建立联系
**on delete cascade:级联操作
creat table(A number check(0,100)
服务器使用者的用户名
用户的权限
数据对象的名
表的约束
校验信息
User:通常显示执行查询的帐户所拥有的对象的信息
ALL:包含了USER的记录以及其权限已经授予PUBLIC或用户的对象的信息
DBA:包含所有的数据库对象
向表中插入或更新记录是否成功受限于创建表时所定义的约束.
因此在前台应用程序做类似操作的时候要注意跟踪操作是否成功的反馈信息.
在下列环境下发生自动提交
一个DDL命令 如创建
一个DCL命令 如授权
没有显示使用COMMIT或ROLLBACK从SQL*PLUS非正常的退出
系统失败或非正常的终止SQL*PLUS,将会自己回滚.
Commit之后数据的状态
数据的改变写入数据库
先前的数据丢失了
所有的用户能查看结果
作用于表行上的锁丢失了,那些先前被锁住的行对于其他用户而言就可以进行操作了
所有的savapoint丢失
增加一个数值类型列的精度或宽度
如表没有行或包含空值可以缩小列的宽度
为新增行增加默认值
假设现在列中不存在空值允许定义not null约束。
数据类型和默认值
列值为空允许改变列的类型
改变默认值会影响到子查询插入到列表中,有可能引发查询结果不正确
添加not null约束的时候,是否添加成功和表的原始记录情况有关。
设置唯一约束或主键约束有效的时候,唯一或主键的索引将被自动创建,目的是为了提高查询效率。
drop
表中所有数据都被删除
所有的提交发生
所有的索引被删除
级联约束的所有层次被删除
不能回滚
id varchar(30) 注册时间-使用频率-流水号
序列
自动产生的唯一数值
是一个共享的对象
通常用于创建主键值
**取代应用程序代码
当在内存中高速缓存时可以提高访问序列值的效率
nextval返回下一个可用序列的值
currval获得当前序列的值
1.在创建序列的时候建议选择在缓存中存放适当数量的数,以提高访问速度.
2.回滚,系统崩溃,在另外一张表中使用该序列时候,将使序列的值空白.因此建议序列同一时间段内只为一张表提供服务.
修改序列的规则:
必须拥有修改序列的权限
仅仅对未来的序列数字有影响,对已经产生的无效(如果要对以前数据也做修改,就必须整批的更新数据)
将执行校验
序列必须被删除或重新创建之后从一个不同的数次再次启动
start with必须在重新创建序列之后才能达到修改的目的
视图:表中数据的逻辑显示,也就是相同的数据的多种显示方式.有效的避免了数据的冗余.又达到了实现多种显示要求的目
的.
限定对数据库的访问.有时仅给用户提供view进行操作,而不让用户接触具体的表,从而保护了数据.
OOAD class的层次
E-R图
(1)高内聚,低偶合 (2)尽量避免数据的冗余 (3)表(描述一个完整的事物,可以在应用程序中做成最小单位的复杂的数据类
型)越小越好
(4)设计具体的表(数据类型,约束)确定表和表之间的关系(一定要和业务逻辑一一对应)
(5)根据业务逻辑确定对表的各种操作,如果涉及需要处理的数据量很大,请考虑检索的算法.(可以建立索引等数据库对象帮
助提高效率)
Devil即使数据量不大,但涉及查询的操作复杂而频繁,将考虑建立各种view来简化查询.
如果涉及的各种操作模式固定,但十分繁琐(步骤较多),将考虑建立存储过程解决.
(7)在开发中,如果对数据的过滤,或是产生唯一值等操作可以通过某些数据库对象解决或通过对表的限制解决,那么尽量在
数据库管理层解决,避免前台的代码冗余.
索引的概念:索引就是加快检索表中数据的方法.
数据库的索引类似于书籍的索引.在书籍中,索引允许用户不必翻阅完整个书就能迅速的找到所需要的信息.在数据库中,索
引也允许数据库程序迅速地找到表中的数据,而不必扫描整个数据库.
**在9i服务器中通过使用指针提高获取行的速度
使用快速的路径访问方式快速定位数据以减少磁盘的输入输出
依靠表本身的索引,手动创建索引满足查询要求
成本: cpu 内存 时间
索引创建的情况:
*1.在where子句或连接条件中使用频繁的列
*2.列的取值范围较大
3.列包含非常多的null值
*4.表比较庞大,大部分的查询通过2%-4%的行进行检索
5.索引不是总能够提高查询速度
以下情况不需要创建索引:
1.表比较小
2.在查询中某列不经常使用
3.大部分查询依赖于超过2-4%的行的检索
4.表格更新频繁
Connect:提供了登录和执行基本函数的能力,可以连接数据库以及在这些表中对数据进行查询,插入,修改及删除
Resource:建立对象的能力
DBA:拥有所有的系统权限
oracle基础
发表回复