设为首页 收藏本站
查看: 601|回复: 0

[经验分享] SQL Server数据库程序设计知识总结

[复制链接]

尚未签到

发表于 2016-11-4 09:48:42 | 显示全部楼层 |阅读模式
   SQL Server是由Microsoft开发和推广的关系数据库管理系统(DBMS,它最初是由MicrosoftSybaseAshton-Tate三家公司共同开发的,并于1988年推出了第一个OS/2版本。它只是众多关系数据库管理系统的一种,其它的关系数据库管理系统还有ServerOracleDB/2SybaseInformix;关系数据库:AccessFoxProDbase等。如今,数据库已经变成学习软件开发的核心课程之一,几乎绝大部分软件都涉及到数据库,很多数据必须存在数据库中。所以为了更好的掌握和操作数据库,对数据库知识的封装就显得尤为重要。
  
  关系和非关系数据库
  
   关系数据库是创建在关系模型基础上的数据库,由一个或多个二维关系数据表组成,通过建立表之间的关系来定义数据库的结构。在关系数据库中最重要的是数据表,数据表把相关联的数据按行和列排列到一起来描述一个实物。一个二维表称为一个关系,每一个关系又可以包含多个属性。
   和关系型数据库相比,非关系型数据库特别适合以SNS为代表web 2.0应用,这些应用需要极高速的并发读写操作,而对数值一致性要求却不甚高。关系数据库为了维护事务的一致性付出了重大代价导致了其读写能力下降,随着现在网络SNS的应用对并发读写能力要求极高,关系型数据库已经无法应付,因此,必须用新的一种数据结构化存储来来代替关系数据库。关系数据库的另一个特点就是其具有固定的表结构,因此,其扩展性极差,而在SNS中,系统的升级,功能的增加,往往意味着数据结构巨大改动,这一点关系型数据库也难以应付,需要新的结构化数据存储。于是,非关系数据库(NoSQL)应运而生。非关系数据库通常没有固定的表结构,严格上说不是一种数据库,应该是一种数据结构化存储方法的集合。
  
  SQL Server数据库基础
  
  首先我们从图中看他们之间的联系。
DSC0000.png
   一、T-SQLSQL的比较
   SQL全称为Structured Query Language,是关系数据库的标准语言,它主要包括三种语言:数据定义语言、数据操纵语言、数据控制语言。T-SQLSQL语言的增强版。
   也就是说,SQL三种语言适用于所有关系型数据库,但是它本身具有局限性,因为它只提供了对数据库数据基本的增删改查等命令,在开发拥有复杂结构的数据库程序时,只有SQL语言是远远不够的,于是各大公司在SQL基础上对它进行了增强。T-SQLMSSybase
SQL
DDL DML基础上,增加了延伸的函数、系统预存程序以及程式设计结
(例如 IF
WHILE)
让程式设计更有弹性。和T-SQL类似的增强版的SQL语言还有OracleSQL的扩展PL/SQL

  二、数据库对象
   数据库对象定义了数据库内容的结构。它们包含在数据库项目中,数据库项目还可以包含数据生成计划和脚本。在学习SQL Server时,最快的方法是先学习数据库对象。在研究了它们之间的异同点后,我把数据库对象分为三类。
DSC0001.png DSC0002.png DSC0003.png
   这三类数据库对象在功能上可能有重叠。
   1、基于表的对象
    表,数据保存在表中。
   基于表的对象我把它分为三类:
   视图,用来筛选出用户想要的信息,它是虚拟表,只封装语句,一定程度上保证表中数据的安全;
  索引,对数据库表中一个或多个列的值进行排序的结构,提供指针以指向存储在表中指定列的数据值,然后根据指定的排序次序排列这些指针。数据库使用索引的方式与使用书的目录很相似;
   约束、默认值、规则、触发器确保了数据完整性。
   2、数据库安全性:用户、角色、权限与数据库安全性中的登陆联合应用可以限制登陆者可进行的操作来保证数据库的安全性。
   3、块:存储过程和函数有点相似,但是存储过程可以返回Recordset;触发器是一种特殊的存储过程。
  三、DTS数据转换服务
   DTS的主要作用:1、导入与导出数据
  2、转换数据(检验、净化、重整数据)
   3、转换数据库对象
  四、管理和维护
    
在这部分中主要是对数据库文件的保护和管理。

  1、数据库文件
  
DSC0004.png
   数据库文件是存放数据库数据和数据库对象的文件。一个数据库可以有一个或多个数据库文件,一个数据库文件只属于一个数据库。当有多个数据库文件时,有一个文件被定义为主数据库文件,扩展名为.mdf,它用来存储数据库的启动信息和部分或全部数据。一个数据库只能有一个主数据库文件,其它数据库文件被称为次要数据库文件,扩展名为.ndf,用来存储主文件没存储的其它数据。
  多个数据库文件组合到一块就成为文件组。主文件组是由主文件组合成,此文件组是由此文件组合成,但是事务日志文件不属于任何一个文件组。
   2、事务和锁
   Ø 事务
    
事务(Transaction)是并发控制的单位,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一
个不可分割的工作单位。通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性。
   DSC0005.png
   事务通常是以BEGIN TRANSACTION开始,以COMMITROLLBACK结束。

COMMIT
表示提交,即提交事务的所有操作。具体地说就是将事务中所有对数据库的更新写回到磁盘上的物理数据库中去,事务正常结束。


ROLLBACK
表示回滚,即在事务运行的过程中发生了某种故障,事务不能继续进行,系统将事务中对数据库的所有以完成的操作全部撤消,回滚到事务开始的状态。

  Ø 锁
   数据库就是通过锁机制来解决并发问题的。。主要就是两种锁,共享锁和排他锁(也叫独占锁)。
   从程序员的角度看锁分为以下两种类型:
   乐观锁(Optimistic Lock):乐观锁假定在处理数据时,不需要在应用程序的代码中做任何事情就可以直接在记录上加锁、即完全依靠数据库来管理锁的工作。一般情况下,当执行事务处理时SQL
Server
会自动对事务处理范围
内更新到的表做锁定。
  悲观锁(Pessimistic Lock):悲观锁对数据库系统的自动管理不感冒,需要程序员直接管理数据或对象上的加锁处理,并负责获取、共享和放弃正在使用的数据上的任何锁。
  
  应用实例

/*--下面我们新建一个名为company的数据库,创建三个表priduct、project、tblsales,并在其中创建默认值、规则、触发器、存储过程,并利用用户、角色、权限等确保数据库安全。*/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_priduct_project]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
ALTER TABLE [dbo].[priduct] DROP CONSTRAINT FK_priduct_project
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[getavgpbiaodi]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[getavgpbiaodi]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[pinfo5000]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[pinfo5000]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[pro]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[pro]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sysconstraints]') and OBJECTPROPERTY(id, N'IsView') = 1)
drop view [dbo].[sysconstraints]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[priduct]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[priduct]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[project]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[project]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tblsales]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[tblsales]
GO
if exists (select * from dbo.systypes where name = N'tele')
exec sp_droptype N'tele'
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[rule_position]') and OBJECTPROPERTY(id, N'IsRule') = 1)
drop rule [dbo].[rule_position]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[@position]') and OBJECTPROPERTY(id, N'IsDefault') = 1)
drop default [dbo].[@position]
GO
create default [@position] as '其它'
GO
create rule [rule_position] as @postion in('项目经理','秘书','会计','职员','其它')
GO
setuser
GO
EXEC sp_addtype N'tele', N'smallint', N'not null'
GO
setuser
GO
CREATE TABLE [dbo].[priduct] (
[产品ID] [int] NULL ,
[产品名称] [char] (20) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[project] (
[项目编号] [int] NOT NULL ,
[项目名称] [char] (10) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[开始日期] [datetime] NULL ,
[预计日期] [int] NULL ,
[客户编号] [int] NULL ,
[负责人编号] [int] NULL ,
[项目标的] [int] NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[tblsales] (
[number] [int] NOT NULL ,
[name] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[sex] [char] (2) COLLATE Chinese_PRC_CI_AS NULL ,
[birthday] [datetime] NULL ,
[salary] [money] NULL
) ON [PRIMARY]
GO
setuser
GO
EXEC sp_bindefault N'[dbo].[@position]', N'[project].[项目标的]'
GO
EXEC sp_bindrule N'[dbo].[rule_position]', N'[project].[项目名称]'
GO
setuser
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
--/****** Encrypted object is not transferable, and script can not be generated. ******/
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
create procedure getavgpbiaodi
@name varchar(10),@avgpbiaodi int output
as
declare @errorsave int
set @errorsave=0
select @avgpbiaodi=avg(项目标的)
from project as p inner join pmanager as pm on p.负责人ID=pm.负责人ID
where pm.姓名=@name
if(@@error<>0)
set @errorsave=@@error
return @errorsave
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
create procedure pinfo5000
as select * from project where 项目标的>=5000
order by 项目标的 desc
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
create procedure pro
@n1 int,@n2 int,@n3 int,@avreage int output
as select
@avreage=(@n1+@n2+@n3)/3
declare @avgscore int
exec pro1 1,2,3,@avgscore output
select 'The score is:',@avgscore
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

  

  SQL Server的基础框架知识,我现在只能总结这么多,更多的总结还是在以后一点一滴的学习中。
  
  
  


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-295632-1-1.html 上篇帖子: SQL2000-DBCC DBREINDEX重建索引提高SQL Server性能 下篇帖子: 自动创建ODBC数据源(Access,Sql Server,DB2
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表