完整性,模式,建表,建索引
1. 关系的完整性有三种:实体完整性,参照完整性和用户定义的完整性。
1. 实体完整性:若属性A是基本关系R的主属性,那么A不能取空值(就是“不知道”或“不存在”的值)。理解的就是主键不能为空。
2. 参照完整性:设F是基本属性R的一个或一组属性,但不是关系R的码,K是基本关系S的主码。如果F和K相对应,那么F是S的外码,并称基本关系R为参照关系,基本关系S为被参照关系。关系R和关系S不一定是不同的关系。那么对于R中F属性值必须和S对应的元组的主码值相等。
3. 用户定义完整性:针对某一个具体关系数据库的约束条件,它反映某一具体应用涉及的数据必须满足的语义要求。
2. 没有一个数据库系统能支持所有SQL标准的所有概念和特性。
3. 模式的定义和删除。
基于书本,要创建模式,调用该命令必须拥有数据库管理员的权限或者获得了创建模式的权限。于是尝试一下。
为什么?首先schema就是数据库对象的集合,这个集合包含了各种对象如:表、视图、存储过程、索引等。为了区分不同的集合,就需要给不同的集合起不同的名字。如果把database看作是一个仓库,仓库很多房间(schema),一个schema代表一个房间,table可以看作是每个房间中的储物柜,user是每个schema的主人,有操作数据库中每个房间的权利,就是说每个数据库映射的user有每个schema(房间)的钥匙。
但是在Oracle数据库中不能新建一个schema,要想创建一个schema,只能通过创建一个用户的方法解决,在创建一个用户的同时为这个用户创建一个与用户名同名的schem并作为该用户的缺省shcema。即schema的个数同user的个数相同,而且schema名字同user名字一一 对应并且相同。
4. 表的定义,删除和修改。
定义表基本格式:
CREATE TABLE <表名> (
<列名><数据类型>[列级完整性约束条件],
<列名><数据类型>[列级完整性约束条件],
. .....
[表级完整性约束条件])
如果主码由几个属性构成,那么必须作为表级完整性定义。
可以看下面的例子
create table T_major_J122
(
mno char(2) primary key,
mname varchar(20),
loc varchar(20) check(loc in('主校区','南校区','新校区','铁道校区','湘雅校区')),
mdean varchar(20)
);
create table T_stud_J122
(
sno char(10) primary key,
sname varchar(20),
--列级完整性
sex varchar(10) check(sex in('男','女','其它','其他')),
tel varchar(15),
email varchar(20) check(email like '%@%.%'),
birthday date check((TO_CHAR('yyyymmdd'))>='19990731'),
--表级完整性
mno char(10) references T_stud_J122(sno),
majorno char(2) references T_major_J122(mno)
);
修改基本表:
ALERT TABLE <表名>
[ADD <列名><数据类型>][ 完整性约束 ]; 增加列
[ADD <表级完整性约束> ]; 增加完整性约束
[DROP <列名> [CASCADE | RESTRICT] ]; 删除列
[DROP CONSTRAINT<完整性约束名>[CASCADE | RESTRICT]]; 删除完整性约束
[ALERT COLUMN <列名> <数据类型>]; 修改列
删除基本表
DROP TABLE <表名>[CASCADE | RESTRICT];
CASCADE | RESTRICT:如果指定了CASCADE,则自动删除引用了该列的其他的对象,比方说视图,如果是RESTRICT,则如果被其他的对象引用,则拒绝删除该列或者该表。
5. 数据类型
直接去W3school看一下就行http://www.w3school.com.cn/sql/sql_datatypes.asp
6. 建立索引
当表的数据量非常大的时候,查询到操作会比较耗时,建立索引是加快查询速度的有效手段,但是也会占用一定的存储空间。
常见的索引包括顺序文件上的索引,B+数索引,hash索引,位图索引。
顺序文件上的索引是针对按指定属性值升序或者降序存储的关系,在该属性上建立一个顺序索引文件,索引文件有属性值和相应的元组指针组成。
B+树索引是将索引属性组织成B+树形式,B+树的叶节点为属性值和相应的元组指针。
散列索引是家里若干桶,将索引属性按照散列函数值映射到桶中,桶中存储索引的属性值和相应的元组指针。
位图索引是用位向量记录索引属性中可能出现的值,每个位向量对应一个可能值。
建立索引:
CREATE [UNIQUE | CLUSTER] INDEX <索引名> ON <表名>(<列名> [<次序>] [,<列名> [<次序>]...);
修改索引:
ALTER INDEX <旧索引名> RENAME TO <新索引名>;
删除索引:
DROP INDEX <索引名>;
MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址;
MyISAM主索引和辅助索引在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复;
InnoDB的数据文件本身就是索引文件,叶节点包含了完整的数据记录,这种索引叫做聚集索引。
那么我们在数据库上对于某个字段建立了索引,那么什么情况下才走索引呢?
比如 select * from User where Identity= 2 这条语句,是走索引查询的。因为是否走索引取决于这条查询语句的where子句。数据库引擎发现你的where语句中有identity,那么就会从identity的索引数据结构中进行检索。曾经看到有人说select *会降低检索速度,这个跟索引没关系,select * 降低检索速度,是因为从数据库服务器端到客户端的网络传输是有时间的,select * 中难免包含着不必要的字段,所以传输起来会比较慢。
索引类型:根据数据库的功能,可以在数据库设计器中创建索引:唯一索引、主键索引和聚集索引
1.唯一索引: UNIQUE 例如:create unique index stusno on student(sno)
表明此索引的每一个索引值只对应唯一的数据记录,对于单列惟一性索引,这保证单列不包含重复的值。对于多列惟一性索引,保证多个值的组合不重复。
2.主键索引: primary key
数据库表经常有一列或列组合,其值唯一标识表中的每一行。该列称为表的主键。 在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。
3.聚集索引也叫聚簇索引:cluster
在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。 如果某索引不是聚集索引,则表中行的物理顺序与键值的逻辑顺序不匹配。与非聚集索引相比,聚集索引通常提供更快的数据访问速度。