sql学习笔记

来源:互联网 发布:禁闭岛 知乎 编辑:程序博客网 时间:2024/04/29 13:33
Code:
  1. if exists (select * from sysdatabases where name = 'student')   
  2. drop database student  --如果该数据库已经存在就删除   
  3. go   
  4. create database student  sysdatabases    
  5. go   
  6. use student   
  7. go   
  8. if exists (select * from sysobjects where name = 'stuinfo')   
  9. drop table stuinfo   --如果该表已经存在就删除   
  10. go   
  11. create table stuinfo   
  12. (   
  13. sid int primary key,   
  14. sname varchar(40) not null,   
  15. ssex varchar(20) not null  
  16. )   
  17. go   
  18. if exists (select *from sysobjects where name ='scoreinfo')   
  19. drop table scoreinfo   
  20. create table scoreinfo   
  21. (   
  22. id int primary key,   
  23. sid int references stuinfo(sid),--外键   
  24. score int not null  
  25. )   
  26. go   
  27. insert into stuinfo values(0001,'张三' ,'男')   
  28. insert into stuinfo values(0002,'李思','女')   
  29. go   
  30. insert into scoreinfo values(01,0001,85)   
  31. insert into scoreinfo values(02,0002,80)   
  32. go   
  33. --演示多表联结查询(必须有主外键关系)   
  34. use student   
  35. go   
  36.   --(1)内联结查询--》特点:能取出公共字段的“共同值”   
  37. select * from stuinfo as stu inner join scoreinfo as sco on stu.sid=sco.sid   
  38.   --(2) 左外联接 --》特点:能取出公共字段和“左表”的全部值   
  39. select *from stuinfo as stu left outer join scoreinfo as sco on stu.sid=sco.sid   
  40.   --(3) 右外联接 --》特点:能取出公共字段和"右表"的全部值   
  41. select *from stuinfo as stu right outer join scoreinfo as sco on stu.sid=sco.sid   
  42.   
  43. --演示子查询----查询出姓名为‘张三’的人的分数   
  44. select score from scoreinfo where sid=(select sid from stuinfo where sname='张三')   
  45.   
  46. --演示排序函数   
  47.   
  48. --集合运算:   
  49. --UNION和UNION ALL:并集   
  50. --UNION:把两张表合为一张表,去掉重复数据   
  51. --UNION ALL:把两张表合为一张表,不去掉重复数据   
  52. --注意:两张是同一个表   
  53. select * from stumarks where writtenexam >70   
  54. union  
  55. select * from stuinfo where writtenexam > 60   
  56. select * from stumarks where writtenexam > 70   
  57. union all  
  58. select * from stumarks where writtenexam > 60   
  59. --INTERSECT:交集   
  60. --把两张表合为一张表,去掉不重复数据,保留重复数据   
  61. select * from stumarks where writtenexam > 70   
  62. intersect  
  63. select * from stumarks where writtenexam > 60   
  64. --EXCEPT:差集   
  65. --把两张表相减,保留不重复的数据   
  66. --注意:前一个表比后一个表的数据要多才行   
  67. select * from stumarks where writtenexam > 60   
  68. except  
  69. select * from stumarks where writtenexam > 70   
  70.   
  71.   
  72.   
  73. --带输入参数的存储过程   
  74. if object_id ('test','p'is not null  
  75. drop proc test --如果该存储过程已经存在就删除   
  76. go   
  77. create proc test   
  78. @a int ,@b int  
  79. as  
  80. select @a-@b   
  81. go   
  82. exec test @b=15, @a=20--执行存储过程(传参数)   
  83.   
  84.   
  85.   
  86. --带输出参数的存储过程   
  87. if object_id ('demo','p'is not null  
  88. drop proc demo   
  89. go   
  90. create proc demo   
  91. @num1 int,@num2 int,@num3 int output  
  92. as  
  93. set @num3=@num1+@num2   
  94.   
  95. go   
  96. declare @temp int --定义临时变量   
  97. exec demo @num1=20,@num2=15,@num3=@temp output  
  98. select @temp  
  99.   
  100. --存储过程完成分页   
  101. if object_id('page','p'is not null  
  102. drop proc page   
  103. go   
  104. create proc page   
  105. --输入参数:当前页,每页显示的条数,表名,字段   
  106. @currentpage int=1,   
  107. @count int=10,   
  108. @tablename varchar(20),   
  109. @column varchar(20)   
  110. as  
  111. declare @sql nvarchar(1000)   
  112.   
  113. set @sql = 'select top ' + str(@count)+' * from '+ @tablename + ' where '+ @column +' not in'+   
  114. ('select top ' + str((@currentpage-1)*@count) + @column + ' from ' + @tablename)   
  115.   
  116. exec(@sql)   
  117. go   
  118.   
  119. exec page 2,3,'bookinfo','bookid'  
  120. --计算出总页数   
  121.   
  122.  总页数=(总条数(每页显示的条数-1))/每页显示的条数   
  123.   
  124.   
  125.   
  126. --sql语句查询第N页数据(每页显示M条数据)   
  127.   
  128. use bookshop   
  129. go   
  130. i=(n-1)*m   
  131. select top n * from bookinfo where bookid not in (select top i bookid from bookinfo )   
  132.   
  133.   
  134.   
  135. --事务与游标   
  136. --模拟汇款操作,典型的事务举例(其实sql中的关键字go就是一个事务)   
  137. begin transaction tran_bank --transaction可以简写为tran   
  138. --定义一个记录错误的变量   
  139. declare @tran_error int  
  140. set @tran_error = 0   
  141. --在三毛的账户减去钱   
  142. update bank set currentMoney=currentMoney + 1000 where customerName ='三毛'  
  143. set @tran_error = @tran_erro + @@error   
  144. --在小毛的账户中增加钱   
  145. update bank set currentMoney=currentMoney -1000 where customerName='小毛'  
  146. set @tran_error =@tran_error +@@error   
  147. if @tran_error <> 0   
  148. begin  
  149.  --执行出错,立即回滚事务   
  150. rollback transaction    
  151. print '转账失败,双方交易取消'  
  152. end  
  153. else  
  154. begin  
  155. --没有发现出错   
  156. commit transaction  
  157. print '转账成功,双方交易完成'  
  158. end  
  159. go   
  160.   
  161. --视图与索引   
  162.   
  163. --如果已经存在就删除   
  164. if exists (   
  165.   select *from dbo.sysobject  where name='view_stuInfo_stuMarks'  
  166.           )   
  167. drop view view_stuInfo_stuMarks  --删除视图的语法   
  168. go   
  169. create view view_stuInfo_stuMarks   
  170. as  
  171. --内联接查询语句   
  172.  select * from stuinfo as stu inner join scoreinfo as sco on stu.sid=sco.sid   
  173. go   
  174. --查看视图   
  175. select *from view_stuInfo_stuMarks   
  176.   
  177. --触发器   
  178.   
  179. --insert触发器   
  180. --卡表   
  181. create table  card   
  182. (   
  183.  id int primary key,   
  184.  card_name varchar(40),    
  185. banlance money    
  186. )   
  187. go   
  188. insert into card values(001,'张三',2000)   
  189. insert into card values(002,'李四',8000)   
  190. insert into card values(003,'王五',5000)   
  191. --交易表   
  192. create table translate   
  193. (   
  194. t_id int primary key,   
  195. card_id int,   
  196. t_date datetime,   
  197. t_type varchar(4),   
  198. salary money    
  199. )   
  200. insert into translate values(001,001,getdate(),'存',400)   
  201. insert into translate values(002,002,getdate(),'取',400)   
  202. insert into translate values(0004,003,getdate(),'存',400)   
  203. go   
  204.   
  205. if object_id('ex'is not null  
  206.  drop trigger ex   
  207. go   
  208. create trigger ex   
  209. on translate for insert  
  210. as  
  211. declare @id int  
  212. declare @c money   
  213. declare @type varchar(4)   
  214. --inserted逻辑表   
  215. select @id =card_id,@c=salary,@type=t_type from inserted   
  216. if @type='存'  
  217. begin  
  218. update card set banlance =banlance+@c where id=@id   
  219. end  
  220. else  
  221. begin  
  222. update card set banlance =banlance-@c where id=@id   
  223. end