数据库的总结

1sys  /  system的区别:

System是数据库内置的普通管理员,手动创建任何用户在被授予dba角色后与system这个用户差 不多。而sys是数据库超级用户,数据库的很多重要东西(字典、内置包、静态数据字典视图等)都属于这个用户,该用户只能以sysdba的身份登录。任何用户以as sysdba登录时都是sys,通过命令show user可查看得知。

2数据库:存储在磁盘上的文件,这些文件中保存的数据有一定的物理结构和逻辑结构。

数据库名:数据库的名称表示,该叫法一般用于单机。

全局数据库名:由数据库名称”+ “域名组成,是数据库处于网络中的名称标示。

“orcl.localhost”,其中数据库名称设定于DB_NAME,域名设定于DB_DOMAIN。这两个   .     参数合并之后可在网络中唯一标识一个数据库。

SID = Oracle实例,是实例的唯一标识。用户访问数据库,实际上是向一个Oracle实例发送请求,  Oracle实例负责向数据库获取数据。

Oracle实例 = 内存结构+后台进程,所以Oracle实例是临时性的; 可以通过startup nomount去启动实例,但是注意这时Oracle数据库并没有启动,需要用open去启动数据库; 一个实例只能对应一个数据库,一个数据库可以用多个实例。

3)结构化查询语言(sqlstructured query language)分类:

1、数据操纵语言(DMLdata manipulation language):

insert   update   delete

2、数据定义语言(DDLdata defination language):

create  alter  drop  rename  truncate

3、数据控制语言(DCLdata control language):

grant  revoke

4、数据查询语言(DQLdata query language):

select

4)数据库三级模式(外模式、模式、内模式):

数据库领域公认的标准结构是三级模式结构,它包括外模式、模式和内模式,有效地组织、管理数据,提高了数据库的逻辑独立性和物理独立性用户级对应外模式概念级对应模式物理级对应内模式使不同级别的用户对数据库形成不同的视图。所谓视图,就是指观察、认识和理解数据的范围、角度和方法,是数据库在用户眼中"的反映,很显然,不同层次(级别)用户所看到的数据库是不相同的。

 

外模式:对应于用户级,是某几个用户能看到的数据库的数据视图,是从模式中导出的子集,包含模式中允许特定用户使用的那部分数据。通过DML来描述定义。

模式:对应于概念级,是对数据库中全部数据的逻辑结构、特征的总体描述,是所有用户的公共数据视图。由DDL语言来描述定义。

内模式: 称为存储模式,对应物理级,是 数据库全体数据的内部表述或底层描述,描述数据在物理介质上的存储方式和物理结构,对应着实际存储在外存储器上的数据库。

5sql窗口、命令窗口区别:

sql窗口只能执行sql语句。

而命令窗口可执行命令。如:desc emp;(查看表结构)

6)数据字典

数据库是数据的集合,数据库维护和管理这用户的数据,那么这些用户数据表都存在哪里,用户的信息是怎样的,存储这些用户的数据的路径在哪里,这些信息不属于用户的信息,却是数据库维护和管理用户数据的核心,这些信息就是数据库的数据字典来维护的,数据库的数据字典就汇集了这些数据库运行所需要的基础信息。

7sql建表规范化:

http://blog.csdn.net/liguihan88/article/details/3002403

方式一:

create table ctable_name

(

       field1 varchar2(20), --注释的内容1

       field2 number,       --注释的内容2

             field3 char(2),      --注释的内容3

             field4 date          /*注释的内容4*/ 

)

方式一的缺点:在表结构不复杂时使用,但是表复杂,阅读不方便。

方式二:

create table ctable_name

(

       field1 varchar2(20),

       field2 number,   

             field3 char(2),   

             field4 date  

)

comment on table ctable_name is '这里写表注释';

comment on column ctable_name.field1 is '这里写列注释';

select * from user_tab_comments whereTABLE_NAME = '这里写选择的表名';

--查询表的相应注释

select * from user_col_comments where TABLE_NAME = '这里写选择的表名';

--查询表中相应的列注释

8)列别名:

三种方式:(column对应的列,alias别名)

1/column alias

2/column ''alias''

3/column as alias

9)转义字符:escape

例子:select * from emp e where e.ename like '5_%%' escape '5';

--意思是搜索以'5_'开头的。

10SQL优化问题: (这个网址很好)

    http://blog.csdn.net/orclight/article/details/8634839

目前我能理解的3个:

1SQL语句用大写,因为oracle解析SQL语句时,是用大写进行解析的。

2oracle解析where子句采用从右到左,因此,能最大程度过滤数据的应放在子句尾部。

3、避免采用*oracle解析*是通过数据字典完成的。

11)拼接字段(||, +)

首选|| (mysql||表示or,一般用concat() )

12)并集、全集、交集、差集

union(并集):去掉重复的

union all(全集):包含重复的

intersect(交集)

minus(差集):属于前者,不属于后者

13)组函数

avg min max count sum

其中除了count,其他4个在数据处理时都跳过空值

而对于count,只有count(*) count(n数字)能处理空值,

count(e.comm)直接跳过空值。

例子:select count(a.comm) from (select e.comm from emp e) a;

avg/sum只适用于数字类型。

min/max适用于任意数据类型。

  例子:select count(distinct e.deptno) from emp e;

ps:组函数不能处理null的数据,需要通过nvl解决。

14)分组group by

例子:select e.deptno, min(e.sal)

from emp e

where e.sal>1000  --where是对行操作,应放于group by前面

group by e.deptno --分组

order by e.deptno; --排序(若没有,则隐式的采用降序(分组特有))

PS:如果分组中有null,则null会作为一个分组返回。

PS:group by.pdf中第五页很好的解释了这个:

select e.deptno, count(1)

from emp e

where e.sal >   --这里的where子句用于对行数据进行筛选(数据进入分组前)

any(select avg(sal) from emp group by deptno)

group by e.deptno

order by e.deptno;

PS:select e.* from emp e order by e.mgr asc nulls first;

15)视图(view)

也称虚表, 不占用物理空间,这个也是相对概念,因为视图本身的定义语句还是要存储在数据字典里的。视图叧有逻辑定义。每次使用的时候, 叧是重新执行SQL.

创建视图:

create (or replace) view v$_emp_dept (alias)

as

(select ....from....) with read only;(添加只读)

撤销视图:

drop view v$_emp_dept;

查找用户视图:

select * from user_views;

修改视图对应的基表数据时,如果对应的是多个基表,则一次只能修改对应一个基表的数据。

16)数据库:

行式存储:查找行数据很快,更易于维护。

列式存储:找一行数据要遍历全表,但是查找具体列速度很快。

17)关系型:(概念)指的是表之间的联系。

非关系型:更擅长大量数据的存储。(毕竟关系型貌似是按行查找)

18dual虚表的存在是为了实现SQL语法。

19DML  insert:::

两种方法:

方法一:insert into table_name [(????)] values(???);

方法二:insert into table_name [(????)] (子查询select ?? from ?????)

PS:用已有的表来创建新表:

create table table1 as select * from emp e where 1=2;

----->条件始终未false,因此只复制了表结构,未复制表数据。

insert into table1 select * from emp e where e.empno = 10;

create table table2 as select * from emp e where 1=1;

------>条件始终未true,因此不但复制了表结构,也复制表数据。

删除表数据:

delete from table_name [where ...]

truncate table_name;

http://blog.sina.com.cn/s/blog_6daab81101019ail.html

两者区别:

1truncatedelete只删表数据,不删表结构。truncate相当于删除表,然后根据表结构重新创建(表结构、列、约束、索引不变、序列所对应的计数值不变,如要保留计数值,用delete),相比起delete,产生的系统、事务日志少。

delete每删除一行数据,就会在事务日志上记录。而truncate通过释放表数据所用的数据页来删除数据,并且只在事务日志上记录页的释放。

2deletedml语句,会产生事务;而truncateddl语句,不产生事务。

3、存在外键约束的,不能使用truncate--由于日志中不记录,不能激活触发器。

4truncate不能用于参与视图索引的表。

20)事务

1、事务是一个不可分割的操作序列,要么都做,要么都不做。是数据库环境的逻辑工作单位。

2、其存在是为了保持数据库完整性。

3、事务不能嵌套。

4、在oracle中,没有事务开启的语句,事务通过DML语句开启。

5、当一个事务开启后,系统会对该用户正在进行修改并未commit/rollback的行数据添加行级锁,以保证在同一时间,只有一个用户能对该条数据进行dml操作。

事务结束与一下情况:

一、用户执行commit提交事务、rollback回滚事务。

二、执行DDL语句时自动提交。

三、用户正常断开连接时自动提交。

四、系统崩溃、断电时自动回滚事务。

断点:savepoint用来让事务回滚的一个中途临时点。用于将事务分成多个单元。

 --与  rollback to savepoint_name;对应。

事务的四个属性(ACID):

1、原子性(Atomicity):要么都提交,要么都回滚。

2、一致性(Consistency):保证底层数据的完整性。

3、隔离性(Isolation):加锁。事务的进程不受外界的影响。

4、持久性(Durability):在事务未提交、回滚前,相关数据存储在某个物理介质中,以保证这些操作在系统出错时不会丢失。

21sql语句里有个begin...end,暂不知道用法,不知道这个需不需要记?

22创建用户:create user username identified by password;

 

 

23)序列 Sequence

序列是oracle专有的,用于产生一个自动递增的数列。

select sequence_name from user_sequences;  查询序列

create sequence seq_name 1

increment by n   --每次增长多少

start with n   --以什么开始

maxvalue n   |   nomaxvalue    --循环/不循环

minvalue n    |   nominvalue

cycle

cache n; --分配并存入到内存中

这里有问题,关于start with 以及nextval的问题。

另外貌似周期的大小必须大于缓存的大小??

序列上的计数值是只存储在该序列中吗,对于应用到的表,表会不会对此有相应记录??

----->!!!!网上说能对自动增值字段做归零处理,但是实验为啥不行???

----->truncate确实对序列值不能做归零处理。

ppt(用户管理、序列)最后一页也有错误,先在dual中运行一次nextval,然后再插入数据,错的离谱。

========================================================

create sequence test

   increment by 1

   start with 1;

drop sequence test;

create table test1 (

   no number(4),

   name varchar2(10)

);

drop table test1;

delete from test1;

insert into test1 values(test.currval, '张三');

insert into test1 values (test.nextval, '张三');

select * from test1;

select test.nextval from dual;

------------------------------------------------

create sequence test

   increment by 1

   start with 1

   maxvalue 10

   cycle

   cache 10; //提示chache 值必须小于cycle

========================================================

24)建表

方法一:

例子:

create table test (

id number(可不填,默认38),

name varchar2(20) not null unique,

sex number(1) not null,

age number(3),

sdate date,

grade number(2) default 1,   --默认值为1

email varchar2(50)

);

方法二:

采用子查询。

create table test (....) as (子查询);

修改表结构

1、增加列:

alter table table_name add column type();

注意:采用该方式新增加的列不能设定为 not null 因为基本表在增加一列后,原有的元组 . 在新增的列上值都定义为空。

2、删除列:

alter table table_name drop column;

3、修改列:

alter table table_name modify(column type());

4、修改表名:

rename old_name to new_name;

5、删除表

drop table table_name cascade constraints;

25)约束:

 

创建约束的时机:

1、建表时添加

2、建表后创建

从作用上分:

1、列级约束:只能约束其中一列,可定义任何约束。

2、表级约束:可约束任意一列、多列,可以定义除not null以外的任何约束。

例子:

列级约束:

create table table_name (

no number unique primary key,

name varchar2(20) not null,

no2 number references foreign key table_name(column),

birthday date constraint $name not null,  --给列级约束自定义名称$name

day number check(day > 0)  --自定义约束

);

表级约束:

create table table_name (

no number(5) unique,

dept number(2),

constraint $name foreign key(dept) references table_name(column),

constraint $name primary key(no)   --该写法需要自定义约束名称$name

constraint $name check (dept >0)   --自定义约束

);

——————————————————————

在外部,对约束可以增加、删除,但是不能修改!!!!

alter table table_name

add constraint $name unique(column);

drop constraint $name;只能通过约束名

26)关系数据库的三类完整性

一、实体完整性:主键不能为空

二、参照完整性:不能引用非法的实体。即外键值要满足相关要求,不能用非法数据。

三、用户自定义完整性:满足具体的语义要求。

27)删除存在外键的表的三种方式:(更多的时候,用于行数据删除而不是整表)

一、 restrict方式:当依赖表中没有外键值与要删除的主表中的主键值对应时,才能删除。

二、cascade方式:级联删除。将依赖表中所有与主表中要删除的主键值对应的记录一同删除。

三、set null方式:将依赖表中所有与主表中被删除的主键值对应的外键值设为null

28)数据库对象:

表、视图、索引、约束、序列

命名规则:

1、以字母开头

2、可包括数字、# _ $

29)索引:

用于加快对数据的搜索。通过快速路径访问的方法快速定位数据,减少磁盘i/o

SQL中的索引是非显示索引,在用户查询时自动调用。

优劣:

1、索引能改善操作的性能, 但会降低数据修改的性能,执行这些操作时,DBMS需要动态的更新索引。

2、索引可能要占用大量存储空间。

3、唯一性不好的数据并不适用于索引。

4、索引用于数据过滤、数据排序。

创建索引:

方法一:自动为表上定义为主键、unique约束的列创建。

方法二:手动创建。

create index $name on table(column....);

drop index $name;

30oracle表的隐藏字段:

rowid    /   rownum

rowid:可唯一的表示行数据。----可用于删除重复数据(只要某列具备唯一性,就能实现)

rownum:用于对搜索的结果添加排序。(在取的数据时产生序号,即rownumorder by之前执行。)----可用于分页。

利用rownum在大批量数据中查找几列时:

select * from

(select a.*, rownum rn from

(select * from emp order by ename) a

where rownum <= 10) b --先确定一个小范围,减少搜索量

where b.rn >5; --再确定具体的范围

去重:

select * from emp

where e.rowid not in

(select min(rowid) from emp e group by e.ename having count(1) >1);

31)数据库范式

第一范式:属性不能分割。(存在部分依赖,即多个候选主键)

第二范式:非主属性完全依赖于码(候选主键,具备唯一性),不能部分依赖,即组合的码中存在单独一个元素能决定非主属性。(组合主键若进行拆分,则不能唯一确定元组

第三范式: 消除传递依赖。属性A可以确定B,然后B可以确定C

http://blog.sina.com.cn/s/blog_46d817650100yj2i.html

32)关于排序,oracle中对字母的大小写,是优先对大写字母排序,拍完后才开始拍小写字母。

 

 

33oracle段延迟:

在新建表后,往表中插入序列时,insert into...(nextval...),该序列start with 1,但是显示的是从2开始。

因为oracle11g采用了段延迟技术,在建表后,oracle考虑到大量的空表会占用很多空间,因此在该表被实际使用前,oracle都不会为该表分配段空间。因此第一次插入数据(插入序列)时,是从2开始。

解决方法:

方法一:

在第一次对表进行DML操作时不插入序列。

方法二:

在新表中插入序列,事务回滚,删除该序列,然后重建该序列,重新插入,即可。

http://blog.csdn.net/bisal/article/details/38434007

34SimpleDateFormat

    util.Date

35IN操作符一般比一组OR操作符执行速度快。

36)通配符的检索速度很慢,最好不要放到筛选条件的开始处。

37)书上说虽然给列的别名起具体的名字可以提高可读性,但是这样会给客户端应用带来许多问题,因此最好使用单个字母。

38SQL中有个函数soundex(str)可以根据发音来匹配,但必须英文字母。

select * from emp e where soundex(e.ename) = soundex('join');

注意:这个的匹配是按照一定的规律的:

http://www.2cto.com/database/201401/273013.html

http://blog.csdn.net/perny/article/details/7971003

http://www.cnblogs.com/zhwl/p/3750118.html

http://baike.baidu.com/link?url=HVbwJKcL7srVdS12z8jHywW1OqMK08JmiZCIb0cQikWQPMBiIyhL_qZobx4SlvNX5t82A-l4-b0XR-Cr31rN_mYRYqDJjE8IqN0F1S_uK12F5Y_xE-_ktf_5DcJ1YdKey2y4sOwyyGKNDGRcskJT_q

猜你喜欢

转载自www.cnblogs.com/bky-lxm/p/10788411.html