/ ***********创建数据库************ /
使用主
-创建数据库
,如果存在(*)
下降数据库学生
去
创建数据库的学生
去选择sysdatabases中,其中name ='学生'
-使用数据库
使用学生
去的 学生
-创建学生信息表的IF EXISTS(SELECT *从sysobjects中的名称='StuInfo)DROP表StuInfo,去创建表StuInfo( StuID INT标识主键, -学号 StuName VARCHAR(10)NOT NULL, -姓名 StuSex VARCHAR(2)NOT NULL, -性别 的ClassID VARCHAR(10) -班级编号)去
-创建学生成绩表
的IF EXISTS(SELECT * FROM sysobjects中的WHERE NAME ='StuMark'*)
降表StuMarks的
创建表StuMarks
(
ExamNO INT标识主键,
INT StuID引用stuinfo(stuid),
主题为varchar(20),
得分INT检查(分数<= 100和分数> = 0)
)
去
/ *****************添加数据***************** /
INSERT INTO StuInfo(StuName,StuSex,CLASSID)
选择“张三','女',1工会
选择'李四',' 男',1联合
选择'王五','男',1联合
选择'赵六','女',2的UNION
SELECT'钱七','女',2
INSERT到StuMarks(StuID,科目,分数) 82的UNION SELECT 1,“SQL”,
选择1,Java的,80的UNION
SELECT 1,
“HTML”,85联盟
选择2,Java的,81名工会
选择2,“ SQL“,60联盟
SELECT 2,“HTML”,70联盟
选择3,Java的,90联盟
选择3,“SQL”,85联盟
选择3,“HTML”,70联盟
选择4,Java的,61联盟
选择4,“SQL”,68的UNION
SELECT 5,Java的81名工会
选择5,“SQL”,65联盟
选择5,“HTML”,90
选择*从stuinfo的
选择*从stumarks
选择*
从A,stuinfo stumark b
其中a.stuid = b.stuid
选择*
从内部联接stuinfo 1 stumark b
在a.stuid = b.stuid
DECLARE @ @ NUM INT
SET @ @ NUM = 1
选择@ @ NUM
选择@ @错误
去
选择@ @错误-如果没有错误那么@ @错误的2006/02/15什么0 -输出打印是以文本选择以表格的形式
-选择关心在结果调集中出现的列
-从关心表名(数据源)数据源应该提供所有需要的数据
-在关心在结果调集中出现的行
- 子查询在数据源大全-宜配网
SELECT *
从stuinfo A,(选择stuid从stumarks得分> 80)B
='李四' -得分a.stuid = b.stuid和stuname> = 82
选择*
从(选择stuid,从stuinfo其中stuname ='李四'stuname),(选择stuid,stumarks的得分得分> 80)B的
地方a.stuid = b.stuid - stuname ='李四'
选择stuname,得分
从(选择stuid,从stuinfo其中stuname ='李四'),(选择stuid,从stumarks得分> 80分)B
其中a.stuid b.stuid stuname
-找某个指定姓名及以前的所有学员信息
-使用变量
DECLARE @名VARCHAR(50)
集@名称='钱七“
申报数量INT
SELECT @ NUM =从stuinfo stuid stuname = @名称
选择*从stuinfo,其中stuid <= @ NUM
-使用子查询
声明的@ name VARCHAR(50)
集@名称='钱七“
选择*
从stuinfo A,(从stuinfo其中stuname = @名称stuid)B
其中a.stuid <= b.stuid 选择
-使用子查询2
申报名称VARCHAR(50)
SET @名称='张三'
选择*
从stuinfo
stuid <=(选择从stuinfo其中stuname = @名称stuid)
-查询所有的HTML成绩,如果没有成绩的学员赋空
SELECT *
从stuinfoÅ,stumarks b,
其中a.stuid = b.stuid和b.subject =“HTML”
选择*
从stuinfo左加入stumarks b
在a.stuid = b.stuid
b.subject =“HTML”
选择*
来自stuinfo的左连接(从主体那里stumarks =“HTML”选择*)B
a.stuid = b.stuid
选择*
从stuinfo A,(选择stumarks主题=“HTML”*)B
a.stuid = b.stuid和b.subject =“HTML”
-将子查询中提取出来的数据与原始数据每一数据一一对应
。选择*,(从stumarks的选择得分b,其中
从stuinfo a.stuid = b.stuid和主题='HTML')1
选择*
从stuinfo
其中stuid的(选择“从stuinfo stuid其中stuid> 7)
选择stuid
来自stuinfo的
地方stuid没有(从stumarks主题=“HTML”,选择stuid)
选择*
从stuinfo
在(1,3,5)stuid
选择*
从stuinfo
其中stuid>所有(选择从stuinfo的stuid)
选择*
从stumarks
计算平均(评分)
选择题目,AVG(得分)
stumarks
组主题
计算AVG(AVG(得分))
选择以上(按得分顺序排列)*,排名()
从stumarks
从stumarks 选择*,DENSE_RANK(),(按得分顺序排列)
从stumarks 选择*,ROW_NUMBER()OVER(按得分顺序排列)
的stumarks
地方examno> = 10
由examno为了选择前5 *
-通式索引--------------------------------------------- ------
如果存在(sys.indexes的[名称] ='MyTest的'选择*)
指数下降的mytest
去
---非聚集非聚集索引聚集uniqued
创建非聚集索引的mytest
stuinfo(stuname)
- GETDATE()函数是的SQL提供用于获取时间
DECLARE @ f_date的datetime
集@ f_date = GETDATE()
-选择f_date
选择*(指数= MyTest的)stuinfo
声明b_date的datetime
SET @ b_date = GETDATE()
- SELECT @ b_date
选择@ b_date - f_date
声明@ f_date_1的datetime
集f_date_1 = GETDATE()
- SELECT @ f_date
SELECT *从stuinfo
声明@ b_date_1的datetime
集b_date_1 = GETDATE()
-选择@ b_date
选择@ b_date_1 - @ f_date_1
- 创建数据库测试
*从view_1
-创建视图
如果存在(选择sys.views [名称] ='MyView的'*)
下降视图MyView的
走
创建查看MyView的
作为
-放置所有能够正常运行的的SQL的查询
SELECT * FROM stuinfo
去
选择从sys.views *
如果存在(选择sys.views [名称] ='myview1'*)
DROP VIEW myview1
去
创建查看myview1 选择a.stuid a.stuname,b.subject,b.score 从stuinfoÅ,stumarks b ,a.stuid = b.stuid
选择*从myview1
--对一个数据混乱的表添加一个排序列并可以抽取其中任意需要的数据
--测试ROW_NUMBER
选择a.stuname,b.subject b.score,ROW_NUMBER()以上(按得分顺序排列)myid
从stuinfoÅ,stumarks b
其中a.stuid b.stuid
如果存在(选择从sys.views [名称] ='myview2')
DROP VIEW myview2
去
创建查看myview2 选择a.stuname,b.subject b.score,ROW_NUMBER()为myid(按得分顺序) 从stuinfo 1,stumarks b 其中a.stuid = b.stuid
选择*
从myview2
myid> 5
-视图在深层次的意义是对表进行封装,只给你看到你应该看到的
,如果存在(选择从sys.views [名称] ='myview3'*)
下降视图myview3
去
,创建检视myview3 SELECT * FROM stuinfo 去-在某种情况下可以通过视图修改原始数据 插入myview3值('AAA','男',2)
选择*从myview3
选择*从stuinfo
-
如果存在(选择sys.views [名称] ='myview4'*)
DROP VIEW myview4
去
创建查看myview4
作为
SELECT stuname,stusex stuinfo
去
选择*从myview4
插入myview4值('BBB','女')
选择*从stuinfo
-当视图牵扯到:多张表的时候(列列表)是不允许进行修改的
如果存在(选择* sys.views [名称] =“myview5')
DROP VIEW myview5的
创建查看myview5 选择stuname,主题,得分 从stuinfoÅ,stumarks b ,a.stuid = b.stuid
选择*从myview5
插入myview5值(“CCC”,“HTML”,23)
-----
如果存在(选择sys.views [名称] ='myview6“*)
下降视图myview6
去
创建查看myview6
作为
选择。*
从stuinfo 1,stumarks b
其中a.stuid = b.stuid
选择*从myview6
插入myview6值(“sdfklj','KK',1)
-
如果存在(选择从sys.views [名称] ='myview7'*)
下降视图myview7
去
创建查看myview7 选择不同的1。* 从stuinfo 1,stumarks b ,a.stuid = b.stuid
选择*从myview7
插入myview7值(“sdfklj','KK',1)
-
如果存在(选择sys.views [名称] ='myview8“*)
下降视图myview8
去
创建 选择b.stuid编号,stuname姓名,性别stusex,CLASSID班级编号 从stuinfo 1,stumarks b 其中a.stuid = b.stuid 去查看myview8
选择*从myview8
插入myview8值(“sdfklj','KK',1)
- 索引和视图
-为什么使用索引在针对大数据量的时候的查询的速度
-聚集,非聚集,唯一
-
-事务和游标
-事务
如果存在(SELECT *从sysobjects中,其中name =“银行”)
的DROP TABLE银行 的CREATE TABLE银行 ( 用户名VARCHAR(50), 款项的货币支票(款项> = 1) )去
插入银行(“AAA”,1000)
插入银行的价值观('BBB',1)
更新银行的款项=款项- 1000其中username ='AAA' -约束冲突的上面这一行本身就执行的过,而且进行的过反向操作 更新银行设置的款项=款项+1000其中username ='BBB“
选择*从银行
-事务完成:一起执行完一起回滚BEGIN转录检验-打开事务的起点
DECLARE @ num_error INT,@ NUM INT,:UNAME VARCHAR(50),@ uname1 VARCHAR(50)
SET @ num_error = 0 -用来记录是否出现错误
集@ NUM = 1000
集UNAME ='AAA'
集uname1 ='BBB'
-在使用事务的时候,多半结合全局变量@错误
更新银行的款项=款项- NUM其中username = @ UNAME
集@ num_error = @ num_error + @ @ ERROR -透过全局变量记录错误
更新银行集款项=款项+ @ NUM其中username = @ uname1
集@ num_error = @ num_error + @ @错误
(num_error <> 0) -根据前面的记录判断如何处理
开始
打印'错误'
回滚-当出现了错误就回滚
结束
其他
开始
打印'OK'
提交-当没有错误的时候就提交
结束
- 1开始事务
- 2记录可能出现的错误。
- 3根据记录判断是否提交或回滚事务
开始TRAN T1
插入银行的值(1000),'CCC' 保存移植T3 插入银行的价值观(1000),“EEE” ROLLBACK TRAN T3COMMIT TRAN T2
保存移植T2
插入银行的价值观“DDD”(1000)
SELECT @ @ TRANCOUNT
-
如果存在(*)
释放的光标
去选择sys.syscursors其中cursor_name ='的光标'
申报的光标
光标滚动-界面风格默认什么只向前
为来自stuinfo的选择*
开放的光标
DECLARE @ ID INT,@名VARCHAR(50),@性别VARCHAR(50),@ CID诠释
提取的光标到@ ID,姓名,@性别,@的CID
同时(@ @ FETCH_STATUS = 0)
开始
(@性别=“男”)
开始
设置@性行为='*' - PRINT @名+ @性别 取的光标下到@ ID,@姓名,性别,@ CID 年底 关闭的光标
选择从sys.syscursors *
- 1创建游标
- 2打开
- 3订需要的变量要求和游标中的变量清单在数目,顺序和数据类型上一致
- 4需要的操作
- @ @ FETCH_STATUS如果不等于就是到了结尾
-记得每次操作要将游标的指针向下或向上网站移动台
- 5关闭
- 一张表没有的主建,也没有身份现在需要提取其中的第3-6行(ROW_NUMBER)
申报的光标
光标滚动
开放的光标
声明@ ID INT,@名称为varchar(50),@性别VARCHAR(50),@的classid诠释
提取的光标先进入@ ID,@名称,@性别,@的classid
(@ @ FETCH_STATUS = 0)
开始
打印转换(VARCHAR(50),@ ID)+ @名
取的光标下到@ ID,姓名,@性别,@的classid
年底
关闭的光标
创建 ,主题选择stuname,得分 从stuinfoÅ,stumarks b, 其中a.stuid = b.stuid 去查看MyView的
--存储过程
--类似Java中的方法,将一些功能打包运行(功能模块)
--隐藏底层信息
选择*从sp_databases
- EXEC专门用来执行存储过程
EXEC sp_databases
EXEC sp_tables的
-自定义
-降PROC MyProc的
如果存在(选择sys.procedures [名称] ='MyProc的'*)
下降PROC MyProc的
去
创建PROC MyProc的 开始 从stuinfo SELECT * 去
选择从sys.procedures *
-创建?
如果存在(选择*从sys.procedures [名称] =“myproc1)
掉落触发myproc1的的
创建PROC myproc1 开始 创建表测试 ( ID INT )
结束
去
EXEC myproc1
选择*从测试
- 参数
如果存在(sys.procedures [名称] ='MyProc2的'选择*)
下降PROC MyProc2的
去
创建进程MyProc2的
-参数列表
@ ID INT
作为
开始
选择*从stuinfo的地方stuid = @ ID
结束
去
EXEC MyProc2的3
--存储过程可以将对底层的操作隐藏
--存储过程在第一次运行的时候会有一个编译的过程,所以理论上来讲当后续运行的时候
--运行速度要快(针对没有将内容进行存储过程打包)
--如果直接运行这些语句会占用资源
- 多个参数
如果存在(选择sys.procedures [名称] ='myproc3'*)
下降PROC myproc3
去
创建进程myproc3
-参数列表
@ ID INT,
@名称为varchar(50)
开始
选择*从哪里stuid = @ id和stuname = @名称stuinfo
结束
去
EXEC myproc3 3,'王五'
EXEC myproc3 @名称='王五',@ ID = 3
-关于默认值
,如果存在(选择sys.procedures [名称] ='myproc4'*)
下降PROC myproc4
去
创建进程myproc4
-参数列表
名称为varchar(50),
@性别为varchar(4)='男' -设定界面风格默认2006/02/15
@的classid诠释
为
开始
进入stuinfo值插入(@名称,@性别,@的classid)
结束
去
EXEC myproc4'AA',1
- 界面风格默认2006/02/15的的问题
EXEC myproc4'AA',默认情况下,1
EXEC myproc4 @名称='AA',@的classid = 1
如果存在(选择sys.procedures [名称] ='myproc5'*)
下降PROC myproc5
去
创建进程myproc5
- 参数列表
,名称为varchar(50),
@的classid诠释, 性别VARCHAR(4)='男' -设定界面风格默认2006/02/15 作为 开始 进入stuinfo值插入(@名称,@性别,@的classid) 结束 去
EXEC myproc5'AA',1
-返回值
,如果存在(选择sys.procedures [名称] ='myproc6'*)
下降PROC myproc6
去
创建进程myproc6
-参数列表
@ ID INT,
@名称为varchar(50),
@ NUM INT输出,
性别VARCHAR(4)='男' -设置默认值
@ NUM =的classid stuinfo -选择的classid从stuinfo哪里 结束
DECLARE @ num_out INT
DECLARE @名VARCHAR(50)
集@名称='李四'
EXEC myproc6 1,@名称,@ num_out输出
选择num_out
--存储过程的参数可以使用变量进行输入
--存储过程的输出参数在接收其传回的数据的时候一定要加上关键字output,如果没加逻辑没错
--得不到内容
选择*从stuinfo
-
如果存在(选择sys.procedures [名称] ='myproc7'*)
下降PROC myproc7
去
创建进程myproc7
-参数列表
INT,
@ NUM INT输出,
名称为varchar(50),
@性别VARCHAR(4)='男' -设置默认值
@ NUM =的classid stuinfo -选择的classid从stuinfo哪里 结束
DECLARE @ num_out INT
SET @ num_out = 1
申报名称VARCHAR(50)
集@名称='李四'
EXEC myproc7 num_out输出,
选择
-
删除从stuinfo的地方stuid = 1
DECLARE @ NUM INT
SET @ NUM =?
EXEC myproc8 @ NUM
-出现的问题的原因:因为存在主外键当删除主键方的数据的时候可能外键数据存在就会触发约束
,如果存在(从sys.procedures选择[名称] ='myproc8“)
降PROC myproc8
去
创建进程myproc8
-参数列表
INT,
@ NUM诠释
作为
开始
-看:外键表是否存在相应的数据
删除stumarks其中stuid = @ NUM
删除从stuinfo stuid = @ NUM
月底
去
删除stuinfo其中stuid = 1
从stumarks的SELECT *
EXEC myproc8 1
--在刚才的内容上添加:当删除外键表信息的时候为了保存相应的数据将被删除的数据(外键)备份
--备份表的表名自行自定
--只要数据
-在实现删除之前:
- 1。判断需要的表是否存在如果不存在建立如果存在(删除x)
- 2得到要删除的数据(游标)
- 3。将得到的数据新增到:对应的表中
- 4删除:外键和的主键表中的数据
如果存在(选择从sys.procedures [名称] ='myproc9“的*)
下降PROC myproc9
去
创建进程myproc9
-参数列表
@ NUM INT
作为
开始
,如果不存在(从sys.objects中选择* [名称] ='的mytest')
开始
创建表的mytest
(
主题为varchar(50),
得分浮动
)
结束
如果存在(从sys.syscursors选择[cursor_name] ='mycursor_mytest)
释放mycursor_mytest 声明mycursor_mytest 光标滚动, 选择课题,从stumarks地方stuid = @ NUM得分
打开mycursor_mytest
声明@子VARCHAR(50),@得分浮法
提取从mycursor_mytest成@子的第一,@得分
(@ @ FETCH_STATUS = 0)
开始
打印@子+''+转换(VARCHAR(50),@得分)
插入的mytest值(@,@得分分)
取@ @分,得分从mycursor_mytest下
结束
-看:外键表是否存在相应的数据
-删除stumarks stuid = @ NUM
-从stuinfo删除stuid = @ NUM
年底
EXEC myproc9 2
-下拉表MyTest的
选择*从MyTest的
-------------------------------------------------- ---------------------------
如果存在(选择从sys.procedures [名称] ='myproc8“的*)
下降PROC myproc8
去
建立PROC myproc8
-参数列表
@ NUM VARCHAR(50)='*'
作为
开始
-看:外键表是否存在相应的数据
,如果(@ NUM ='*') SELECT * 年底
开始
从stuinfo 别人 开始 申报coun INT SELECT @ coun = COUNT(*)从stuinfo 如果(coun> 0) 开始 -有 年底 其他 开始 -没有 结束 结束 结束 去
--触发器:特殊的存储过程
--触发器只有SQL管理系统可以调用,当预定的操作发生时有系统调用(地雷)
-触发器的分类
-触发器分为前触,后触
-触发器可以针对表和视图
-库存
,如果存在(选择*从sys.objects中的[名称] ='存')
DROP TABLE存
去
创建表村
(
CID INT,
数量INT
)
去
-物品
如果存在(从sys.objects中选择* [名称] ='OBJ')
DROP TABLE obj的 创建表的OBJ ( OID诠释, 名称为varchar(50) ) 去 -销售 ,如果存在(从sys.objects中选择* [名称] ='O') DROP TABLEØ 创建表O ( 鲕INT, SNUM INT )
成存值(1,50)插入
插入插入到obj的值(1,“MP3”)O值(1,3)
选择*从obj
村
选择SELECT * O *
-在向议张表插入数据的同时能够进行关联的操作
创建进程的mytest
@ ID INT,
@ NUM INT
作为
开始
申报num_cun INT
选择@ num_cun = NUM从村CID = @ ID
更新存集数= @ num_cun - NUM其中CID = @ ID
插入O值(@ ID,NUM)
结束
EXEC MyTest的1,3
删除
插入有删除没有
-如果做删除:插入没有删除有
-如果做更新:插入有(新数据)删除有(被删除的数据)
如果存在(从sys.triggers选择* [名称] =放到mytri“)
DROP TRIGGER放到mytri
去
创建触发器放到mytri
对O 为插入 开始 选择*从插入 删除SELECT * 去- EXEC放到mytri -错 -删除 如果存在(从sys.triggers选择[名称] ='mytri1) DROP TRIGGER mytri1 去 创建触发器mytri1 对O 删除 作为 开始 选择从插入 选择*删除 月底 去 -更新 如果存在(选择* [名称] =“mytri2) DROP TRIGGER mytri2 创建触发器mytri2 对O 进行更新, 从插入 开始 SELECT * FROM SELECT * 删除 年底从sys.triggers
更新O集SNUM = 5鲕= 1
从O中删除鲕= 1
选择O *
选择*从sys.triggers
-完成上面存储过程的操作
,如果存在(选择*从sys.triggers [名称] ='mytri4)
下跌触发mytri4
去
创建触发器mytri4
对O 插入 作为 开始 申报@ ID INT,@ NUM INT SELECT @ ID =鲕,Num = SNUM从插入-鲕粒的,SNUM 声明@ num_cun INT 选择num_cun = NUM从村CID = @ ID -打印转换(VARCHAR(50),@ num_cun)+“'+ CONVERT(VARCHAR (50),@ NUM)+“'+ CONVERT(VARCHAR(50),@ ID) 更新村一组数= @ num_cun - @ NUM其中CID = @ ID -插入到O值(@ ID,NUM) -我们现在使用的是后触所以这个操作(相当于)已经完成
如果存在(选择从sys.procedures [名称] ='myproc8“的*)
下降PROC myproc8
去
创建进程myproc8
-参数列表
INT,
@ NUM诠释
作为
开始
-看:外键表是否存在相应的数据
删除stumarks其中stuid = @ NUM
删除从stuinfo stuid = @ NUM
月底
去
删除stuinfo其中stuid = 1
从stumarks的SELECT *
EXEC myproc8 (* sys.triggers的[名称] ='mytri5') DROP TRIGGER mytri5 创建触发器mytri5 上stuinfo 删除 作为 开始 -打印'一' 申报数量INT SELECT @ NUM = stuid的删除 从stumarks删除stuid = @ NUM 删除stuinfo stuid = @ NUM 年底
-使用前置触发器
-前置触发器相当于替换了当前的操作
,如果存在(选择* sys.triggers从[名称] ='mytri6')
DROP TRIGGER 触发mytri6 mytri6
去
创造 ,而不是
对stuinfo
删除
作为
开始
-打印“'
DECLARE @ NUM INT
SELECT @ NUM =删除stuid
从stumarks删除其中stuid = @ NUM
删除从stuinfo stuid = @ NUM
-已经通过了362触发器的区间理论上来讲不会再触发当前触发器
月底
去
从stuinfo删除其中stuid = 2
从stuinfo
选择* 选择* 从stumarks
-前置触发器在某个操作上理论上来讲只能放一个
,如果存在(选择sys.triggers [名称] ='mytri7“*)
下降触发mytri7 创建触发器mytri7 上stuinfo ,而不是删除 作为 开始 打印'' 结束 去
-后置触发器是可以连结
,如果存在(从sys.triggers选择[名称] ='mytri8')
DROP TRIGGER mytri8 创建触发器mytri8 上stuinfo 开始 打印的“ 结束 去 为删除
如果存在(从sys.triggers选择[名称] ='mytri9')
DROP TRIGGER mytri9
去
创造 开始 打印“B” 月底 去
上stuinfo 触发mytri9
为删除
如果存在(sys.views [名称] ='MyView的“选择*)
DROP VIEW MyView的 创建视图MyView的 选择*从stuinfo 去
选择MyView的*
- 后触不能用于视图,所以应该使用前置
如果存在(选择*从sys.triggers的[名称] ='mytri10)
下降的触发mytri10
去 作为 开始
创建
MyView的
,而不是插入触发器mytri10 打印“B” 月底 去
MyView的插入(stuname,stusex,CLASSID)值('AA','一',1)
插入stuinfo值(HSC','男',1)
如果存在(选择*从sys.triggers [名称] ='DEL')
DROP TRIGGER德尔
去
创建触发器德尔
上stuinfo 插入 -更新删除 作为 开始 删除从stuinfo其中stuId> 5 -删除 年底
如果存在(从sys.triggers选择[名称] ='最多')
DROP TRIGGER起来
去
创造
上stuinfo 触发删除,从stuinfo 开始选择* -删除stuinfo,stuId> 5 -删除 年底
从stuinfo删除其中stuid = 4
如果存在(选择*从sys.triggers [名称] ='更新')
DROP TRIGGER更新
去
创建触发器更新,而不是 更新
stuinfo - 而不是前触先触发执行里面的语句没执行SQL语句 后触先执行操作再执行触发器的语句 作为 从stuinfo 开始的选择* -删除stuinfo其中stuId> 5 -删除 年底
更新stuinfo集stuname ='黄少成123'stuid = 7
选择从stuinfo *
选择*从stumarks
执行存储过程sp_helptext'DEL' - 查看触发器的