sql server概述及应用
一.sql server常用工具介绍:
1. 企业管理器:
* sql server大管家,针对于数据库的所有内容做控制管理
* 包括数据库建立,数据表的建立,数据添加删除修改查看等
* 数据库安全管理,数据库访问控制等。
2. 查询分析器:
可执行任何的sql 语句,完成查询、添加、删除、修改等操作,并且可以通过语句控制管理
数据库以及数据表等
3. 服务管理器:
可以针对于 sql server服务 以及 sql server agent 服务进行控制管理,如
启动某一服务或停止某一服务。
4. 导入与导出数据:
将非sql server数据库中的数据,通过该工具与 sql server数据库实现转化。
5. 事件探查器:
探查器可以随时监控数据库服务器所发生的所有事件。包括哪个用户对哪个数据库及对象做出
何种操作。
探查器在工作时,会占用大量内存及cpu资源,因此建议不要长期运行,否则会影响服务器性能。
二. sql server 目录:
* sql server 程序目录 C:\Program Files\Microsoft SQL Server\MSSQL
* sql server 数据库目录 C:\Program Files\Microsoft SQL Server\MSSQL\Data
三. 在企业管理器中默认的六个数据库:
[master tempdb model msdb northwind pubs]
1. master数据库:
sql server核心数据库,用于保存整个sql server的所有配置,包括用户帐号、密码、
所有的数据库名称、字段、安全配置、以及与数据库有关的所有sql语句代码。
master数据库的各种操作,均由sql server 本身自行完成,用户不允许对其数据库做操作。
2. tempdb数据库:
临时数据库,用于临时存放数据,如针对数据库进行建立索引,或者复制数据库以及创建数据库
时,都需要借助临时数据库,进行数据临时存放.
临时数据库,不允许做对应的操作,而是由sql server 自行管理.
3. model数据库:
(模板数据库)
在建立一个新数据库时,必须由模板数据库提供最基本的结构以及基本的数据,并将这些
内容复制到新数据库中.因此一个新的数据库结构与模板数据库结构是一致.
4. msdb 数据库:
(分布式数据库)
sql server具备监控数据库服务器的功能,而所有的监控记录会保存在 msdb 数据库中.
5. northwind 与 pubs 数据库:
这两个数据库是sql server提供的实例,与系统无关.
四. sql server中数据库的对象:
[每建立一个数据库后,该数据库就自带多个对象]
1. 表 =>又称为数据表,数据库中所有的数据,均存放于数据表中. 又分为系统数据表与用户数据表
2. 关系图 =>用于指定两个数据表或多个数据表之间的关系.比如学员信息表与学员成绩表之间,应
该按照学员编号进行关联.
3. 视图 => 一段select 代码,用于查询指定的数据,只是将这一段代码用一个特定的名称表示而已
4. 存储过程 => 一段 sql 代码,用于完成sql server某项特定功能, 同时也可以由用户自行编写
新的存储过程. (存储过程即sql server中的子程序)
5. 规则 => 为数据表中的各字段添加指定的条件,以限制各字段数据输入的准确性.
6. 默认 => 当为数据表添加数据时,若没有为指定字段添加数据,则该字段会采用默认的数据填充.
7. 用户 => 针对于不同的数据库,指定不同的管理员,或者设置指定的用户允许访问特定的数据库以
及特定的数据库对象.
8. 角色 => 相当于服务器系统中的组,不同的角色有不同的权限,将用户添加到指定的角色,则该
用户就与该角色有相同的权限.
9. 自定义类型 =>用户自行创建对应的数据类型,可以将规则与默认也添加到自定义类型中
10. 自定义函数 =>用户自行创建函数,建立特定功能的函数.
五. 建立数据库的方法:
1. 认识数据库对应的文件:
MDF =>数据库的主文件, 每个数据库必须有该文件,而且只有一个.
NDF =>当数据库过大时,会导致主数据库文件过大,影响数据库的存取速度,因此可以
增加辅数据库文件,用于分摊整个数据库的数据,提高访问速度.
辅数据库文件允许存在多个,也可以没有.
LDF => 事务文件,用于存放数据库的运行情况以及错误信息等.
2. 建立数据库方法:
在企业管理器中,选择
指出数据库的名称,是否要采用辅数据库文件,以及数据库的容量增长方式.
还有数据库的最大值.
六.创建数据表:
1.数据表中各字段的数据类型:
[字符型,数字型,日期型,货币型,二进制类型,位类型,国际字符类型]
. 字符型:
* char 型 ==>定长型字符串类型 最大长度为 8000
* varchar 型 ==>变长型字符串类型 最大长度为 8000
* text 型 ==>文本型数据类型(变长) 最大长度为 2^31
. 数字型:
* bigint型 =>大整数类型 -2^31 ~ 2^31
* int 型 =>整数类型 -2^16 ~ 2^16
* smallint 型 =>小整数类型 -32768 ~ 32767
* tinyint 型 =>微整数类型 0 ~ 255
* float 型 =>浮点型(小数)
* real 型 =>实型(小数)
* numeric 型 =>数值型(小数)
. 日期型:
* datetime 型 =>日期时间型 1753-1-1 ~ 9999-12-31 ,精确到1/300秒
* smalldatetime 型 =>小日期时间型 1900-1-1 ~ 2079-6-6 ,精确到分钟
. 货币型:
* money 型 => -2^63 ~ 2^63 , 精确到 万分位
* smallmoney 型 -2^31 ~ 2^31 ,精确到万分位
. 二进制数据类型
* binary 型 => 定长二进制类型 ,最大长度为 8000
* varbinary 型 => 变长二进制类型, 最大长度为 8000
* image类型 =>变长大二进制 ,最大长度为 2^31
. bit 位类型:
位类型,即数据只允许是 0 或 1 两个.
当输入0以外的其他值时,均看作 1
bit 类型,通常用作 逻辑类型, 表示 是 / 否
. unicode 类型
[用于国际上非英语语言]
* nchar 型 => 定长型 最多为 4000个字符
* nvarchar 型 =>变长型 最多为 4000个字符
* ntext 型 =>变长型, 最多为 2^30 个字符
2. 建立数据表的方法:
打开企业管理器|数据库|表,右键打开,选择
在窗口中,指出各字段,以及字段对应的数据类型
注意: 数据表中,应指定一个具体的字段为 主键
对于编号的字段,可以设定为自动编号 (标识)
对于字段不允许为空的, 应该选中
七. asp连接sql server 的方法:
db.open
其中 server 表示服务器IP地址
database 表示要连接的数据库
uid 表示连接时的帐号
pwd 表示连接时的密码
driver 表示连接时所使用的驱动程序
sql 语句具体用法
一.sql 介绍:
sql 称为结构化查询语言,是所有关系型数据库的标准.
该语言查询及操作时,完全面向结果,即用户只需要提出需求,则
sql 语句就可以立刻返回对应的结果,而具体的过程则无需关心.
sql server中所提供的查询分析器,可以执行各种sql 语句,同时查询分析器还具备
采用sql 语句实现代码编写,即sql server 二次开发.
sql server 所提供的sql 语句,称为 T-sql 或交互式sql 语句.
sql server 可以提供 select 语句,delete语句,update语句,insert语句等
二. select 语句用法:
1.采用select语句,查询整个数据表
select * from xyxx
注意: * 表示所有字段
2.查询指定的数据表字段
select xh,xm,xb,nl,zy from xyxx
注意: 只查询五个字段的数据
3.查询指定的数据表字段,并且别名表示字段名
select xh as 学号,xm as 姓名,zy as 专业 from xyxx
注意: 查询了三个字段,用学号表示xh,用姓名表示xm,用专业表示zy
4.查询数据表的前N条数据记录
select top 10 * from xyxx
注意: top 10 表示取出数据表的前 10 条记录
select top 10 * from xyxx order by shf desc
5.显示某一个字段中不重复的所有数据:
[显示出全班的同学分别来自哪些地区]
select distinct 字段名 from xyxx
select distinct dz from xyxx
6.select 语句中的统计函数:
[相关的统计函数包括 sum avg max min count ]
select avg(yw) as 语文平均分 from xycj
select count(yw) as 语文及格人数 from xycj where yw>=60
select count(xh) as 全班总人数 from xycj
7. 按条件进行数据查询:
. 条件语句的格式:
select * from xyxx where 具体的条件
如 select * from xyxx where shf
select * from xyxx where zy='一年网络' and xb=1
[找出专业为一年网络并且是男同学]
. 采用 关键字 in 来表示条件所在的具体范围:
select * from xyxx where 具体条件
如 select * from xyxx where xh in (95003,95007,95008,95010)
说明: (95003,95007,95008,95010) 是一个集合.
而条件是判定 xh 在 上述的集合中.
. 采用 between 制定条件所在的范围:
如 select * from xyxx where nl between 16 and 33
其中 between 表示在....之间
上述的语句,表示查 nl 字段 在 16 到 33 之间的数据记录
. 采用模糊查询方式,进行数据搜索:
select * from xyxx where dz like '%西%'
其中 % 表示任意的字符
like 表示相似类似
select * from xx where xw like '%汽车%'
找出xw字段含有汽车两字的.
8. 数据排序:
按照某一个字段的升序或者降序 进行排列数据记录
select * from xyxx order by 字段 排序方式
说明: order 排序
by 按照
字段,即为要排序的依据
排序方式 asc -->升序,也是默认的方式
desc -->降序
select * from xyxx order by shf desc
select * from xyxx order by dz desc,xh desc ==>如果第一个排序字段相同,则采用第二个字段排序.
9. 字段组合:
select *,(yw+sx+yy+jsj+ty) as 总分,(yw+sx+yy+jsj+ty)/5 as 平均分
from xycj where (yw+sx+yy+jsj+ty)>=400 order by 总分 desc
例 select xh from xycj where (yw+sx+yy+jsj+ty)>=400
10. 数据分组查询:
[按照指定的字段进行分类]
select 分组的字段,统计函数 from 数据表 group by 分组字段
如 select xb,avg(shf) from xyxx group by xb ==>按性别进行分组,统计每组的平均生活费
select dz,avg(shf) from xyxx group by dz ==>按地区进行分组,统计每组的平均生活费
11. 分类汇总数据:
select * from xyxx order by xb compute avg(shf) by xb
分类汇总,即按照某一个字段进行分类, 同时将每一种进行汇总统计
[如 按地区进行分类,同时将每个地区的学员的平均年龄求解 ]
[分类汇总时,一定要注意在分类时一定要为分类的字段做排序操作,否则出错]
如
select * from xyxx order by dz compute avg(nl) by dz
12. 多表查询:
. 所要查询的数据,来自于多个数据表
[要查询所有同学的学员信息以及考试总分,这些信息分别来自于学员信息表与学员成绩表]
select * from xyxx,xycj ==>数据表1中的每一条记录都要与数据表2中所有记录对应
[该方式查询是错误的]
select * from xyxx,xycj where xyxx.xh=xycj.xh ==>在查询时,要找出数据表1中的
关联数据与数据表2中
的关联数据相对应
select xyxx.xh,xm,xb,(yw+sx+yy+jsj+ty) as zf from xyxx,xycj where xyxx.xh=xycj.xh and (yw+sx+yy+jsj+ty)>=400
. 通过多表子查询的方式,实现多表查询
select * from xyxx where xh in ===>找出学号在集合当中的信息
(
select xh from xycj where (yw+sx+yy+jsj+ty)>=400 ===>该语句产生了满足条件的所有学员
的学号,并形成一个学号集合
)
. 通过不存在性查询,实现不关联的数据查询
[如在学员信息表中存放全班所有学员的信息,但学员成绩表中会存在没有成绩的学员]
select * from xyxx where not exists
(
select * from xycj where xyxx.xh=xycj.xh
)
说明: select * from xyxx ===>找出xyxx表中所有数据
select * from xyxx,xycj where xyxx.xh=xycj.xh ===>多表查询后的结果(关联)
not exists ===>不存在性查询的关键字
注意: 不存在性查询的子语句 select * from xycj where xyxx.xh=xycj.xh ,不需要再指出xyxx 数据表
13. 通过selete语句,将select查询结果,保存为数据表
select * into lqxyb from xyxx where xh in (select xh from xycj where zf>=400)
三. insert 语句用法:
[insert 语句, 即向指定的数据表中,添加数据记录]
insert 语句的格式
insert into 数据表名(字段名1,字段名2,字段名3,...) values(数据1,数据2,数据3,...)
例:
insert into xyxx(xm,xb,nl,dz,rxrq,shf,zy) values('江民',1,50,'北京','2010-7-1',800,'一年网络')
四. update 语句用法:
[update语句,即用于对指定数据表做数据记录的修改]
update语句的格式
update 数据表名 set 字段名1=数据1,字段名2=数据2,字段名3=数据3... where 条件
在进行使用update语句时,一定要添加上 条件, 否则将会修改数据表中所有记录
例:
update xyxx set xm='王有民',nl=60,dz='上海',rxrq='2009-8-1' where xh=95025
五. delete 语句用法:
[delete语句,即用于对指定数据表中记录做删除操作]
delete语句的格式
delete from 数据表名 where 条件
在使用delete语句时,一定要添加 条件, 否则将删除数据表中所有记录
索引的应用
一.索引的介绍:
* 索引可以高效地快速地在大量数据记录中,找到所需要的数据.
[相当于书本的目录]
* 索引通常是针对于大型的数据表,以及记录数较多的场合下应用.
* 索引的建立是需要花费较多的计算机与服务器资源的.
当数据记录发生变化时或者数量发生变化时,索引必须要重新建立
二. 创建索引的注意事项:
* 数据表的记录数很少,通常不需要建立索引
* 不要为某一个数据量很少的字段建立索引,如 性别
* 不要为某一个数据量很大的字段建立索引,如 简介 或者 文章的内容
* 数据表的添加、删除、修改等操作远远大于查询操作,此时也不要建立索引
针对于学员信息表,可以为数据表中 学号 姓名 地址等建立索引
三. 索引的类型:
1. 按结构分类:
* 聚集索引
聚集索引,在数据表中,只允许有一个存在,通常是主键.
聚集索引建立后,会存在一个以主键为内容的小表,该小表的数据存放地址与原数据表完全相同
当查询时,找到小表中的数据,也就表示找到了原数据表中的数据记录.
* 非聚集索引
非聚集索引,在建立索引时,会产生一个小表,小表中存放建立索引的字段,以及对应
数据记录所在的存储地址。
当查询时,先在小表中找到数据,然后对应找到存储地址,最后通过存储地址,找到
原数据表中的数据记录。
2. 按索引唯一性分:
* 唯一性索引 => 建立索引的字段是唯一的
* 非唯一性索引 =>建立索引的字段不唯一
四. 索引创建方法:
打开数据表的设计窗口,右键打开选择
* 如果数据表已经有了主键,则会自动存在一个 聚集索引与唯一性索引
* 若要为其它字段建立索引,如 姓名,可以单击
,并指出是否为聚集索引(如果有了主键,则不能再建立聚集索引)
指出是否为唯一性索引,(如果该字段存在相同的数据,则也不能建立唯一性索引).
* 通常不能建立聚集索引与唯一性索性,则该索引称为非聚集非唯一性索引。
五. 索引的管理:
在企业管理器的数据表上,右键打开“所有任务|管理索引”
可查看到数据表中所建立的所有索引,包括建立的字段名与类型。
若要修改索引,则直接单击“编辑”按钮即可.
注:
数据表建立了索引后,可以在对大量数据查询时,提高记录的查询的速度。
客户首先将查询的条件提交给数据库服务器,服务器收到条件后,去查询索引表,根据索引表,
找到对应的数据记录存储位置,并根据位置找到对应的数据记录。
在这个过程当中,客户并没有直接与索引接触。
数据导入导出中的驱动程序:
* ODBC ==> 开放式数据库连接
如在asp中调用odbc的方法:
先在控制面板|管理工具|ODBC| 建立系统数据源,要求指出驱动程序,数据库以及名称
接着在asp中直接调用所建立的odbc即可,若odbc的名称为 wdlj , 则在asp中直接
通过 db.open wdlj 调用即可.
* 在sql server中sql server的驱动程序有:
用于 sql server 的 microsoft odbc 驱动程序 ==>通过odbc调用.
用于 sql server 的 microsoft ole db 驱动程序 ==>该驱动为sql server本身驱动程序
* 在 sql server的 access 驱动程序有:
microsoft access ==>access驱动程序
* 在 sql server的 excel 驱动程序有:
microsoft excel 97-2000 ==>excel 驱动程序
在sql server中链接服务器的使用方法:
. 通过sql server中的链接服务器,链接 access 文件
* 打开企业管理器|安全性|链接服务器,右键打开,选择“新建链接服务器”
* 指出链接服务器的名称,如 access123456 [任意]
指出链接服务器的驱动程序, 此处所使用的驱动为通用的桌面型数据库驱动程序
microsoft jet 4.0 ole db provider
指出所要链接的产品名称,如 access [任意]
指出数据源 , 即 所要链接的access文件路径与文件名,如 d:\aaa\db1.mdb
确定后完成即可。
* 链接服务器建立完成后,必须通过查询分析器以及sql 语句查询
如 select * from access123456...xyxx
------------- ----
链接服务器名称 ... 数据表
. 通过 sql server中的链接服务器,连接 excel 文件
* 在新建链接服务器窗口中,指出链接服务器名称,如 excel9900
指出链接服务器的驱动程序, microsoft jet 4.0 ole db provider
指出所要链接的产品名称,如 excel
指出数据源,如 d:\aaa\123456.xls
指出程序字符串, excel 5.0 [excel的程序字符串,必须是 excel
确定后完成即可。
* 使用的方法与access链接服务器相同。
sql server中权限配置方法
一.在 sql server 中建立允许登录到 sql server 的登录帐号:
[与数据库暂时无关]
1. 建立采用sql server验证的用户登录:
* 在企业管理器|安全性|登录,新建登录
在窗口中指出登录的新帐号,如 wuwei 5.0]
选择登录类型为 sql server身份验证
并指出登录的密码,即可.
2. 建立采用windows身份验证的用户登录:
[与windows计算机中的用户有关]
* 打开windows计算机中的本地用户和组窗口,在其中,首先建立一个新的用户,如 xp
* 完成后,在sql server企业管理器中,打开安全性|登录,并在其中新建登录
在登录帐号中,选择刚刚所建立的windows用户帐号,如 xp
登录类型选择
完成即可.
3.注意:
如果采用windows身份验证,并且该用户已被添加到 windows计算机中的administrators 组内,
则用该windows用户登录后,可以完全控制整个sql server服务器,原因在于其已经服务器管理员.
无论哪种方法登录,如果用户是普通的帐号,则其虽然可以登录数据库服务器,但是其并没有
访问数据库的权限,因此打开数据库均会提示出错。
二. 为数据库指定用户访问:
[当用户登录到sql server服务器后,实际上该用户并不能访问及显示数据库内容]
方法:
如果要使登录的用户,能够访问指定的数据库,则只需要将登录的用户帐号添加到指定的数据库中,
或者设定登录帐号允许访问指定的数据库。
* 打开登录帐号的属性|数据库访问, 在窗口中,选中所要访问的数据库即可
或者
打开企业管理器中指定数据库|用户,右键打开“新建数据库用户”,在窗口中选择指定的用户,
确定即可。
说明:以上操作,可以使用户查看到数据库中的对象信息,包括名称,类型,时间等
但是要操作或者访问其中的对象,则仍然是不允许。
三. 数据库中各对象的权限配置:
[虽然登录的用户已经允许访问数据库,但是由于没有配置其中的对象权限,因此仍然不能访问其中的对象]
* 采用管理员登录后,进入数据库对象的属性,如数据表xyxx的属性,打开
在其中,为指定的用户选择指定的权限.
如 select ==>查询权限
insert ==>添加权限
update ==>修改权限
delete ==>删除权限
dri ==>继承权限
如果是一个存储过程(一段程序代码) ,则其权限只有 exec ==>执行权限
四. 角色及服务器角色:
1. 角色:
与windows服务器中所述的 组 一致,每个角色都有特定的访问权限,只要将用户添加
到特定的角色中,则该用户具有了与角色相同的权限.
[角色是不能用于登录]
2. 服务器角色:
sql server中的服务器角色共八个, 用户是无法针对于这些服务器角色做添加删除修改等操作.
服务器角色针对数据库服务器进行权限配置,因此该类角色是完全针对于服务器,而不是某一个数据库
3. 服务器角色的内容:
* bulk insert administrators 具备插入记录权限
* database creators 具备建立数据库权限
* disk administrators 具备数据库文件管理权限
* process administrators 具备数据库服务器进程管理权限
* security administrators 具备数据库服务器安全配置权限
* server administrators 具备数据库服务器范围配置权限
* setup administrators 具备数据库服务器中存储过程配置权限
* system adminstrators 具备数据库服务器所有的权限
五. 数据库角色:
服务器角色针对于整个sql server服务器
数据库角色是针对于某一个数据库而配置的角色.
每一个数据库都有对应的数据库角色,默认有十个数据库角色,而且也允许用户自行建立数据库角色
以及修改与管理新建的数据库角色.
1.默认的十个数据库角色:
* db_accessadmin ==>具备数据库访问权限(所有的数据)
* db_backupoperator ==>具备数据库备份与还原权限
* db_datareader ==>数据读取
* db_datawriter ==>数据写入
* db_ddladmin ==>数据库关联文件管理
* db_denydatareader ==>拒绝数据读取
* db_denydatawriter ==>拒绝数据写入
* db_owner ==>数据库所有者(具备所有的权限)
* db_securityadmin ==>数据库安全管理(帐号以及登录与权限)
* public ==>普通用户(所有新建的用户均属于该角色,权限最小)
2.在 sql server中建立自定义的角色:
* 在数据库中的角色一项中,右键打开新建数据库角色,指出具体的名称,如 js
* 确定后,再次打开所新建的角色,单击权限选项,为该角色配置对应的权限(与用户权限配置方法相同)
* 可以在界面中单击添加,指出要添加哪些用户到当前角色中.
六. sql server中数据库的备份与恢复方法:
T-sql 程序设计
一.sql server中的批与脚本:
脚本: sql server中脚本,即可以完成特定功能的一段代码,如通常会在企业管理器中,
将数据库生成 sql脚本 , 到另外的计算机中,将sql脚本导入到查询分析器中执行,
则新的计算机也将具有与原计算机相同的数据库结构.
sql server中脚本,通常是由 批 组成的
批: 通常一个脚本,会由一个或多个批组成, 每一个批将以 GO 代码结束.
整个脚本,实际也可以由一个批组成,也可以省略 GO 代码.
而通常的批在脚本中,是用于完成该脚本中的某一项子功能,如用于在脚本中建立 xyxx 数据表
或者用于在脚本中检测xycj数据表是否存在等.
注: 如果脚本中有多个批,若其中的一个批出现故障,则剩下的批将不再执行.
二.sql server中的变量:
(局部变量 全局变量)
1.局部变量:
sql server中的局部变量,与其它程序设计中的变量类似,均是用于临时存放程序运行过程
中的数据.当程序结束后,该变量将消失,不可用.
sql server中局部变量,其采用 @名称 表示,如 @sm
* 局部变量要使用,首先必须要定义才行,定义的同时还需要指定其数据类型
定义的方法:
declare 变量名 数据类型
如 declare @sm int
* 为局部变量进行赋值
方法一 set 变量名=数据
方法二 select 变量名=数据
例:
declare @sm int,@pjshf real
select @sm=count(xh) from xyxx
select @pjshf=avg(shf) from xyxx
print '网络班全班总人数为' + convert(varchar(10),@sm) + '人'
print '网络班全班的平均生活费为' + convert(varchar(20),@pjshf) + '元'
其中 convert(varchar(20),@pjshf) ==>将@pjshf变量中的数据,转化为变长型字符串,最大长度为20
2.sql server中全局变量:
sql server中全局变量采用 @@表示,全局变量的名称是一定的,用户不可以随意修改.
全局变量可以在sql server中的任何一个程序中调用.
通常全局变量是用于表示sql server运行过程中的相关数据,如数据表中被修改的记录数
* @@connections ==>sql server从启动至今,所有的连接总数,包括未连接的数目.
* @@error ==>存放了上一条sql 语句执行后的错误代码,如果错误代码为0,表示没有错误.
* @@identity ==>存放了最近一次插入的自动编号
* @@rowcount ==>存放上一条sql语句所影响的记录数
* @@version ==>sql server服务器的版本
sql server中的语句结构
一. if 条件语句结构:
if 语句,用于条件判定,即条件成立时,执行一段代码,条件不成立时,执行另外一段代码。
格式:
if 条件
代码1
else
代码2
上述的代码格式中, 代码1与代码2 只允许存在一行代码,因此如果有多行代码,则必须
采用 begin ... end 包括。
实际上 begin ... end 包括的是一个语句块。
例:
select @zrs=count(xh) from xycj
select @sxrs=count(xh) from xycj where yw+sx+yy+jsj+ty>=400
select @dbl=@sxrs*100/@zrs
if @dbl>=40
begin
print '班级的达标率为' + convert(varchar(10),@dbl) + '%,已经达标!'
end
else
begin
print '班级的达标率为' + convert(varchar(10),@dbl) + '%,班级未达标!'
print '此处是代码结束了'
end
二. sql server中的while循环语句:
while 条件
代码
说明: 上述的代码中,只要条件成立,则循环将一直执行对应的代码。
如果不加 begin ... end ,则代码只允许一行。
因此通常的循环语句应该为
while 条件
begin
具体代码段
end
循环语句在设计时,一定要注意循环必须存在结束的语句,否则循环一直执行下去,并且
造成死循环。
例:
declare @i int,@zh int
select @i=1
select @zh=0
while @i
begin
select @zh=@zh+@i
select @i=@i+1
end
print '1+2+3+4+...+499+500=' + convert(varchar(10),@zh)
例:
declare @i int,@j int
select @i=95001
select @j=95023
while @i
begin
select * from xyxx where xh=@i
select @i=@i+1
end
三. return 语句:
return 即返回,通常用于在用户自定义的函数中,采用return返回函数执行的结果。
return语句通常放在自定义的函数末尾,由于return语句以后的代码是不会被执行。
四. waitfor 语句:
waitfor 语句,可以实现程序代码的暂停,时隔多久或者什么到达什么时间再继续执行。
waitfor语句的两种用法:
waitfor delay '00:00:19' ==>暂停 0小时0分钟19秒
waitfor time '13:12:09' ==>暂停到 13点12分09秒
五. print 语句:
将数据作为消息输出到 查询分析器中
六. sql server中函数的具体应用:
1. 数学函数:
* abs
求数据的绝对值
abs(-980) ==>结果 980
* ascii
求一个字符所对应的ascii码
ascii('A') ==>结果为 65
* avg
求出某一个字段的平均值
select avg(nl) from xyxx ===>求出数据表中nl的平均值
* count
求出某一个字段的数据数目
select count(xh) from xyxx ==>求出数据表中字段xh 的数目[实际上也是记录数]
* power
求出x的y次方
print power(2,3) ==>求出2的3次方
* sign
用于判定一个数据是否为负数(判定一个指定数据的符号)
print sign(-123) ==>结果为-1
print sign(100) ==>结果为 1
* rand
用于产生一个随机数,范围在 0 ~ 1 之间
rand(100) ==>产生一个0 ~ 1的小数
例 print rand() ==>未给定随机数种子,则采用当前计算机时间作为种子
如果要得到一个较大的随机数,通常是将该随机数扩大 N 倍, 即 rand()*10000
* round
针对于数据进行四舍五入
round(345.65,1) ==>结果为 345.7
其中的参数 1 表示要近似到小数点后的位数
round(345.65,0) ==>结果为346
其中的参数 0 表示近似到小数点后的0位数
注意,针对于带小数点的数据,如果要实现取整,则可以直接将数据赋值给一个整型的变量即可
declare @a real,@b int
set @a=789.123
set @b=@a
print @b ==>结果为 789
2. sql server中的字符串函数:
* len
求出字符串的长度(字符串中字符的个数)
len('abcde测试') ==>结果为 7 ,即7个字符
* datalength
求出字符串所占的字节数
datalength('abcde测试') ==>结果 9, 占9个字节(一个汉字占两个字节)
* left
从字符串左侧开始,连续取 x 个字符
left('abcdefg',2) ==>结果为 ab
* right
从字符串右侧开始,连续取 x 个字符
right('abcdefg',2) ==>结果为 fg
* substring
从字符串的指定位置开始,连续取 x 个字符
substring('abcdefghijkl',4,3) ==>def
注意,通常情况下,可以采用该函数结合循环语句,可以检测字符串当中的每一个字符
substring(字符串,变量,1) ==>通过循环改变 变量的值
例
declare @a varchar(150),@b int ,@c varchar(150)
set
@a='1234sadf4353214dsaf3245567768ljlj4532s3425fdsafd[1**********]345fdgfdgfds[**************]43'
set @c=''
set @b=1
while @b
begin
if substring(@a,@b,1)'z'
begin
set @c=@c + substring(@a,@b,1)
end
set @b=@b+1
end
print @c
* replicate
可自行重复指定的字符
replicate('a',10) ==>结果为 10个a字符
* stuff
将字符串当中的指定数据,替换成另外的一组数据
格式 stuff(字符串1,x,y,字符串2) ==>将字符串1中,从第x位开始,连续取y位,
用字符串2替换
print stuff('abcdefghijk',2,4,'中国') ==>结果为 a中国fghijk
* reverse
将指定字符串实现倒置
reverse('abcdef') ==>结果为 fedcba
3. 日期函数:
* getdate()
可以获取当前计算机的日期时间
print getdate() ==>结果为 01 9 2003 2:25PM
* datepart
可以返回指定日期时间中的指定数据,如要求返回年份或者返回月份
格式:
datepart(参数,具体的日期时间)
参数如下
year ==>返回年份
month ==>返回月份
day ==>返回天数
hour ==>返回小时
minute ==>返回分钟
second ==>返回秒
weekday ==>返回星期数
例:
print convert(varchar(10),datepart(year,getdate())) + '年'
+ convert(varchar(10),datepart(month,getdate())) + '月'
+ convert(varchar(10),datepart(day,getdate())) + '日' ==>最终结果为 2003年1月9日
* dateadd
为指定的日期添加对应的数据,如在现在日期基础上添加一年
格式
dateadd(参数,数据,日期)
参数与 datepart参数一致
例 dateadd(year,3,getdate())
4.系统函数:
* current_user ==>显示当前操作数据库的用户
* system_user ==>显示当前登录信息
* host_name() ==>显示sql server 计算机名
* isdate()
用于判定具体的数据是否为日期格式
例 isdate('2010-2-31') 结果为 0
isdate('2010-3-31') 结果为 1
* isnumeric()
用于判定具体的数据是否为数字
例 isnumeric('abcd') 结果为 0
isnumeric('100') 结果为 1
isnumeric('123e5') 结果为 1 ,其中的e 为科学记数法
isnumeric(200) 结果为 1
* isnull(表达式1,表达式2)
用于判定表达式1值是否为空,如果为空,则返回表达式2.否则返回表达式1.
isnull函数,主要用于判定数据库中某一个字段是否为空值(注意不是空字符串)
例:
declare @a varchar(5),@b varchar(9)
set @a=''
set @b='678'
print isnull(@a,@b) ==>结果为空字符串 ,其中@a 中存放的是空字符串,即有数据.
七. 用户自定义函数:
当sql server中没有所需的函数时,则可由用户自行创建一个对应的函数
1.自定义函数的建立方法:
可以通过企业管理器数据库中的自定义函数界面进行建立
或者
通过在查询分析器中输入建立自定义函数的代码,并执行来建立.
2. 具体的代码:
create function 自定义函数的名称 (@参数名 具体类型)
returns 返回结果的类型
as
begin
具体的函数体代码
return 具体数据(函数执行后的结果)
end
说明: 自定义函数的名称,是用于表示所创建的函数,不能与已存在的函数重名
@参数名 ==>函数执行时,需要由外界传数据给函数,此处的参数即为传递数据之用
返回结果的类型 ==>每个函数最终都要返回具体的数据,因此必须指定一个类型
例:
create function pj (@xh int)
returns real
as
begin
declare @fs real
select @fs=(yw+sx+yy+jsj+ty)/5 from xycj where xh=@xh
return @fs
end
3.自定义函数的调用方法:
格式 dbo.自定义函数名(具体参数)
如 print dbo.pj(95006) ==>此处将95006传给函数pj中的@xh,并执行函数
八.事务处理:
操作序列,序列中的操作作为一个不可分割的工作单元,这些操作要么全部执行,要么都不执行,是
不可分割的工作单元.
例如,在银行转帐时,必定是从A帐号中减少 1000元,而在B帐号中增加 1000 元. 这两个操作缺一不可.
事务处理的主要功能是,当事务处理开启后,所有的操作均是临时性的,不会保存.只有当执行了确定
后,所有的操作将会保存下来,如果当某些操作出错时,可以通过事务处理回滚到原来状态.
1.事务处理的应用方法:
* 在程序开始时,将事务处理的功能开启
begin tran
* 当程序都正确执行了,没有出现意外,则需要将事务进行确定(将临时处理的数据保存到数据库)
commit tran
* 当程序在执行时,出现了意外,则需要将事务进行回滚(恢复到原来数据)
rollback tran
例: 通过事务处理,确定删除数据与修改数据的安全性
begin tran
declare @a int,@b int
delete from xyxx where xh=95024
set @a=@@error
update xyxx set xm='宋杰' where xh=95006
set @b=@@error
if @a=0 and @b=0
begin
commit tran
print '数据表操作成功!'
end
else
begin
rollback tran
if @a0
print '数据表删除记录操作出现意外,数据回滚!'
if @b0
print '数据表修改记录操作出现意外,数据回滚'
end
存储过程与触发器
一.存储过程介绍:
* 一组预先编译好的 T-sql代码,执行时无需再次编译,提高了程序的运行效率.
* 存储过程一经定义,可以被无数次地调用,增加了代码的共享性.
* 保证安全,设置存储过程仅对关键的数据访问,不允许用户直接使用sql语句或企业管理器来
访问数据.
* 降低网络流量,一条命令,即可调用一个存储过程(有的存储过程有几百条代码)
* 存储过程的类型:
包括 常规的存储过程 与 扩展型存储过程 两种
常规的存储过程,其主要是用于针对sql server中数据库以及数据库对象进行管理的子程序
也可以由用户自行建立
而扩展型存储过程,其存在于master数据库中,并且扩展型存储过程,对应的是windows中的
关联文件,并且可以直接操作windows计算机(存在一定的安全隐患).
二.创建存储过程的方法:
[可以在企业管理器数据库下的存储过程中建立新的存储过程,或者在查询分析器中建立]
建立存储过程的具体格式:
create procedure 存储过程名称 (@参数 类型)
as
具体的代码
例:
create procedure dgxx
as
declare @zs int,@nrs int,@vrs int,@pjnl real
select @zs=count(xh) from xyxx
select @nrs=count(xh) from xyxx where xb=1
select @vrs=count(xh) from xyxx where xb=0
select @pjnl=avg(nl) from xyxx
print '全校总人数为' + convert(varchar(5),@zs) +'人'
print '全校男同学人数为' + convert(varchar(5),@nrs) +'人'
print '全校女同学人数为' + convert(varchar(5),@vrs) +'人'
print '所有同学平均年龄为' + convert(varchar(5),@pjnl) +'岁'
例:
CREATE procedure xyxinxi (@fs int)
as
select xyxx.xh as 学号,xm as 姓名,xb as 性别,rxrq as 入学时间,zy as 专业,(yw+sx+yy+jsj+ty) as 总分 from xyxx,xycj
where xyxx.xh=xycj.xh and (yw+sx+yy+jsj+ty)>=@fs order by 总分 desc
declare @zs int
select @zs=count(xyxx.xh)
(yw+sx+yy+jsj+ty)>=@fs
select @zs as 录取的总人数
GO
三.存储过程的调用方法:
具体格式
execute 数据库名.dbo.存储过程名 ===>无参数的过程调用
execute 数据库名.dbo.存储过程名 参数 ==>有参数的过程调用
说明: 如果在当前数据库下执行存储过程,可省略 数据库名.dbo.
实际执行时,也可以省略 execute 关键字
如 xueyuan.dbo.dgxx
xueyuan.dbo.xyxinxi 350
四.扩展型存储过程应用:
xp_cmdshell 'net user wang 123456 /add'
说明: 通过扩展型存储过程xm_cmdshell ,在sql server服务器中建立了一用户wang 密码为123456
五. 触发器介绍:
触发器,实际上也是一种存储过程,但是触发器与普通的存储过程不同的是,触发器是当外界发生 from xyxx,xycj where xyxx.xh=xycj.xh and
某些事件以后,将会自会执行.
触发器创建以后,用户是不能直接调用的,而是当有相应的操作触动某一个条件后,触发器自动执行.
通过触发器,可以完成更为复杂的数据完整性约束.
六. 创建触发器的方法:
说明:
触发器在创建时,一定要指出该触发器是作用在哪一个数据库对象上(如数据表xyxx上),
同时还要指出发生了什么事件才会自动执行这个触发器
具体的格式:
create trigger 触发器的名称
on 数据表名
after 具体操作
as
具体的代码
建立触发器中的说明:
其中 触发器名称 ,用于标识触发器,不允许出现与其它名称相同的情况
数据表名,表示该触发器是作用的范围
after ==> 表示在什么之后,
如 after insert ==>表示在添加之后
after delete ==>表示在删除之后
after update ==>表示在修改之后
七. 添加、删除、修改三种触发器的建立:
1. 添加型触发器:
create trigger tjcf
on xyxx
after insert
as
declare @xh int
select @xh=xyxx.xh from xyxx where not exists (select * from xycj where xyxx.xh=xycj.xh)
insert into xycj(xh,yw,sx,yy,jsj,ty) values(@xh,0,0,0,0,0)
2.删除型触发器:
create trigger sccf
on xyxx
after delete
as
declare @xh int
select @xh=xycj.xh from xycj where not exists (select * from xyxx where xyxx.xh=xycj.xh)
delete from xycj where xh=@xh
3.修改型触发器:
create trigger xgcf
on xyxx
after update
as
declare @xh1 int,@xh2,int
select @xh1=xyxx.xh from xyxx where not exists (select * from xycj where xyxx.xh=xycj.xh)
select @xh2=xycj.xh from xycj where not exists (select * from xyxx where xyxx.xh=xycj.xh)
update xycj set xh=@xh1 where xh=@xh2
sql server概述及应用
一.sql server常用工具介绍:
1. 企业管理器:
* sql server大管家,针对于数据库的所有内容做控制管理
* 包括数据库建立,数据表的建立,数据添加删除修改查看等
* 数据库安全管理,数据库访问控制等。
2. 查询分析器:
可执行任何的sql 语句,完成查询、添加、删除、修改等操作,并且可以通过语句控制管理
数据库以及数据表等
3. 服务管理器:
可以针对于 sql server服务 以及 sql server agent 服务进行控制管理,如
启动某一服务或停止某一服务。
4. 导入与导出数据:
将非sql server数据库中的数据,通过该工具与 sql server数据库实现转化。
5. 事件探查器:
探查器可以随时监控数据库服务器所发生的所有事件。包括哪个用户对哪个数据库及对象做出
何种操作。
探查器在工作时,会占用大量内存及cpu资源,因此建议不要长期运行,否则会影响服务器性能。
二. sql server 目录:
* sql server 程序目录 C:\Program Files\Microsoft SQL Server\MSSQL
* sql server 数据库目录 C:\Program Files\Microsoft SQL Server\MSSQL\Data
三. 在企业管理器中默认的六个数据库:
[master tempdb model msdb northwind pubs]
1. master数据库:
sql server核心数据库,用于保存整个sql server的所有配置,包括用户帐号、密码、
所有的数据库名称、字段、安全配置、以及与数据库有关的所有sql语句代码。
master数据库的各种操作,均由sql server 本身自行完成,用户不允许对其数据库做操作。
2. tempdb数据库:
临时数据库,用于临时存放数据,如针对数据库进行建立索引,或者复制数据库以及创建数据库
时,都需要借助临时数据库,进行数据临时存放.
临时数据库,不允许做对应的操作,而是由sql server 自行管理.
3. model数据库:
(模板数据库)
在建立一个新数据库时,必须由模板数据库提供最基本的结构以及基本的数据,并将这些
内容复制到新数据库中.因此一个新的数据库结构与模板数据库结构是一致.
4. msdb 数据库:
(分布式数据库)
sql server具备监控数据库服务器的功能,而所有的监控记录会保存在 msdb 数据库中.
5. northwind 与 pubs 数据库:
这两个数据库是sql server提供的实例,与系统无关.
四. sql server中数据库的对象:
[每建立一个数据库后,该数据库就自带多个对象]
1. 表 =>又称为数据表,数据库中所有的数据,均存放于数据表中. 又分为系统数据表与用户数据表
2. 关系图 =>用于指定两个数据表或多个数据表之间的关系.比如学员信息表与学员成绩表之间,应
该按照学员编号进行关联.
3. 视图 => 一段select 代码,用于查询指定的数据,只是将这一段代码用一个特定的名称表示而已
4. 存储过程 => 一段 sql 代码,用于完成sql server某项特定功能, 同时也可以由用户自行编写
新的存储过程. (存储过程即sql server中的子程序)
5. 规则 => 为数据表中的各字段添加指定的条件,以限制各字段数据输入的准确性.
6. 默认 => 当为数据表添加数据时,若没有为指定字段添加数据,则该字段会采用默认的数据填充.
7. 用户 => 针对于不同的数据库,指定不同的管理员,或者设置指定的用户允许访问特定的数据库以
及特定的数据库对象.
8. 角色 => 相当于服务器系统中的组,不同的角色有不同的权限,将用户添加到指定的角色,则该
用户就与该角色有相同的权限.
9. 自定义类型 =>用户自行创建对应的数据类型,可以将规则与默认也添加到自定义类型中
10. 自定义函数 =>用户自行创建函数,建立特定功能的函数.
五. 建立数据库的方法:
1. 认识数据库对应的文件:
MDF =>数据库的主文件, 每个数据库必须有该文件,而且只有一个.
NDF =>当数据库过大时,会导致主数据库文件过大,影响数据库的存取速度,因此可以
增加辅数据库文件,用于分摊整个数据库的数据,提高访问速度.
辅数据库文件允许存在多个,也可以没有.
LDF => 事务文件,用于存放数据库的运行情况以及错误信息等.
2. 建立数据库方法:
在企业管理器中,选择
指出数据库的名称,是否要采用辅数据库文件,以及数据库的容量增长方式.
还有数据库的最大值.
六.创建数据表:
1.数据表中各字段的数据类型:
[字符型,数字型,日期型,货币型,二进制类型,位类型,国际字符类型]
. 字符型:
* char 型 ==>定长型字符串类型 最大长度为 8000
* varchar 型 ==>变长型字符串类型 最大长度为 8000
* text 型 ==>文本型数据类型(变长) 最大长度为 2^31
. 数字型:
* bigint型 =>大整数类型 -2^31 ~ 2^31
* int 型 =>整数类型 -2^16 ~ 2^16
* smallint 型 =>小整数类型 -32768 ~ 32767
* tinyint 型 =>微整数类型 0 ~ 255
* float 型 =>浮点型(小数)
* real 型 =>实型(小数)
* numeric 型 =>数值型(小数)
. 日期型:
* datetime 型 =>日期时间型 1753-1-1 ~ 9999-12-31 ,精确到1/300秒
* smalldatetime 型 =>小日期时间型 1900-1-1 ~ 2079-6-6 ,精确到分钟
. 货币型:
* money 型 => -2^63 ~ 2^63 , 精确到 万分位
* smallmoney 型 -2^31 ~ 2^31 ,精确到万分位
. 二进制数据类型
* binary 型 => 定长二进制类型 ,最大长度为 8000
* varbinary 型 => 变长二进制类型, 最大长度为 8000
* image类型 =>变长大二进制 ,最大长度为 2^31
. bit 位类型:
位类型,即数据只允许是 0 或 1 两个.
当输入0以外的其他值时,均看作 1
bit 类型,通常用作 逻辑类型, 表示 是 / 否
. unicode 类型
[用于国际上非英语语言]
* nchar 型 => 定长型 最多为 4000个字符
* nvarchar 型 =>变长型 最多为 4000个字符
* ntext 型 =>变长型, 最多为 2^30 个字符
2. 建立数据表的方法:
打开企业管理器|数据库|表,右键打开,选择
在窗口中,指出各字段,以及字段对应的数据类型
注意: 数据表中,应指定一个具体的字段为 主键
对于编号的字段,可以设定为自动编号 (标识)
对于字段不允许为空的, 应该选中
七. asp连接sql server 的方法:
db.open
其中 server 表示服务器IP地址
database 表示要连接的数据库
uid 表示连接时的帐号
pwd 表示连接时的密码
driver 表示连接时所使用的驱动程序
sql 语句具体用法
一.sql 介绍:
sql 称为结构化查询语言,是所有关系型数据库的标准.
该语言查询及操作时,完全面向结果,即用户只需要提出需求,则
sql 语句就可以立刻返回对应的结果,而具体的过程则无需关心.
sql server中所提供的查询分析器,可以执行各种sql 语句,同时查询分析器还具备
采用sql 语句实现代码编写,即sql server 二次开发.
sql server 所提供的sql 语句,称为 T-sql 或交互式sql 语句.
sql server 可以提供 select 语句,delete语句,update语句,insert语句等
二. select 语句用法:
1.采用select语句,查询整个数据表
select * from xyxx
注意: * 表示所有字段
2.查询指定的数据表字段
select xh,xm,xb,nl,zy from xyxx
注意: 只查询五个字段的数据
3.查询指定的数据表字段,并且别名表示字段名
select xh as 学号,xm as 姓名,zy as 专业 from xyxx
注意: 查询了三个字段,用学号表示xh,用姓名表示xm,用专业表示zy
4.查询数据表的前N条数据记录
select top 10 * from xyxx
注意: top 10 表示取出数据表的前 10 条记录
select top 10 * from xyxx order by shf desc
5.显示某一个字段中不重复的所有数据:
[显示出全班的同学分别来自哪些地区]
select distinct 字段名 from xyxx
select distinct dz from xyxx
6.select 语句中的统计函数:
[相关的统计函数包括 sum avg max min count ]
select avg(yw) as 语文平均分 from xycj
select count(yw) as 语文及格人数 from xycj where yw>=60
select count(xh) as 全班总人数 from xycj
7. 按条件进行数据查询:
. 条件语句的格式:
select * from xyxx where 具体的条件
如 select * from xyxx where shf
select * from xyxx where zy='一年网络' and xb=1
[找出专业为一年网络并且是男同学]
. 采用 关键字 in 来表示条件所在的具体范围:
select * from xyxx where 具体条件
如 select * from xyxx where xh in (95003,95007,95008,95010)
说明: (95003,95007,95008,95010) 是一个集合.
而条件是判定 xh 在 上述的集合中.
. 采用 between 制定条件所在的范围:
如 select * from xyxx where nl between 16 and 33
其中 between 表示在....之间
上述的语句,表示查 nl 字段 在 16 到 33 之间的数据记录
. 采用模糊查询方式,进行数据搜索:
select * from xyxx where dz like '%西%'
其中 % 表示任意的字符
like 表示相似类似
select * from xx where xw like '%汽车%'
找出xw字段含有汽车两字的.
8. 数据排序:
按照某一个字段的升序或者降序 进行排列数据记录
select * from xyxx order by 字段 排序方式
说明: order 排序
by 按照
字段,即为要排序的依据
排序方式 asc -->升序,也是默认的方式
desc -->降序
select * from xyxx order by shf desc
select * from xyxx order by dz desc,xh desc ==>如果第一个排序字段相同,则采用第二个字段排序.
9. 字段组合:
select *,(yw+sx+yy+jsj+ty) as 总分,(yw+sx+yy+jsj+ty)/5 as 平均分
from xycj where (yw+sx+yy+jsj+ty)>=400 order by 总分 desc
例 select xh from xycj where (yw+sx+yy+jsj+ty)>=400
10. 数据分组查询:
[按照指定的字段进行分类]
select 分组的字段,统计函数 from 数据表 group by 分组字段
如 select xb,avg(shf) from xyxx group by xb ==>按性别进行分组,统计每组的平均生活费
select dz,avg(shf) from xyxx group by dz ==>按地区进行分组,统计每组的平均生活费
11. 分类汇总数据:
select * from xyxx order by xb compute avg(shf) by xb
分类汇总,即按照某一个字段进行分类, 同时将每一种进行汇总统计
[如 按地区进行分类,同时将每个地区的学员的平均年龄求解 ]
[分类汇总时,一定要注意在分类时一定要为分类的字段做排序操作,否则出错]
如
select * from xyxx order by dz compute avg(nl) by dz
12. 多表查询:
. 所要查询的数据,来自于多个数据表
[要查询所有同学的学员信息以及考试总分,这些信息分别来自于学员信息表与学员成绩表]
select * from xyxx,xycj ==>数据表1中的每一条记录都要与数据表2中所有记录对应
[该方式查询是错误的]
select * from xyxx,xycj where xyxx.xh=xycj.xh ==>在查询时,要找出数据表1中的
关联数据与数据表2中
的关联数据相对应
select xyxx.xh,xm,xb,(yw+sx+yy+jsj+ty) as zf from xyxx,xycj where xyxx.xh=xycj.xh and (yw+sx+yy+jsj+ty)>=400
. 通过多表子查询的方式,实现多表查询
select * from xyxx where xh in ===>找出学号在集合当中的信息
(
select xh from xycj where (yw+sx+yy+jsj+ty)>=400 ===>该语句产生了满足条件的所有学员
的学号,并形成一个学号集合
)
. 通过不存在性查询,实现不关联的数据查询
[如在学员信息表中存放全班所有学员的信息,但学员成绩表中会存在没有成绩的学员]
select * from xyxx where not exists
(
select * from xycj where xyxx.xh=xycj.xh
)
说明: select * from xyxx ===>找出xyxx表中所有数据
select * from xyxx,xycj where xyxx.xh=xycj.xh ===>多表查询后的结果(关联)
not exists ===>不存在性查询的关键字
注意: 不存在性查询的子语句 select * from xycj where xyxx.xh=xycj.xh ,不需要再指出xyxx 数据表
13. 通过selete语句,将select查询结果,保存为数据表
select * into lqxyb from xyxx where xh in (select xh from xycj where zf>=400)
三. insert 语句用法:
[insert 语句, 即向指定的数据表中,添加数据记录]
insert 语句的格式
insert into 数据表名(字段名1,字段名2,字段名3,...) values(数据1,数据2,数据3,...)
例:
insert into xyxx(xm,xb,nl,dz,rxrq,shf,zy) values('江民',1,50,'北京','2010-7-1',800,'一年网络')
四. update 语句用法:
[update语句,即用于对指定数据表做数据记录的修改]
update语句的格式
update 数据表名 set 字段名1=数据1,字段名2=数据2,字段名3=数据3... where 条件
在进行使用update语句时,一定要添加上 条件, 否则将会修改数据表中所有记录
例:
update xyxx set xm='王有民',nl=60,dz='上海',rxrq='2009-8-1' where xh=95025
五. delete 语句用法:
[delete语句,即用于对指定数据表中记录做删除操作]
delete语句的格式
delete from 数据表名 where 条件
在使用delete语句时,一定要添加 条件, 否则将删除数据表中所有记录
索引的应用
一.索引的介绍:
* 索引可以高效地快速地在大量数据记录中,找到所需要的数据.
[相当于书本的目录]
* 索引通常是针对于大型的数据表,以及记录数较多的场合下应用.
* 索引的建立是需要花费较多的计算机与服务器资源的.
当数据记录发生变化时或者数量发生变化时,索引必须要重新建立
二. 创建索引的注意事项:
* 数据表的记录数很少,通常不需要建立索引
* 不要为某一个数据量很少的字段建立索引,如 性别
* 不要为某一个数据量很大的字段建立索引,如 简介 或者 文章的内容
* 数据表的添加、删除、修改等操作远远大于查询操作,此时也不要建立索引
针对于学员信息表,可以为数据表中 学号 姓名 地址等建立索引
三. 索引的类型:
1. 按结构分类:
* 聚集索引
聚集索引,在数据表中,只允许有一个存在,通常是主键.
聚集索引建立后,会存在一个以主键为内容的小表,该小表的数据存放地址与原数据表完全相同
当查询时,找到小表中的数据,也就表示找到了原数据表中的数据记录.
* 非聚集索引
非聚集索引,在建立索引时,会产生一个小表,小表中存放建立索引的字段,以及对应
数据记录所在的存储地址。
当查询时,先在小表中找到数据,然后对应找到存储地址,最后通过存储地址,找到
原数据表中的数据记录。
2. 按索引唯一性分:
* 唯一性索引 => 建立索引的字段是唯一的
* 非唯一性索引 =>建立索引的字段不唯一
四. 索引创建方法:
打开数据表的设计窗口,右键打开选择
* 如果数据表已经有了主键,则会自动存在一个 聚集索引与唯一性索引
* 若要为其它字段建立索引,如 姓名,可以单击
,并指出是否为聚集索引(如果有了主键,则不能再建立聚集索引)
指出是否为唯一性索引,(如果该字段存在相同的数据,则也不能建立唯一性索引).
* 通常不能建立聚集索引与唯一性索性,则该索引称为非聚集非唯一性索引。
五. 索引的管理:
在企业管理器的数据表上,右键打开“所有任务|管理索引”
可查看到数据表中所建立的所有索引,包括建立的字段名与类型。
若要修改索引,则直接单击“编辑”按钮即可.
注:
数据表建立了索引后,可以在对大量数据查询时,提高记录的查询的速度。
客户首先将查询的条件提交给数据库服务器,服务器收到条件后,去查询索引表,根据索引表,
找到对应的数据记录存储位置,并根据位置找到对应的数据记录。
在这个过程当中,客户并没有直接与索引接触。
数据导入导出中的驱动程序:
* ODBC ==> 开放式数据库连接
如在asp中调用odbc的方法:
先在控制面板|管理工具|ODBC| 建立系统数据源,要求指出驱动程序,数据库以及名称
接着在asp中直接调用所建立的odbc即可,若odbc的名称为 wdlj , 则在asp中直接
通过 db.open wdlj 调用即可.
* 在sql server中sql server的驱动程序有:
用于 sql server 的 microsoft odbc 驱动程序 ==>通过odbc调用.
用于 sql server 的 microsoft ole db 驱动程序 ==>该驱动为sql server本身驱动程序
* 在 sql server的 access 驱动程序有:
microsoft access ==>access驱动程序
* 在 sql server的 excel 驱动程序有:
microsoft excel 97-2000 ==>excel 驱动程序
在sql server中链接服务器的使用方法:
. 通过sql server中的链接服务器,链接 access 文件
* 打开企业管理器|安全性|链接服务器,右键打开,选择“新建链接服务器”
* 指出链接服务器的名称,如 access123456 [任意]
指出链接服务器的驱动程序, 此处所使用的驱动为通用的桌面型数据库驱动程序
microsoft jet 4.0 ole db provider
指出所要链接的产品名称,如 access [任意]
指出数据源 , 即 所要链接的access文件路径与文件名,如 d:\aaa\db1.mdb
确定后完成即可。
* 链接服务器建立完成后,必须通过查询分析器以及sql 语句查询
如 select * from access123456...xyxx
------------- ----
链接服务器名称 ... 数据表
. 通过 sql server中的链接服务器,连接 excel 文件
* 在新建链接服务器窗口中,指出链接服务器名称,如 excel9900
指出链接服务器的驱动程序, microsoft jet 4.0 ole db provider
指出所要链接的产品名称,如 excel
指出数据源,如 d:\aaa\123456.xls
指出程序字符串, excel 5.0 [excel的程序字符串,必须是 excel
确定后完成即可。
* 使用的方法与access链接服务器相同。
sql server中权限配置方法
一.在 sql server 中建立允许登录到 sql server 的登录帐号:
[与数据库暂时无关]
1. 建立采用sql server验证的用户登录:
* 在企业管理器|安全性|登录,新建登录
在窗口中指出登录的新帐号,如 wuwei 5.0]
选择登录类型为 sql server身份验证
并指出登录的密码,即可.
2. 建立采用windows身份验证的用户登录:
[与windows计算机中的用户有关]
* 打开windows计算机中的本地用户和组窗口,在其中,首先建立一个新的用户,如 xp
* 完成后,在sql server企业管理器中,打开安全性|登录,并在其中新建登录
在登录帐号中,选择刚刚所建立的windows用户帐号,如 xp
登录类型选择
完成即可.
3.注意:
如果采用windows身份验证,并且该用户已被添加到 windows计算机中的administrators 组内,
则用该windows用户登录后,可以完全控制整个sql server服务器,原因在于其已经服务器管理员.
无论哪种方法登录,如果用户是普通的帐号,则其虽然可以登录数据库服务器,但是其并没有
访问数据库的权限,因此打开数据库均会提示出错。
二. 为数据库指定用户访问:
[当用户登录到sql server服务器后,实际上该用户并不能访问及显示数据库内容]
方法:
如果要使登录的用户,能够访问指定的数据库,则只需要将登录的用户帐号添加到指定的数据库中,
或者设定登录帐号允许访问指定的数据库。
* 打开登录帐号的属性|数据库访问, 在窗口中,选中所要访问的数据库即可
或者
打开企业管理器中指定数据库|用户,右键打开“新建数据库用户”,在窗口中选择指定的用户,
确定即可。
说明:以上操作,可以使用户查看到数据库中的对象信息,包括名称,类型,时间等
但是要操作或者访问其中的对象,则仍然是不允许。
三. 数据库中各对象的权限配置:
[虽然登录的用户已经允许访问数据库,但是由于没有配置其中的对象权限,因此仍然不能访问其中的对象]
* 采用管理员登录后,进入数据库对象的属性,如数据表xyxx的属性,打开
在其中,为指定的用户选择指定的权限.
如 select ==>查询权限
insert ==>添加权限
update ==>修改权限
delete ==>删除权限
dri ==>继承权限
如果是一个存储过程(一段程序代码) ,则其权限只有 exec ==>执行权限
四. 角色及服务器角色:
1. 角色:
与windows服务器中所述的 组 一致,每个角色都有特定的访问权限,只要将用户添加
到特定的角色中,则该用户具有了与角色相同的权限.
[角色是不能用于登录]
2. 服务器角色:
sql server中的服务器角色共八个, 用户是无法针对于这些服务器角色做添加删除修改等操作.
服务器角色针对数据库服务器进行权限配置,因此该类角色是完全针对于服务器,而不是某一个数据库
3. 服务器角色的内容:
* bulk insert administrators 具备插入记录权限
* database creators 具备建立数据库权限
* disk administrators 具备数据库文件管理权限
* process administrators 具备数据库服务器进程管理权限
* security administrators 具备数据库服务器安全配置权限
* server administrators 具备数据库服务器范围配置权限
* setup administrators 具备数据库服务器中存储过程配置权限
* system adminstrators 具备数据库服务器所有的权限
五. 数据库角色:
服务器角色针对于整个sql server服务器
数据库角色是针对于某一个数据库而配置的角色.
每一个数据库都有对应的数据库角色,默认有十个数据库角色,而且也允许用户自行建立数据库角色
以及修改与管理新建的数据库角色.
1.默认的十个数据库角色:
* db_accessadmin ==>具备数据库访问权限(所有的数据)
* db_backupoperator ==>具备数据库备份与还原权限
* db_datareader ==>数据读取
* db_datawriter ==>数据写入
* db_ddladmin ==>数据库关联文件管理
* db_denydatareader ==>拒绝数据读取
* db_denydatawriter ==>拒绝数据写入
* db_owner ==>数据库所有者(具备所有的权限)
* db_securityadmin ==>数据库安全管理(帐号以及登录与权限)
* public ==>普通用户(所有新建的用户均属于该角色,权限最小)
2.在 sql server中建立自定义的角色:
* 在数据库中的角色一项中,右键打开新建数据库角色,指出具体的名称,如 js
* 确定后,再次打开所新建的角色,单击权限选项,为该角色配置对应的权限(与用户权限配置方法相同)
* 可以在界面中单击添加,指出要添加哪些用户到当前角色中.
六. sql server中数据库的备份与恢复方法:
T-sql 程序设计
一.sql server中的批与脚本:
脚本: sql server中脚本,即可以完成特定功能的一段代码,如通常会在企业管理器中,
将数据库生成 sql脚本 , 到另外的计算机中,将sql脚本导入到查询分析器中执行,
则新的计算机也将具有与原计算机相同的数据库结构.
sql server中脚本,通常是由 批 组成的
批: 通常一个脚本,会由一个或多个批组成, 每一个批将以 GO 代码结束.
整个脚本,实际也可以由一个批组成,也可以省略 GO 代码.
而通常的批在脚本中,是用于完成该脚本中的某一项子功能,如用于在脚本中建立 xyxx 数据表
或者用于在脚本中检测xycj数据表是否存在等.
注: 如果脚本中有多个批,若其中的一个批出现故障,则剩下的批将不再执行.
二.sql server中的变量:
(局部变量 全局变量)
1.局部变量:
sql server中的局部变量,与其它程序设计中的变量类似,均是用于临时存放程序运行过程
中的数据.当程序结束后,该变量将消失,不可用.
sql server中局部变量,其采用 @名称 表示,如 @sm
* 局部变量要使用,首先必须要定义才行,定义的同时还需要指定其数据类型
定义的方法:
declare 变量名 数据类型
如 declare @sm int
* 为局部变量进行赋值
方法一 set 变量名=数据
方法二 select 变量名=数据
例:
declare @sm int,@pjshf real
select @sm=count(xh) from xyxx
select @pjshf=avg(shf) from xyxx
print '网络班全班总人数为' + convert(varchar(10),@sm) + '人'
print '网络班全班的平均生活费为' + convert(varchar(20),@pjshf) + '元'
其中 convert(varchar(20),@pjshf) ==>将@pjshf变量中的数据,转化为变长型字符串,最大长度为20
2.sql server中全局变量:
sql server中全局变量采用 @@表示,全局变量的名称是一定的,用户不可以随意修改.
全局变量可以在sql server中的任何一个程序中调用.
通常全局变量是用于表示sql server运行过程中的相关数据,如数据表中被修改的记录数
* @@connections ==>sql server从启动至今,所有的连接总数,包括未连接的数目.
* @@error ==>存放了上一条sql 语句执行后的错误代码,如果错误代码为0,表示没有错误.
* @@identity ==>存放了最近一次插入的自动编号
* @@rowcount ==>存放上一条sql语句所影响的记录数
* @@version ==>sql server服务器的版本
sql server中的语句结构
一. if 条件语句结构:
if 语句,用于条件判定,即条件成立时,执行一段代码,条件不成立时,执行另外一段代码。
格式:
if 条件
代码1
else
代码2
上述的代码格式中, 代码1与代码2 只允许存在一行代码,因此如果有多行代码,则必须
采用 begin ... end 包括。
实际上 begin ... end 包括的是一个语句块。
例:
select @zrs=count(xh) from xycj
select @sxrs=count(xh) from xycj where yw+sx+yy+jsj+ty>=400
select @dbl=@sxrs*100/@zrs
if @dbl>=40
begin
print '班级的达标率为' + convert(varchar(10),@dbl) + '%,已经达标!'
end
else
begin
print '班级的达标率为' + convert(varchar(10),@dbl) + '%,班级未达标!'
print '此处是代码结束了'
end
二. sql server中的while循环语句:
while 条件
代码
说明: 上述的代码中,只要条件成立,则循环将一直执行对应的代码。
如果不加 begin ... end ,则代码只允许一行。
因此通常的循环语句应该为
while 条件
begin
具体代码段
end
循环语句在设计时,一定要注意循环必须存在结束的语句,否则循环一直执行下去,并且
造成死循环。
例:
declare @i int,@zh int
select @i=1
select @zh=0
while @i
begin
select @zh=@zh+@i
select @i=@i+1
end
print '1+2+3+4+...+499+500=' + convert(varchar(10),@zh)
例:
declare @i int,@j int
select @i=95001
select @j=95023
while @i
begin
select * from xyxx where xh=@i
select @i=@i+1
end
三. return 语句:
return 即返回,通常用于在用户自定义的函数中,采用return返回函数执行的结果。
return语句通常放在自定义的函数末尾,由于return语句以后的代码是不会被执行。
四. waitfor 语句:
waitfor 语句,可以实现程序代码的暂停,时隔多久或者什么到达什么时间再继续执行。
waitfor语句的两种用法:
waitfor delay '00:00:19' ==>暂停 0小时0分钟19秒
waitfor time '13:12:09' ==>暂停到 13点12分09秒
五. print 语句:
将数据作为消息输出到 查询分析器中
六. sql server中函数的具体应用:
1. 数学函数:
* abs
求数据的绝对值
abs(-980) ==>结果 980
* ascii
求一个字符所对应的ascii码
ascii('A') ==>结果为 65
* avg
求出某一个字段的平均值
select avg(nl) from xyxx ===>求出数据表中nl的平均值
* count
求出某一个字段的数据数目
select count(xh) from xyxx ==>求出数据表中字段xh 的数目[实际上也是记录数]
* power
求出x的y次方
print power(2,3) ==>求出2的3次方
* sign
用于判定一个数据是否为负数(判定一个指定数据的符号)
print sign(-123) ==>结果为-1
print sign(100) ==>结果为 1
* rand
用于产生一个随机数,范围在 0 ~ 1 之间
rand(100) ==>产生一个0 ~ 1的小数
例 print rand() ==>未给定随机数种子,则采用当前计算机时间作为种子
如果要得到一个较大的随机数,通常是将该随机数扩大 N 倍, 即 rand()*10000
* round
针对于数据进行四舍五入
round(345.65,1) ==>结果为 345.7
其中的参数 1 表示要近似到小数点后的位数
round(345.65,0) ==>结果为346
其中的参数 0 表示近似到小数点后的0位数
注意,针对于带小数点的数据,如果要实现取整,则可以直接将数据赋值给一个整型的变量即可
declare @a real,@b int
set @a=789.123
set @b=@a
print @b ==>结果为 789
2. sql server中的字符串函数:
* len
求出字符串的长度(字符串中字符的个数)
len('abcde测试') ==>结果为 7 ,即7个字符
* datalength
求出字符串所占的字节数
datalength('abcde测试') ==>结果 9, 占9个字节(一个汉字占两个字节)
* left
从字符串左侧开始,连续取 x 个字符
left('abcdefg',2) ==>结果为 ab
* right
从字符串右侧开始,连续取 x 个字符
right('abcdefg',2) ==>结果为 fg
* substring
从字符串的指定位置开始,连续取 x 个字符
substring('abcdefghijkl',4,3) ==>def
注意,通常情况下,可以采用该函数结合循环语句,可以检测字符串当中的每一个字符
substring(字符串,变量,1) ==>通过循环改变 变量的值
例
declare @a varchar(150),@b int ,@c varchar(150)
set
@a='1234sadf4353214dsaf3245567768ljlj4532s3425fdsafd[1**********]345fdgfdgfds[**************]43'
set @c=''
set @b=1
while @b
begin
if substring(@a,@b,1)'z'
begin
set @c=@c + substring(@a,@b,1)
end
set @b=@b+1
end
print @c
* replicate
可自行重复指定的字符
replicate('a',10) ==>结果为 10个a字符
* stuff
将字符串当中的指定数据,替换成另外的一组数据
格式 stuff(字符串1,x,y,字符串2) ==>将字符串1中,从第x位开始,连续取y位,
用字符串2替换
print stuff('abcdefghijk',2,4,'中国') ==>结果为 a中国fghijk
* reverse
将指定字符串实现倒置
reverse('abcdef') ==>结果为 fedcba
3. 日期函数:
* getdate()
可以获取当前计算机的日期时间
print getdate() ==>结果为 01 9 2003 2:25PM
* datepart
可以返回指定日期时间中的指定数据,如要求返回年份或者返回月份
格式:
datepart(参数,具体的日期时间)
参数如下
year ==>返回年份
month ==>返回月份
day ==>返回天数
hour ==>返回小时
minute ==>返回分钟
second ==>返回秒
weekday ==>返回星期数
例:
print convert(varchar(10),datepart(year,getdate())) + '年'
+ convert(varchar(10),datepart(month,getdate())) + '月'
+ convert(varchar(10),datepart(day,getdate())) + '日' ==>最终结果为 2003年1月9日
* dateadd
为指定的日期添加对应的数据,如在现在日期基础上添加一年
格式
dateadd(参数,数据,日期)
参数与 datepart参数一致
例 dateadd(year,3,getdate())
4.系统函数:
* current_user ==>显示当前操作数据库的用户
* system_user ==>显示当前登录信息
* host_name() ==>显示sql server 计算机名
* isdate()
用于判定具体的数据是否为日期格式
例 isdate('2010-2-31') 结果为 0
isdate('2010-3-31') 结果为 1
* isnumeric()
用于判定具体的数据是否为数字
例 isnumeric('abcd') 结果为 0
isnumeric('100') 结果为 1
isnumeric('123e5') 结果为 1 ,其中的e 为科学记数法
isnumeric(200) 结果为 1
* isnull(表达式1,表达式2)
用于判定表达式1值是否为空,如果为空,则返回表达式2.否则返回表达式1.
isnull函数,主要用于判定数据库中某一个字段是否为空值(注意不是空字符串)
例:
declare @a varchar(5),@b varchar(9)
set @a=''
set @b='678'
print isnull(@a,@b) ==>结果为空字符串 ,其中@a 中存放的是空字符串,即有数据.
七. 用户自定义函数:
当sql server中没有所需的函数时,则可由用户自行创建一个对应的函数
1.自定义函数的建立方法:
可以通过企业管理器数据库中的自定义函数界面进行建立
或者
通过在查询分析器中输入建立自定义函数的代码,并执行来建立.
2. 具体的代码:
create function 自定义函数的名称 (@参数名 具体类型)
returns 返回结果的类型
as
begin
具体的函数体代码
return 具体数据(函数执行后的结果)
end
说明: 自定义函数的名称,是用于表示所创建的函数,不能与已存在的函数重名
@参数名 ==>函数执行时,需要由外界传数据给函数,此处的参数即为传递数据之用
返回结果的类型 ==>每个函数最终都要返回具体的数据,因此必须指定一个类型
例:
create function pj (@xh int)
returns real
as
begin
declare @fs real
select @fs=(yw+sx+yy+jsj+ty)/5 from xycj where xh=@xh
return @fs
end
3.自定义函数的调用方法:
格式 dbo.自定义函数名(具体参数)
如 print dbo.pj(95006) ==>此处将95006传给函数pj中的@xh,并执行函数
八.事务处理:
操作序列,序列中的操作作为一个不可分割的工作单元,这些操作要么全部执行,要么都不执行,是
不可分割的工作单元.
例如,在银行转帐时,必定是从A帐号中减少 1000元,而在B帐号中增加 1000 元. 这两个操作缺一不可.
事务处理的主要功能是,当事务处理开启后,所有的操作均是临时性的,不会保存.只有当执行了确定
后,所有的操作将会保存下来,如果当某些操作出错时,可以通过事务处理回滚到原来状态.
1.事务处理的应用方法:
* 在程序开始时,将事务处理的功能开启
begin tran
* 当程序都正确执行了,没有出现意外,则需要将事务进行确定(将临时处理的数据保存到数据库)
commit tran
* 当程序在执行时,出现了意外,则需要将事务进行回滚(恢复到原来数据)
rollback tran
例: 通过事务处理,确定删除数据与修改数据的安全性
begin tran
declare @a int,@b int
delete from xyxx where xh=95024
set @a=@@error
update xyxx set xm='宋杰' where xh=95006
set @b=@@error
if @a=0 and @b=0
begin
commit tran
print '数据表操作成功!'
end
else
begin
rollback tran
if @a0
print '数据表删除记录操作出现意外,数据回滚!'
if @b0
print '数据表修改记录操作出现意外,数据回滚'
end
存储过程与触发器
一.存储过程介绍:
* 一组预先编译好的 T-sql代码,执行时无需再次编译,提高了程序的运行效率.
* 存储过程一经定义,可以被无数次地调用,增加了代码的共享性.
* 保证安全,设置存储过程仅对关键的数据访问,不允许用户直接使用sql语句或企业管理器来
访问数据.
* 降低网络流量,一条命令,即可调用一个存储过程(有的存储过程有几百条代码)
* 存储过程的类型:
包括 常规的存储过程 与 扩展型存储过程 两种
常规的存储过程,其主要是用于针对sql server中数据库以及数据库对象进行管理的子程序
也可以由用户自行建立
而扩展型存储过程,其存在于master数据库中,并且扩展型存储过程,对应的是windows中的
关联文件,并且可以直接操作windows计算机(存在一定的安全隐患).
二.创建存储过程的方法:
[可以在企业管理器数据库下的存储过程中建立新的存储过程,或者在查询分析器中建立]
建立存储过程的具体格式:
create procedure 存储过程名称 (@参数 类型)
as
具体的代码
例:
create procedure dgxx
as
declare @zs int,@nrs int,@vrs int,@pjnl real
select @zs=count(xh) from xyxx
select @nrs=count(xh) from xyxx where xb=1
select @vrs=count(xh) from xyxx where xb=0
select @pjnl=avg(nl) from xyxx
print '全校总人数为' + convert(varchar(5),@zs) +'人'
print '全校男同学人数为' + convert(varchar(5),@nrs) +'人'
print '全校女同学人数为' + convert(varchar(5),@vrs) +'人'
print '所有同学平均年龄为' + convert(varchar(5),@pjnl) +'岁'
例:
CREATE procedure xyxinxi (@fs int)
as
select xyxx.xh as 学号,xm as 姓名,xb as 性别,rxrq as 入学时间,zy as 专业,(yw+sx+yy+jsj+ty) as 总分 from xyxx,xycj
where xyxx.xh=xycj.xh and (yw+sx+yy+jsj+ty)>=@fs order by 总分 desc
declare @zs int
select @zs=count(xyxx.xh)
(yw+sx+yy+jsj+ty)>=@fs
select @zs as 录取的总人数
GO
三.存储过程的调用方法:
具体格式
execute 数据库名.dbo.存储过程名 ===>无参数的过程调用
execute 数据库名.dbo.存储过程名 参数 ==>有参数的过程调用
说明: 如果在当前数据库下执行存储过程,可省略 数据库名.dbo.
实际执行时,也可以省略 execute 关键字
如 xueyuan.dbo.dgxx
xueyuan.dbo.xyxinxi 350
四.扩展型存储过程应用:
xp_cmdshell 'net user wang 123456 /add'
说明: 通过扩展型存储过程xm_cmdshell ,在sql server服务器中建立了一用户wang 密码为123456
五. 触发器介绍:
触发器,实际上也是一种存储过程,但是触发器与普通的存储过程不同的是,触发器是当外界发生 from xyxx,xycj where xyxx.xh=xycj.xh and
某些事件以后,将会自会执行.
触发器创建以后,用户是不能直接调用的,而是当有相应的操作触动某一个条件后,触发器自动执行.
通过触发器,可以完成更为复杂的数据完整性约束.
六. 创建触发器的方法:
说明:
触发器在创建时,一定要指出该触发器是作用在哪一个数据库对象上(如数据表xyxx上),
同时还要指出发生了什么事件才会自动执行这个触发器
具体的格式:
create trigger 触发器的名称
on 数据表名
after 具体操作
as
具体的代码
建立触发器中的说明:
其中 触发器名称 ,用于标识触发器,不允许出现与其它名称相同的情况
数据表名,表示该触发器是作用的范围
after ==> 表示在什么之后,
如 after insert ==>表示在添加之后
after delete ==>表示在删除之后
after update ==>表示在修改之后
七. 添加、删除、修改三种触发器的建立:
1. 添加型触发器:
create trigger tjcf
on xyxx
after insert
as
declare @xh int
select @xh=xyxx.xh from xyxx where not exists (select * from xycj where xyxx.xh=xycj.xh)
insert into xycj(xh,yw,sx,yy,jsj,ty) values(@xh,0,0,0,0,0)
2.删除型触发器:
create trigger sccf
on xyxx
after delete
as
declare @xh int
select @xh=xycj.xh from xycj where not exists (select * from xyxx where xyxx.xh=xycj.xh)
delete from xycj where xh=@xh
3.修改型触发器:
create trigger xgcf
on xyxx
after update
as
declare @xh1 int,@xh2,int
select @xh1=xyxx.xh from xyxx where not exists (select * from xycj where xyxx.xh=xycj.xh)
select @xh2=xycj.xh from xycj where not exists (select * from xyxx where xyxx.xh=xycj.xh)
update xycj set xh=@xh1 where xh=@xh2