3-2数据定义
Posted 蛋子哥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3-2数据定义相关的知识,希望对你有一定的参考价值。
3-2数据定义
tags:数据库
关系数据库系统支持三级模式结构,其模式、外模式和内模式中单基本对象幽默师表,视图和索引等.因此SQL的数据定义功能包括,模式定义,表定义,视图和索引定义.
操作对象 | 创建 | 删除 | 修改 |
---|---|---|---|
模式 | create schema | drop schema | |
表 | create table | drop table | alter table |
视图 | create view | drop view | |
索引 | create index | drop index | alter |
架构(模式schema)
为避免此处模式域数据库逻辑模式混淆使用架构一词
架构的概念
架构是形成单个命名空间的数据库实体的集合。命名空间是一个集合,其中每个元素的名称都是唯一的。微软的官方说明(MSDN): “数据库架构是一个独立于数据库用户的非重复命名空间,您可以将架构视为对象的容器”,详细参考[http://technet.microsoft.com/zh-cn/library/ms190387.aspx](微软 sql server 文档)
架构的意义/架构与用户分离的好处
以往 SQL Server 内的对象命名是“服务器.数据库.用户名.对象”,但新版的对象命名改为“服务器.数据库.Schema.对象”。这让你规划数据库对象命名时更有弹性。
将架构与数据库用户分离对管理员和开发人员而言有下列好处:
1. 多个用户可以通过角色成员身份或 Windows 组成员身份拥有一个架构。这扩展了允许角色和组拥有对象的用户熟悉的功能。
2. 极大地简化了删除数据库用户的操作。
3. 删除数据库用户不需要重命名该用户架构所包含的对象。因而,在删除创建架构所含对象的用户后,不再需要修改和测试显式引用这些对象的应用程序。
4. 多个用户可以共享一个默认架构以进行统一名称解析。
5. 开发人员通过共享默认架构可以将共享对象存储在为特定应用程序专门创建的架构中,而不是 DBO 架构中。
6. 可以用比早期版本中的粒度更大的粒度管理架构和架构包含的对象的权限。
架构相关SQL
定义模式
create schema <模式名> authorization <用户名>
authorization ->授权,许可
要创建模式,调用命令的用户必须拥有数据库管理员权限,或者获得了数据库管理员授予的creare schema的权限.
若没有指定模式名,那么模式名默认为用户名.
定义模式实际上定义了一个命名空间,在空间中可进一步定义其他数据库对象如view table grant
在create schema 中可以接受create table view grant子句.
删除模式
drop schema <模式名> <cascade|restrict>
其中cascade(级联)和restrict(限制)量着必选其一,cascade表示在删除该模式的同时删除该模式中的数据库对象,restrict表示如果该模式中已经定义了下属的数据库对象,则拒绝该删除语句的执行.只有该模式中没有任何下属的对象时才能执行drop schema语句.
oracle和sql server 架构区别
SQL Server中的Schema
SQL Server中一个用户有一个缺省的schema,其schema名就等于用户名,这也就是我们在企业管理器的方案下看到schema名都为数据库用户名的原因。当然一个用户还可以使用其他的schema。如果我们访问一个表时,没有指明该表属于哪一个schema中的,系统就会自动给我们在表上加上缺省的sheman名。比如我们在访问数据库时,访问scott用户下的emp表,通过select * from emp; 其实,这sql语句的完整写法为select * from scott.emp。在数据库中一个对象的完整名称为schema.object,而不属user.object。类似如果我们在创建对象时不指定该对象的schema,在该对象的schema为用户的缺省schema。这就像一个用户有一个缺省的表空间,但是该用户还可以使用其他的表空间,如果我们在创建对象时不指定表空间,则对象存储在缺省表空间中,要想让对象存储在其他表空间中,我们需要在创建对象时指定该对象的表空间。Oracle中的Schema
Oracle中的schema就是指一个用户下所有对象的集合,schema本身不能理解成一个对象,oracle并没有提供创建schema的语法,schema也并不是在创建user时就创建,而是在该用户下创建第一个对象之后schema也随之产生,只要user下存在对象,schema就一定存在,user下如果不存在对象,schema也不存在;如果创建一个新用户,该用户下如果没有对象则schema不存在,如果创建一个对象则和用户同名的schema也随之产生。实际上在使用上,shcema与user完全一样,没有什么区别,在出现schema名的地方也可以出现user名。
基本表(table)
表相关SQL
定义表
create table <表名> (<列名><数据类型>[列级完整性约束条件]
[,<列名><数据类型>[列级完整性约束条件]]
[,<列名><数据类型>[列级完整性约束条件]]
[,<列名><数据类型>[列级完整性约束条件]]
[表级完整性约束条件] );
create table t_course( cno cahr(4) primary key, /*列级完整性约束cno是主码*/
cname char(40) not null, /*列级完整性约束,cname不能取空值*/
cpno char(4), /*cpno的含义是先修课*/
ccredit smallint,
foreign key(cpno) references t_course(cno) /*表级完整性约束条件,cpno是外码*/
)
check约束
CHECK 约束用于限制列中的值的范围。如果对单个列定义 CHECK 约束,那么该列只允许特定的值。如果对一个表定义 CHECK 约束,那么此约束会在特定的列中对值进行限制。
CREATE TABLE 表名( 销售商 VARCHAR(20) NOT NULL CHECK(销售商 LIKE ‘%销售公司‘),
电话 VARCHAR(8) CHECK(电话 LIKE ‘[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]‘),
销售日期 DATE NOT NULL DEFAULT GETDATE())
create(sex char check(sex=‘男‘ or sex=‘女‘) not null )
alter table 表名 add constraint 约束名(sex_check) check(列名=‘男’or 列名=‘女’)
修改基本
alter table <表名>
[add [column] <新列名> <数据类型> [完整性约束]]
[add <表级完整性约束>]
[drop [column] <列名> [cascade|restrict]]
[drop constraint<完整性约束名> [cascade|restrict]]
[alter column<列名><数据类型>]
alter table student add s_time date
不论基本表中原来是否已有数据,新增加的列一律为空值.
drop column 子句用于删除表中的列,如果指定了cascade短语,则自动删除应用了该列的其他对象,如果指定了restrict短语则如果删除该列被欠他对象引用,rdbms将拒绝删除该列.
add 子句用于增加新列,新的列级,表级完整性约束条件.
drop constraint 子句用于删除指定的完整性约束条件.
alter column 子句用于修改原有的列定义,包括修改列名和数据类型.
删除基本表
drop table <表名> [restrict|cascade]
索引(index)
索引的概念
当表的数据量比较大时,查询操作会比较耗时.建立索引是加快查询速度的有效手段.数据库索引类似于图书后边的索引,能快速定位到所查询的内容.用户可以根据需要在基本表上建立一个或者多个索引,以提供多重存取路径,加快查找速度.
索引的类型
索引类型
? 唯一索引:唯一索引不允许两行具有相同的索引值
? 主键索引:为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的,并且不能为空
? 聚集索引(Clustered):表中各行的物理顺序与键值的逻辑(索引)顺序相同,每个表只能有一个
? 非聚集索引(Non-clustered):非聚集索引指定表的逻辑顺序。数据存储在一个位置,索引存储在另一个位置,索引中包含指向数据存储位置的指针。可以有多个,小于249个
唯一索引
唯一索引不允许两行具有相同的索引值。如果现有数据中存在重复的键值,则大多数数据库都不允许将新创建的唯一索引与表一起保存。当新数据将使表中的键值重复时,数据库也拒绝接受此数据。例如,如果在stuInfo表中的学员员身份证号(stuID) 列上创建了唯一索引,则所有学员的身份证号不能重复。
提示:创建了唯一约束,将自动创建唯一索引。尽管唯一索引有助于找到信息,但为了获得最佳性能,建议使用主键约束或唯一约束。
主键索引
在数据库关系图中为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的。当在查询中使用主键索引时,它还允许快速访问数据。
聚集索引(clustered index)
在聚集索引中,表中各行的物理顺序与键值的逻辑(索引)顺序相同。表只能包含一个聚集索引。例如:汉语字(词)典默认按拼音排序编排字典中的每页页码。拼音字母a,b,c,d……x,y,z就是索引的逻辑顺序,而页码1,2,3……就是物理顺序。默认按拼音排序的字典,其索引顺序和逻辑顺序是一致的。即拼音顺序较后的字(词)对应的页码也较大。如拼音“ha”对应的字(词)页码就比拼音“ba” 对应的字(词)页码靠后。
非聚集索引(Non-clustered)
如果不是聚集索引,表中各行的物理顺序与键值的逻辑顺序不匹配。聚集索引比非聚集索引(nonclustered index)有更快的数据访问速度。例如,按笔画排序的索引就是非聚集索引,“1”画的字(词)对应的页码可能比“3”画的字(词)对应的页码大(靠后)。
提示:SQL Server中,一个表只能创建1个聚集索引,多个非聚集索引。设置某列为主键,该列就默认为聚集索引
索引的优点和缺点
索引的优缺点
? 优点
– 加快访问速度
– 加强行的唯一性
? 缺点
– 带索引的表在数据库中需要更多的存储空间
– 操纵数据的命令需要更长的处理时间,因为它们需要对索引进行更新
创建索引的指导原则
创建索引的指导原则
? 请按照下列标准选择建立索引的列。
– 该列用于频繁搜索
– 该列用于对数据进行排序
? 请不要使用下面的列创建索引:
– 列中仅包含几个不同的值。
– 表中仅包含几行。为小型表创建索引可能不太划算,因为SQL Server在索引中搜索数据所花的时间比在表中逐行搜索所花的时间更长
索引相关SQL
创建索引
CREATE [UNIQUE] [CLUSTERED|NONCLUSTERED]
INDEX index_name
ON table_name (column_name…)
[WITH FILLFACTOR=x]
CREATE NONCLUSTERED INDEX IX_writtenExam
ON stuMarks(writtenExam)
WITH FILLFACTOR= 30
/*-----指定按索引 IX_writtenExam 查询----*/
SELECT * FROM stuMarks (INDEX=IX_writtenExam)
WHERE writtenExam BETWEEN 60 AND 90
虽然我们可以指定SQL Server按哪个索引进行数据查询,但一般不需要我们人工指定。SQL Server将会根据我们创建的索引,自动优化查询
UNIQUE表示唯一索引,可选
CLUSTERED、NONCLUSTERED表示聚集索引还是非聚集索引,可选
FILLFACTOR表示填充因子,指定一个0到100之间的值,该值指示索引页填满的空间所占的百分比
修改索引
alter index <旧的索引名> rename to <新的索引名>
删除索引
索引一经建立就由系统使用和维护,不需要用户干预.建立索引是为了减少查询操作的时间,但如果数据增、删、操作频繁,系统会话费许多时间来维护索引,从而降低了查询效率.这时可以删除一些不必要的索引.
数据字典
数据字典是关系数据库系统内部的一组系统表,它记录了数据库中所有的定义信息包括关系模式定义、视图定义、索引定义、完整约束定义、各类用户对数据库的操作权限统计信息等.关机数据库管理系统在执行SQL的数据定义语句时,实际上就是在更新数据字典中的相应信息.在进行查询优化和处理时,数据字典中的信息是其重要依据.
以上是关于3-2数据定义的主要内容,如果未能解决你的问题,请参考以下文章