关于sql server,你知多少

上个月写了一篇文章 关于JS,你知多少

我们接着来看系列文章之二--sql server。

以前很长一段时间,都是使用它的界面来管理sql server数据库和表的,最主要设计的就是查询分析器和企业管理器(sql server 2005的SSMS和sql server 2000的查询分析器很类似)。我想对于我们编程人员来说,不能停留在sql server的初级阶段了。最近学习了一段时间的sql server,对于T-SQL编程有了很大的了解,现在可以使用T-SQL语句来控制数据库了。


1 创建数据库

  

--创建数据库Library
create database Library
on
(
	name='Librarybin',
	filename='D:\Library.mdf',
	size=4mb,
	maxsize=30mb,
	filegrowth=10%
)
log on
(
	name='Librarylog',
	filename='D:\Library.ldf',
	size=5mb,
	maxsize=25mb,
	filegrowth=1mb
)
go

当然这里我们默认是放在primary文件组下的。同时我们还可以创建次要数据文件和多个日志文件,结构都一样,主要包括五个属性,分别为:name,filename,size,maxsize,filegrowth。当然这里面有很多的注意点了,写一下试一试就能发现问题了。还有一个就是脚本的最后有go语句,它来表示批量执行哦。


2 创建表

use library
--创建表Readers
create table Readers
(
	RID int identity(1,1),
	RName varchar(20) not null,
	RAge int,
	RSex bit ,
	RAddress varchar(50)
)


这里我们看到了格式:字段名称 字段类型 [字段属性]。字段属性包括identity和not null两个,就这两个。有时候字段后面会跟上default(),但是它不是字段属性,它是字段的约束。default约束也是五个约束中唯一的一个设置方式不同的一个。关于约束我们下面会看。


3 创建约束

在sql server中,创建约束的方式有两种,一种就是在创建数据库表的时候同时创建约束,另外一种就是数据库表创建号之后再创建约束。约束的类型一共有五种,分别为:主键约束(primary key),外键约束(foreign key),检查约束(check),默认约束(default)和唯一约束(unique)。

--创建借阅表
create table Borrows
(
	BSID int identity(1,1),
	BID int not null foreign key references Books(BID),
	RID int not null foreign key references Readers(RID),
	BorrowDate datetime default(getdate()),
	ReturnDate datetime,
	primary key(BSID)
)


--添加约束
alter table Readers
add constraint CK_RaderAge
check(rage between 15 and 60)

--追加主键
alter table Readers
add constraint PK_Reader
primary key (RID)

--追加外键
alter table Borrows
add constraint FK_Book
foreign key (BID) references Books(BID)


--追加默认
alert table Readers
add constraint DF_ReturnDate
default (getdate()) for ReturnDate

我把追加默认约束单独那出来,可以发现它是和其它约束的写法不一样的。


4 创建事务

--借书的事务

begin transaction
declare @error int
set @error = 0
insert into borrows(rid,bid,borrowdate) values
		(5,10,2008-6-11)
set @error = @error + @@error

update books set bstate=1
where bid=10

set @error = @error + @@error

if @error <> 0
	rollback transaction

else
	commit transaction

事物三步曲:begin transaction,rollback transaction,commit transaction。在这里我们还看到了@error和@@error两个变量,前者是我们定义的局部变量,后者是sql server定义好的int型全局变量。定义变量的方式为:declare @error int 。而设置局部变量的方式为set @error = 0,还有一种方式为 select @error = 字段名称 from 表。顺便说一下,在sql server 种输出方式也有两种,一种是print,另一种是select 语句。前者打印的是文本,后者打印的是表格。

关于事务,就的提到事务的隔离级别了,分别为:读未提交,读已提交,可重复读和序列化。sql server默认的隔离级别为读已提交。不同的隔离级别产生的问题有:丢失修改(写写冲突),胀读,不可重复读和幻读。读未提交隔离级别会产生所有问题,而序列化不会产生任何问题。另外,幻读和不可重复读的概念也是不一样的哦,一个是对象的集合,一个是对象的状态。


5 索引

--索引
create clustered index IX_Books_Name
on Books(Bname)
with fillfactor 30

select * from books (index=IX_Books_Name)
where bname='计算方法'

看到了吧,创建索引很简单的,当然索引有四个类型(主键索引,唯一索引,聚集索引和非聚集索引),主键索引是为一个不同创建方式的索引,我们在创建主键的时候她就创建了,同时还设定为聚集索引。关于聚集索引和非聚集索引的概念也非常简单,使用字典就是很好的比喻,如果还不知到这两个概念,那赶紧查一下资料吧。使用它就更简单了,只要在查询的表名称后面加上index = 索引名称 就可以了。


6 视图

--借阅视图
create view V_Borrow
as 
 	select 图书编号=books.bid, 图书名=books.bname,
		读者编号=readers.rid,读者姓名=readers.rname,
		借阅日期=borrows.borrowdate,归还日期=borrows.returndate
	from books
	inner join borrows on books.bid=borrows.bid
	inner join readers on readers.rid=borrows.rid

这个就没有什么说的了,太简单了。


7 存储过程

sql server中的存储过程就像编程语言中的方法。他是一系列操作的封装。当然他也有名称,参数,方法体。对于参数的写法,和其他语言非常不一样的。

@lianxi  int [= 0] [output]

名称 类型 默认值 输入/输出

output代表的是输出参数。在这里输入输出参数是写在一起的,这也是和其他编程语言不一样的地方。下面是创建的方法:

create procedure xxx

@lianxi  int [= 0] [output]

as

xxxx

调用使用的是 exec 存储过程名称。

在sql server中存储过程又分为系统存储过程和用户自定义存储过程。上面讲的都是用户自定义存储过程。对于系统存储过程,sql server都把他们放到master系统数据库中的,在那里我们可以看到他的详细代码。另外还有的概念就是扩展系统存储过程。


8 对于视图我想多说一点是,如果通过试图查询出来的数据量很大,如何保证快速查询到试图中的某一个记录呢。我们无法在试图中创建索引阿?



9 我们知道在sql server中都有系统表,我们通过界面可以看到系统表中包含了大量的关于数据库、表、事务视图索引的信息。我们也知道mysql中也肯定有。为什么现在mysql的多个第三方管理工具都不增加察看这些系统表的功能呢。毕竟这些信息太重要了。


[size=medium;]接下来几个月的计划[/size]
[size=medium;]xml
ajax
面向对象
oracle
设计模式[/size]

你可能感兴趣的:(oracle,sql,编程,mysql,SQL Server)