1.数据库模型分为: 关系数据库,层次数据库和网状数据库 2.关系数据库: 关系数据库表示实体和实体之间的联系 3.数据库系统(DBS)database system:有数据库管理系统和管理数据库系统的人和软件组成。 4.数据库管理系统(DBMS):有数据库和管理数据库的软件组成。 5.数据库(database): Sqlserver2005 中的数据库由一个表集合组成. 这些表包含数据以及为支持对数据执行的活动而定义的其它对象. 如视图,索引,存储过程,用户自定义的函数和触发器(这些表用于存储特定的结构化数据). 表中包含行和列,行也称为记录和元组,列称为属性的集合. 表中的每一列用于存储某种类型的信息. 6.表(table):记录的集合,有行(记录)和列(属性)组成。列要保持唯一,在一个数据库中,表的名字也是唯一的 7.度:描述属性的个数我们称为度 8.主键(primary key):主键是表中一列或者多列的组成。保证了实体的完整性 9.外键(foreign key):表中一列或者多列的组合,保证了引用的完整性 10.视图(view):从表中导出的虚拟的表 11.约束(constraint):实施数据一致性和完整性的方法 12.规则(rule):规则同约束一样,实施数据一致性和完整性的方法。 13.索引(index):提供一种无须扫描整张表就能实现快速对数据访问的方法(优化查询的速度)。 14.存储过程(stored procedure):经过编译的可以重复使用的transact -sql的代码的集合 15.触发器(trigger)特殊的存储过程(经过编译的可以重复使用的transact -sql的代码的集合,有系统自动执行) 16.默认值(default):向表中插入数据时,提供一个默认的数据 17.sqlserver2005 数据库分为系统数据库和用户定义数据库. 18.sqlserver200系统数据库主要由:master,msdb,model,resource,tempdb ?? master数据库 : 记录 SQL Server 实例的所有系统级信息。 ?? msdb 数据库:? 用于 SQL Server 代理计划警报和作业。 ?? model 数据库:用作 SQL Server 实例上创建的所有数据库的模板。model 数据库进行的修改(如数据库大小、排序规则、恢复模式和其他数
? 据库选项)将应用于以后创建的所有数据库。 ?? Resource 数据库 :一个只读数据库,包含 SQL Server 2005 包括的系统对象。系统对象在物理上保留在 Resource 数据库中,但在逻辑上
? 显示在每个数据库的 sys 架构中。 ?? tempdb 数据库 :一个工作空间,用于保存临时对象或中间结果集。 ?? 19.sqlserver2005数据库至少具有两个操作系统的文件:数据文件和日志文件. 数据文件包含数据和对象,例如表,存储过程和视图.日
志文件包含对恢复数据库中所有事务所需的信息.为了便于管理可以将数据文件集合起来,存放到文件组中. 20. 每个数据库有一个主要文件组。此文件组包含主要数据文件和未放入其他文件组的所有次要文件。可以创建用户定义的文件组,用于将数
据文件集合来,以便于管理、数据分配和放置。事务日志文件不属于任何文件组. 21./* 创建没有主数据文件和日志文件的数据库*/ use master go
if db_id( 'sales') is not null drop database sales go
create database sales go
/* ?自定义创建数据库 */ use master go
if db_id('sales') is not null drop database sales go
create database sales on?????????????? --创建主数据文件 ( ??? name = sales_dat,--逻辑名称 ??? filename='d:/sales/sales.mdf',--物理路径 ??? size=10MB,????????? --初始化大小,单位默认为MB ??? maxsize =50,????????? --数据库的最大容量 ??? filegrowth=5MB???????? --文件的增长速度 ) log on ( ???? name= sales_log, ???? filename='d:/sales/sales.ldf', ???? size=5MB, ???? maxsize=25, ???? filegrowth=5 )
22.修改数据库: alter database mysales modify file ( ??? name=sales_dat, ??? size=20MB???? --根据逻辑名称进行存储数据的修改 ) go sp_helpdb 'mysales' alter database mysales? add file??????????????????? -- 增加数据文件 ( ??? name=sales_ndat, ??? filename='d:/sales/sales.ndf',?? --要求我们的文件夹路径必须存在 ??? maxsize=50MB, ??? size=10MB,????????????????????? --初始化大小 ??? filegrowth=5MB ) 23.查看数据库的信息: ? Sp_databases????????????? --察看系统数据库信息 ? Sp_helpdb+databasename??? --察看指定名称的数据库信息 ? Sp_helpfilegroup????????? --察看文件组信息 ? exec sp_helpfile????????? --查看指定库的系统文件的信息 ? exec sp_renamedb 'sales','mysales' --修改数据库的名称 24.修改数据库的属性: ? (1)设置数据库为只读: ??????? Exec sp_dboption ‘sales’,’read only’,true ? (2)设置数据库为自动压缩: ??????? Exec sp_dboption ‘sales’,autoshrink,true ? (3)设置数据库为单用户: ??????? Exec sp_dboption ‘sales’,’single user’,true ? (4)收缩数据库的大小 ??????? Dbcc shrinkdatabase (sales,10) ??????? 注解:将sales数据库的文件减小,以使userdb中的文件有10%的可用空间. 25. 数据库的分离和附加: ????? 分离数据库是指将数据库从 SQL Server 实例中删除,但使数据库在其数据文件和事务日志文件中保持不变。 ????? 分离: Exec sp_datach_db ‘sales’ ????? 附加:exec sp_attach_db @dbname=’sales’, ??????????????????? @filename1=’c:/sales/sales_data.mdf’, ??????????????????? @filename2=’c:/sales/sales_data.ndf’ 26.数据库的备份: (1).添加磁盘存储设备: ??? Exec sp_addumpdevice‘disk’,’mydiskdump’,’c:/dump/dump.bak’ (2)将数据库备份写入备份设备: ??? Backupdatabase sales to mydiskdump (3) 恢复数据库 ??? Restore database sales from mydiskdump. (4)删除备份设备 ??? sp_dropdevice 'mybackup' 27.标识符: 数据库对象的名称即为其标识符。标识符分为两类:常规标识符 和分割表识符.
28.常规标识符: (1)第一个字符必须是下列字符之一: Unicode 标准 3.2 所定义的字母。Unicode 中定义的字母包括拉丁字符 a-z 和 A-Z,以及来自其他语言的字母字符。下划线 (_)、“at”符
号 (@) 或者数字符号 (#)。 在 SQL Server 中,某些位于标识符开头位置的符号具有特殊意义。以“at”符号开头的标识符表示局部变量或参数。以一个数字符号开头的
标识符表示临时表或过程。以两个数字符号 (##) 开头的标识符表示全局临时对象。 (2)后续字符可以包括: 如 Unicode 标准 3.2 中所定义的字母。 基本拉丁字符或其他国家/地区字符中的十进制数字。 “at”符号、美元符号 ($)、数字符号或下划线。 (3)标识符不能是 Transact-SQL 保留字。SQL Server 保留其保留字的大写和小写形式。 (4)不允许嵌入空格或其他特殊字符。
29.分割标识符(限定标识符) ???? 包含在双引号 (") 或者方括号 ([ ]) 内。符合标识符格式规则的标识符可以分隔,也可以不分隔 30.数据类型:整数数据、字符数据、货币数据、日期和时间数据、二进制字符串等。数据类型分为系统数据类型和用户自定义数据类型 (1)整型:bigint,int,smallint,tinyint,bit? (2)货币类型:money,smallmoney (3)精确类型,可带上约数:numeric(p,v),decimal(p,v).p:可表示的有效数字的位数,v:可带上的小数位数? (4)近似数字:float(相当与C++或JAVA中的double),real(相当与C++或JAVA中的float) (5)日期和时间:datetime,smalldatetime.可利用getdate()函数得到当前的系统时间 (6)字符串:char,varchar,text(可存储比前两个更多的字符,最多可存储8000个)? (7)Unicode字符串:nchar,ntext,nvarchar? (8)二进制字符串:Binary,image,varbinary? (9)其他数据类型:Cursor(游标),timestamp(时间戳),sql_variant,uniqueidentifier,table(表),xml(配置文件) 31.用户自定义的数据类型: ?? (1)执行sp_addtype创建别名数据类型,该数据类型可在特定数据库的 sys.types 目录视图中出现。具有这一别名数据类型,创建了别名数据
类型之后,可以在 CREATE TABLE 或 ALTER TABLE 中使用它,也可以将默认值和规则绑定到别名数据类型 ??? (2)使用sp_droptype删除别名数据类型. 32.约束: (1) PRIMARY KEY约束(主键约束:非空且唯一):一个表只能包含一个PRIMARY KEY约束,每个PRIMARY KEY都生成一个索引 (2)UNIQUE约束(唯一但可以为空):每个UNIQUE约束都生成一个索引 (3)FOREIGN KEY约束(外键约束):一个表中可有多个,参考了主键定义 ----------------------如下例 create table employee ( ?? em_id int primary key, ?? em_name varchar(20), ?? manager_id int foreign key references employee(em_id) ) (4)DEFAULT 定义(默认):每列只能有一个 DEFAULT 定义,这可以包含常量值或常量函数 (5)表定义中的为空性规则 列的为空性用于确定在该列中是否允许以空值 (NULL) 作为其数据。NULL 不是零或空白。它表示没有输入任何内容,或提供了一个显式 NULL
值.通常表示该值未知或不适用 (6) 在 INSERT、UPDATE 或 DELETE 语句中违反约束时,将终止该语句
33.创建表: CREATE TABLE table_name ( column_name data_type [{DEFAULT constant_expression | [ IDENTITY[( seed,increment)]]}] {[NULL| NOT NULL] | [PRIMARY KEY | UNIQUE] | REFERENCES ref_table[(ref_column)] ) (1) table_name:新表的名称,表名称必须符合标识符规则, table_name 在数据库中必须是唯一的,table_name 最多可包含128个字符 (2)column_name 表中列的名称,列名称必须符合标识符规则,并且在表中必须是唯一 (3) DEFAULT 指定在插入操作中没有显式提供值时为该列提供的值, 除了IDENTITY属性定义的列之外,DEFAULT 定义可应用于任何列, 删除表时将删除DEFAULT定义,常量值可用作默认值 (4)IDENTITY 指示新列是标识列。在为表添加新行时,SQL Server将为列提供唯一的增量值, 标识列通常与 PRIMARY KEY 约束结合使用以作为表的唯一行标识符, IDENTITY 属性只能分配给 int 列。每个表只能创建一个标识列, 标识列无法使用绑定默认值和 DEFAULT 约束。必须同时指定种子和增量, 或者不指定任何值。如果不指定任何值,默认为 (1,1)。 --------若将列制定为identity属性,就不能手动的对其列添加值.若想添加就必须把identity属性 打开.用命令:set IDENTITY_INSERT TO FROM TABLE_NAME (5) NULL | NOT NULL 用于指定列中是否允许空值的关键字.从严格意义上讲,NULL不是一个约束,但可以使用指定NOT NULL相同的方法来指定 34.修改表:使用alter table table_name更改、添加或删除列和约束 (1)增加列:alter table table_name ????????? add column_name column_type (2)修改列:alter table table_name ????????? alter column table_column column_type (3)增加约束(paiamry key,foreign key,default,unique,check(用户自定义约束)) (5)删除约束:drop constraint 35.利用存储过程查看和修改表的信息: ?? (1)exec sp_help:查看表的详细信息 ?? (2)exec sp_rename? 修改表的名称或者列名称 ?? (3)exec sp_helpconstraint table_name? --查看指定表的所有约束 ?? (4)exec sp_help table_name??????????? -- 查看指定表的所有信息 ?? (5)exec sp_pkeys table_name????????? -- 查看指定表的主键约束 ?? (6)exec sp_fkeys? table_name???????? -- 查看指定表的外键约束 /********************举例*******************/?????????????????????????????? /* ? 建表。 */ if db_id('sales') is not null drop database sales go create database sales go use sales go if exists(select*from sys.tables where name='goods') drop table goods???????????????? --若数据库中存在就删除此表 go create table goods?????????????? --创建表 ( ?? goods_id int? identity(1000,1) not null, ?? goods_name varchar(50), ?? goods_num int, ?? goods_price money ) exec sp_help 'goods'?????????? --查看表的详细信息 exec sp_rename 'goods','orders'? --修改表的名称 select name from sysobjects where type='u' exec sp_rename 'orders.goods_id','g_id','column'? --修改列的名称 exec sp_rename 'orders.goods_name','g_name','column' /* ? 修改表结构1.增加列 */ alter table orders? add goods_date datetime /* ? 修改表结构1.修改列 */ alter table orders alter column g_name varchar(100) /* ? 修改表结构1.删除列 */ alter table orders drop column goods_date
/* ? 创建表的过程是保证数据完整性的过程 ? (1)实体完整性(primary key,unique) ????? 1.一个表只能由一个主键,但是可以有多个唯一 ????? 2.主键唯一且非空,而unique唯一或者非空。 ? (2)引用完整性。(foreign key) ? (3)域完整性(not null,check,default ) */ ---------从表 if exists(select*from sys.tables where name='goods') drop table goods???????????????? --删除表 go create table goods?????????????? --创建表 ( ?? goods_id int? identity(1000,1) not null primary key,? --主键 ?? goods_name varchar(50) not null unique,???? --唯一约束 ?? goods_num int check (goods_num>10 and goods_num<100),--check约束 ?? goods_price money default 0,? --默认值??????????????????????? ?? provider_id int foreign key references provider(provider_id)--实现外键约束 ) ---------主表 go if exists(select*from sys.tables where name='provider') drop table provider go create table provider? --注意:create语句必须是批处理的第一句 ( ?? provider_id int identity(2000,1) primary key, ?? provider_name varchar(30), ?? provider_address varchar(40) ) /* 插入语句 */ insert into goods values('memory',50,2000) insert into provider values('huawei','shenzhen') -------可以使用select union all组合语句实现对表批量添加 /* ? 查询记录 */ select * from goods select * from provider /* 添加主键约束 */ alter table goods?? add constraint g_pk primary key (goods_id)
/* ? 添加唯一约束 */ alter table goods add constraint g_unk? unique(goods_name) /* ? 添加check 约束 */ alter table goods add constraint g_chk check(goods_num >10 and goods_num <100)
/* ? 添加默认值约束 */ alter table goods add constraint g_def default 0 for goods_price /* ? 添加外键约束 */ alter table goods add constraint g_fk foreign key(provider_id)references provider(provider_id)
/*删除约束*/ alter table goods drop g_def ----
/*查看约束*/ exec sp_helpconstraint 'goods'? --查看指定表的所有约束 exec sp_help 'goods'??????????? -- 查看指定表的所有信息 exec sp_pkeys 'goods'?????????? -- 查看指定表的主键约束 exec sp_fkeys 'provider'??????? -- 查看指定表的外键约束????????????????????? exec sp_fkeys 'goods' 36. 插入语句的多行插入: (表之间的数据复制) Select? [(column_list)] into new_table_name? from table_name ? (1)此语句根据旧表table_name创建新表new_table_name ? (2)只能复制结构和数据而不能复制关系,如果要只复制结构而不复制数据的方法, ???? 在表的后面要加上一个永不成立的条件.例如: ???? insert into new_table_name [(column_list)]? from table_name where 1>2 37.更新语句: 更改表或者视图中的现有数据 ???? update table_name set col_name=values where 条件 38.删除语句: ???? (1)delete from table_name where 条件 ???? (2)删除表中的所有行,而不记录单个行删除操作 ??????? TRUNCATE TABLE 在功能上与没有 WHERE 子句的 DELETE 语句相同, ??????? 但是TRUNCATE TABLE 速度更快,使用的系统资源和事务日志资源更少
39.sqlserver2005中sql语言的组成: ?? (1)数据定义语言DDL(Data Definition Language) ?? (2)数据操纵语言DML(Data Manipulation Language) ?? (3)数据控制语言DCL(Data Control Language) ?? (4)其它语言要素ALE(Additional Language Elements)
40.变量:全局变量和局部变量 ?? (1)局部变量: 局部变量是用户可自定义的变量它的作用范围仅在程序内部 ????? 在程序中通常用来储存从表中查询到的数据或当作程序执行过程中暂存变量 ????? 使用局部变量必须以@ 开头而且必须先用DECLARE命令说明后才可使用其 ?? (2)变量的声明:DECLARE @变量名变量类型 [ @变量名 变量类型…] ?? (3)变量的赋值:SELECT @局部变量 = 变量值 -----可同时赋多个 ????? SET @局部变量= 变量值? ----只能赋一个 ?? (4)全局变量:全局变量是SQLServer系统内部使用的变量其作用范围并不局限于某一程序而是任何程序均可随时调用 41.注释符: ANSI 标准的注释符-- 用于单行注释 ?????????? 与C 语言相同的程序注释符号即/**/ 42.运算符(operator): ?? (1)算术运算符:+,-,*,/,%(取余) ?? (2)比较运算符:>,<,=,>=,<=,<>(不等于),!=(不等于),!>(不大于),!<(不小于) ?? (3)逻辑运算符:AND(与),OR(或),NOT(非) ?? (4)位运算符:&(按位与),|(按位或),~(按位非),^(按位异或), ?? (5)连接运算符:+用于连接两个或两个以上的字符或二进制串列名 ?????????????????? 或者串和列的混合体将一个串加入到另一个串的末尾其 ?? (6)通配符:%(代表零个或多个字符),如:'ab%','ab'后可接任意字符串 ??????????? _:下划线代表一个字符,如:'a_b','a'与'b'之间可以有一个字符 ?????????? [ ]:表示在某一范围的字符,如:[0-9] 0 到9 之间的字符 ?????????? [^ ]:表示不在某一范围的字符,如:[^0~9] 不在0 到9 之间的字符
?
43.流程控制语句: ? (1)IF ELSE其语法如下: IF<条件表达式><命令行或程序块> [ELSE[条件表达式]<命令行或程序块>] ? (2)BEGIN END:其语法如下 ????? BEGIN <命令行或程序块> END ----相当与复合语句的{} ? (3)CASE:CASE 命令有两种语句格式: ???? A:CASE <运算式> ?????? WHEN <运算式> THEN <运算式> ?????? WHEN <运算式> THEN <运算式> ?????? [ELSE <运算式>]END ???? B:CASE ?????? WHEN <条件表达式> THEN <运算式> ?????? WHEN <条件表达式> THEN <运算式> ?????? [ELSE <运算式>]END 注: case只运行第一个匹配的子句 ---------------case语句的使用举例----------------------- ?输出学生性别: ?create table stu ( ?? stu_id int identity(100, ?? stu_name varchar(20), ?? stu_sex bit ) insert stu(stu_name,stu_sex) ?????????? select 'lisi',0 union all ?????????? select 'wangwu',1 union all ?????????? select 'zhanghua',0 union all ?????????? select 'lili',0 select stu_id,stu_name,stu_sex=case when stu_sex=0 ?????????? then '女' else '男' end from stu
44.PRINT,SET ? PRINT:打印 ? SET:设置系统信息 45.常用函数: ? (1)统计函数:统计函数是在数据库操作中时常使用的函数又称为基本函数或集函数 ?? 常用的统计有:AVG---求平均值,COUNT---统计数目,MAX---求最大值,MIN---求最小值,SUM---求和 ? (2)数学函数:rand,round-------产生随机数字的函数 ? (3)字符串函数:sunstring(),char(),left(),right(),ltrim(),rtrim(),space(),replace(),str()等等 ? (4)日期函数:dateadd(),dateiff(),datename()等,这里就不多写了 ? (5)转换函数:cast和convert()强制类型转换
----------------函数使用举例------------------------- declare @a int,@name varchar(20),@birthday datetime --变量的定义 select @a=100,@name='lihaoran',@birthday='2005-01-01' print cast (@a as varchar(10)) + '? ' + @name +' '+ cast(@birthday as varchar(20)) --打印 /* ? 利用select在查询的过程中进行赋值 */ select g_id,g_name,g_num,g_price from good where g_id=1001 declare @id int,@name varchar (20),@num int,@price money select @id=g_id,@name=g_name,@num=g_num,@price=g_price from good where g_id=1001 print '输出的结果为:id 是:'+ str(@id)+' name是 '+ @name + str(@num) /* ?? 判断是否闰年用流程控制语句if-----else */ declare @year int set @year=2000 if (@year%4 <>0) begin ?? print str(@year)+ 'not a leap year!' end else if (@year%100<>0) begin ??? print? str(@year)+ 'is a leap yeat!' end else if (@year %400=0) begin ??? print? str(@year)+ 'is a leap year!' end else ?print str(@year)+ 'not a leap year!' ? /* ?? 多分支 case when then else end (只能用在查询或者update当中) */ select * from good --若g_name是'cpu'就改为'处理器',若是'memory'就改为'内存条',否则的话就改为'其他' select g_id,case g_name ? when 'cpu' then '处理器' ? when 'memory' then '内存条' ? else '其它' ? end as [type],g_price from good /* ? update的多分支结构 */ update good set g_price =case ?? when g_num <10? then g_price *100 ?? when g_num >=10 and g_num <50 then g_price *10 ?? when g_num >=50 and g_num <100 then g_price *5 ?? else 100 end ---------------------用while循环求数字的和--------------------- declare @i int,@sum int select @i=0,@sum=0 while (@i<101) begin ? set @sum=@sum+@i ? set @i=@i+1 end print @sum /* ? 系统函数的使用 */ select * from good select sum(g_num) as '总额' from good select avg(g_price) as '平均值' from good where g_name='cpu' select max(g_price) as '最大值' from good select min(g_price) as '最小值'? from good select count(*) as '记录数量' from good /* ?? 转换函数(cast) */ declare @a int set @a=32767 select cast(@a as varchar(10))? --强制类型转换
declare @str varchar(10) set @str='123' select cast(@str as int)+123
declare @date varchar(20) set @date='2005-10-10' select cast(@date as datetime)
--------convert 带格式化 --------convert (新数据类型,变量或者列名) declare @a int set @a=100 select convert(varchar(10),@a)
select convert(varchar(20),getdate(),108) -------------cast函数的使用举例------------------------ /* ? 求给定日期的所在月的最后一天 */ declare @date datetime set @date='2005-5-5' select dateadd(day,-1,dateadd(month, ?? datediff(month,'2000-1-1',@date)+1,'2000-1-1')) /* ? 求给定日期所在年的最后一天 */ declare @date datetime set @date='2005-5-5' select cast (cast(year(@date)as char(4))+'/12/31' as datetime) as 日期
46.SQL中的用户自定义函数:function /* ? 一元二次方程求解问题: */
create function func(@a float,@b float,@c float) returns @t table(x1 float,x2 float,flag int)? --定义返回的表结构
as begin ?? declare @temp float ?? select @temp=@b*@b -4 *@a *@c ?? if(@temp >=0) ?? begin ???? insert @t select (-@b +sqrt(@temp))/(2*@a),(-@b +sqrt(@temp))/(2*@a),1 ?? end ?? else ???? insert @t(flag) select 0 ?? return????????? --最后一句return end
--验证
declare @a float,@c float,@res int,@x1 float,@x2 float select @a=1,@b=50,@c=1 select @res=flag,@x1=x1,@x2=x2 from dbo.func(@a,@b,@c) if @res=0 ? print '此方程无解' else ? print '方程的解:x1='+cast(@x1 as char(50))+char(10) 47.函数分为系统函数和用户自定义函数 48.用户定义函数不能用于执行修改数据库状态的操作 与系统函数一样,用户定义函数可从查询中调用。标量函数和存储过程一样可使用 EXECUTE 语句执行 49.用户自定义函数用create function创建,alter function修改,Drop function删除 50.用户定义函数为标量值函数或表值函数,如果 RETURNS 子句指定了一种标量数据类型, 则函数为标量值函数。可以使用多条 Transact-SQL 语句定义标量值函数 51.如果 RETURNS 子句指定 TABLE,则函数为表值函数 根据函数主体的定义方式,表值函数可分为内联函数或多语句函数 52.内联用户定义函数遵从以下规则: ?? (1)RETURNS 子句只包含关键字table,不必定义返回变量的格式, ????? 因为它RETURN 子句中的 SELECT 语句的结果集的格式设置 ?? (2)function_body不用 BEGIN 和 END 分隔 ?? (3)RETURN 子句在括号中包含单个 SELECT 语句 ????? SELECT 语句的结果集构成函数所返回的表 ????? 内联函数中使用的 SELECT 语句与视图中使用的SELECT 语句受到相同的限制 53.多语句表值用户定义函数: ?? (1)RETURNS 子句为函数返回的表定义局部返回变量名。RETURNS 子句还定义表的格式。 ?? (2)函数体中的 Transact-SQL 语句生成行并将其插入 RETURNS 子句定义的返回变量中。 ?? (3)当执行 RETURN 语句时,插入变量的行将作为函数的表格输出返回。RETURN 语句不能有参数。 54.用户自定义的函数需要举例讲解: 55.重新讲解数据的完整性.数据的完整性是指数据的可靠性和准确性,设计数据完整性规则是用来保持数据的一致性和正确性. 56.数据的完整性分为四类: ?? (1)实体完整性(Entity Integrity) ?? (2)域完整性(Domain Integrity) ?? (3)参照完整性(Referential Integrity) ?? (4)用户定义的完整性(User-definedIntegrity) 57. 参照完整性(Referential Integrity) ??? 参照完整性主要体现在一下几个方面: ??? (1)禁止在从表中插入包含主表中不存在的关键字的数据行 ??? (2)禁止修改会导致从表中的相应值孤立的主表中的外关键字值改变 ??? (3)禁止删除在从表中的有对应记录的主表记录
58.规则Rule 就是数据库中对存储在表的列或用户自定义数据类型中的值的规定和限制规. 59.CREATE RULE命令用于在当前数据库中创建规则其语法如下: CREATE RULE rule_name AS condition_expression condition_expression它可以包含算术运算符关系运算符和谓词如IN LIKE BETWEEN等 例如: ???? 创建工作级别规则job_level_rule ???? create rule job_level_rule ???? as @job_level in ('1','2','3','4','5')? -----工作级别必须是1,2,3,4,5中的任何一个 ???? sp_bandrule job_level_rule,'job.[job_level]'----绑定规则 ???? sp_unbandrule? ----解除绑定 60.创建规则后规则仅仅只是一个存在于数据库中的对象并未发生作用, ?? 需要将规则绑定到与数据库表或用户自定义对象联系起来, ?? 才能达到创建规则的目的. 联系的方法称为绑定 ?? 所谓绑定就是指定规则作用于哪个表的哪一列或哪个用户自定义数据类型 61.表的一列或一个用户自定义数据类型只能与一个规则相绑定而一个规则可以绑定多对象. 62.缺省值Default:往用户输入记录时没有指定具体数据的列中自动插入的数据. ?? create default as 创建默认值. ?? 用存储过程Sp_bindefault 绑定默认值 ?? 用存储过程Sp_unbindefault 解除默认值的绑定 63. sp_helptext 查看规则和默认值的信息 ??? Sp_helptext 可以查看存储过程和触发器,若加密了的就不能查看 ??? --------用命令with encrypyion对创建的触发器进行加密
-------------------------规则的使用举例---------------------------
//增加新的用户自定义数据类型(如果不再master表中,则只在当前库中有效) sp_addtype birthday,'datetime','not null' /* ? 建立表 */ if exists(select name from sysobjects where type='u' and name='stu') drop table stu create table stu ( ? stu_id int identity(1000, ? stu_birthday birthday ) /* ? 变量验证 */ declare @date birthday set @date=getdate() select @date /*插入记录验证*/ insert stu (stu_birthday)values(getdate()) select * from stu
/*创建规则*/ if object_id('bir_rule','R') is not null drop rule bir_rule go
create rule bir_rule as ? @bir_rule >'1975-2-12' and @bir_rule < getdate() go
/* 规则绑定 */ sp_bindrule bir_rule,birthday? --绑定自定义数据类型 go create table stu_temp ( ?? tem_date datetime not null ) go sp_bindrule bir_rule,'stu_temp.[tem_date]'--绑定到表的列
insert into stu_temp values('1978-1-1') if @@error <>0? --@@error全局函数,判断上条记录是否成功,若返回0表示成功 ? print 'ERROR' else ? print 'OK' insert into stu_temp values('1771-1-1') if @@error <>0 ? print 'ERROR' else ? print 'OK' go /* ?解除绑定 */ sp_unbindrule birthday? --解除自定义数据类型的规则 sp_unbindrule 'stu_temp.[tem_date]' --解除表中列的规则
/* ?删除规则 */ drop rule bir_rule
------------------默认值使用举例------------------
/* ??? 前提:新建一数据类型 ????????? 新建一表。 */ sp_addtype address,'varchar(20)','not null' go if exists(select name from sysobjects where type='u' and name='tem_def') drop table tem_def go create table tem_def ( ?? tem_id int identity(100,1)primary key, ?? tem_name varchar(30), ?? tem_address varchar(20) not null ) go /* ? 创建默认值 */
create default mydef as 'shan xi xian' /* ? 绑定 */ exec sp_bindefault mydef,'address'?? --绑定自定义数据类型 go exec sp_bindefault mydef,'tem_def.[tem_address]' --绑定列 go insert into tem_def(tem_name) values('aaaa') select * from tem_def????????????? --判断是否绑定
create table temp ( ? te_id int, ? te_ad address???????????? --用户自定义的数据类型的绑定 ) go insert into temp(te_id)values(10) select * from temp?? -- 验证是否插入默认值
/* ? 解除绑定 */ exec sp_unbindefault address?? --解除用户自定义的数据类型 exec sp_unbindefault 'tem_def.[tem_address]' --解除列 go /* ? 删除绑定 */ drop default mydef go
/* ?? 查看绑定的详细信息 */
exec sp_helptext mydef? --查看默认值 exec sp_helptext bir_rule --查看规则
64.简单查询:? (1)使用select计算列.如果显示所有的列,用*替代.? (2)给列重命名,使用as关键字.? (3)查询为空或者不为空的列的方法:is not null,is null? (4)top关键字的查询:???? 指定查询结果中将只返回第一组行,这组行可以是某一数量的行也可以是某一百分比数量的行???? TOP 表达式可用在SELECT、INSERT、UPDATE 和 DELETE 语句中。???? Top n 和top? n percent的使用? (7)istinct 关键字: 删除重复项? (8)order by:对查询的数据排序:asc-->升序排列,desc-->降序排???? Order by col_name asc|desc65.使用聚合函数和分组? (1)利用group by可以按照一定的条件对查询到的结果进行分组,再对每一组数据计算统计信息.? (2)Group by 后跟表的列名,但不能是别名.? 66.having 关键字:? (1)指定组或聚合的搜索条件,HAVING只能与SELECT语句一起使用???? HAVING通常在GROUP BY子句中使用,如果不使用GROUP BY子句,则HAVING的行为与WHERE子句一样? (2)Having和where的区别:having作用于组,而where作用于表或者视图? (3)Having的条件中可以使用聚合函数,而where不可以67.以下步骤显示带 Where 子句、Group by 子句和 having 子句的 Select 语句的处理顺序:? (1)From 子句返回初始结果集。? (2)Where 子句排除不满足搜索条件的行? (3)Group by 子句将选定的行收集到 Group by 子句中各个唯一值的组中
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|