SQL基础和高级总结

最近都在忙毕业设计,所幸做的差不多了。蛋碎的是尼玛要写文档呀。昨天突然想起来SQL有些东西忘记了,在此整理一下学过的知识。希望给大家有所帮助。

/*SQL 基础*/

/*创建数据库格式*/

SQL基础和高级总结

SQL基础和高级总结

 

SQL基础和高级总结
 1 /*创建数据库*/
 2 create database blackhourse
 3 on primary
 4 (
 5     name=黑马
 6     ,filename=E:\新建文件夹\黑马.mdf
 7     ,size=10MB
 8     ,maxsize=100MB
 9     ,filegrowth=10%    
10 )log on
11 (
12     name=黑马_log
13     ,filename=E:\新建文件夹\黑马_log.ldf
14     ,size=5MB
15     ,maxsize=50MB
16     ,filegrowth=10%
17 );
18 
19 /*
20 drop database blackhourse
21 */
创建数据库
SQL基础和高级总结
 1 /*调用存储过程,分离数据库*/
 2 
 3 exec sp_detach_db blackhourse;
 4 exec sp_detach_db archive;
 5 exec sp_detach_db zdp;
 6 exec sp_detach_db zdpdsy;
 7 exec sp_detach_db  archive1;
 8 
 9 /*附加数据库*/
10 create database archive
11 on(
12     filename=E:\新建文件夹\黑马.mdf
13 )log on(
14     filename=E:\新建文件夹\黑马_log.ldf
15 )
16 for attach;
17 
18 create database archive1
19 on(
20     filename=E:\新建文件夹\heima.mdf
21 )
22 log on
23 (
24     filename=E:\新建文件夹\heima_log.ldf
25 )
26 for attach;
附加和分离数据库
SQL基础和高级总结
 1 /*创建架构,表*/
 2 use archive;
 3 go
 4 create schema Mydounaifen authorization dbo;
 5 go
 6 
 7 create table Mydounaifen.TlStudent
 8 (
 9     /*列名,数据类型,约束(自动编号,主键)*/
10     stuName char(10),
11     stuAge int,
12     stuSex char(2)
13 );
创建架构,表
SQL基础和高级总结
 1 /*常用数据类型*/
 2 ->数字类型:int,tinyint
 3 ->时间类型:datatime 格式:”yyyy-MM-dd hh:mm:ss.sss”
 4 ->二进制数据类型 image (存储图片)
 5 -> bit 类型 1 0     ‘true’ ‘false’
 6 ->字符串类型:
 7 Char,nchar,varchar,nvarchar
 8 //可以存储大量的字符串
 9   varchar(max)
10   nvarchar(max)
11 //不建议使用下面这两个,因为被淘汰了
12   text
13   ntext
14 Varchar 与char的区别
15 1可变长度 varchar(节省空间,不过效率相对来说慢一点)
16 2 固定长度 char (比较浪费空间)
17 Nchar(10),char(10)的区别
18 Char 存储的是字节个数
19 Nchar 存储的是字符个数,用来存储中文
常用数据类型
SQL基础和高级总结
 1 /*约束*/
 2 -- 保护数据完整性的机制:让存储的数据有意义的条件
 3 /*
 4     分类
 5     1.主键约束
 6     2.唯一约束
 7     3.检车约束
 8     4.默认约束
 9     5.非空约束
10     6.主外键约束
11 
12 */
13 -- 基本语法
14 /*
15     alter table 架构.表名
16     add constraint 约束名 约束类
17 */
18 
19 --添加检查约束
20 alter table Mydounaifen.TlStudent
21 add constraint CK_TlStudent_stuSex 
22 check(stuSex=or stuSex=);
23 --其他约束类似
24 
25 --删除多个约束,约束名用,隔开
26 alter table Employees 
27 drop constraint 
28 DF_Employees_EmpGender,
29 CK_Employees_EmpAge
30 
31 --增加多个约束
32 /*添加非空约束
33 为年龄与性别添加检查约束
34 为邮箱添加唯一约束
35 */
36 alter table Student
37 add constraint ck_Student_stuAge
38 check(stuAge>0 and stuAge<30),
39 constraint ck_Student_stuSex
40 check( stuSex=or stuSex=),
41 constraint uq_Student_stuEmail
42 unique(stuEmail);
43 
44 --增加一列
45 alter table Mydounaifen.TlStudent
46 add email varchar(20) null;
47 
48 --删除一列
49 alter table Mydounaifen.TlStudent
50 drop column email;
51 
52 --修改某个列数据类型
53 alter table Mydounaifen.TlStudent
54 alter column email nvarchar(20) null;
55 
56 create table tblCourseT_SQL2
57 (
58     cId int identity(1,1) not null
59     , cName nvarchar(10) not null
60     , cDesc nvarchar(100) null   -- description
61 );
62 alter table tblCourseT_SQL2
63 add constraint PK_tblCourseT_SQL2_cId primary key(cId);
64 
65 -- 学生
66 create table tblStudentT_SQL2
67 (
68     stuId int identity(1,1) not null
69     , stuName nvarchar(10) not null
70     , cId int null -- 外键stuTocId
71 );
72 
73 --创建外键约束主键表中必须有个主键
74 alter table  tblStudentT_SQL2
75 add constraint [FK_tblStudentT_SQL2_tblCourseT_SQL2_cId]
76 foreign key(cId) references tblCourseT_SQL2(cId);
77 
78 /*
79     补充说明
80     主外键表中,关联主键表的字段必须是主键和唯一键
81 
82 */
约束
SQL基础和高级总结
  1 /*增删改查*/
  2 
  3 /*插入 */
  4 
  5 --insert 架构名.表名(列,列,.....) values(值,值,....)
  6 --基本插入
  7 insert into Mydounaifen.TlStudent(stuName,stuAge,stuSex)
  8 values(豆奶粉,22,);
  9 insert into Mydounaifen.TlStudent(stuName,stuAge,stuSex)
 10 values(大鹏,22,);
 11 这种写法每次只能插入一条数据
 12 
 13 --为自动编号插入数据(tid为自动编号)
 14 set IDENTIY_INSERT TblTeacher on
 15 insert into TblTeacher(tid,tname,tsalary)
 16 values(100,bob,50000)
 17 
 18 --当向表中的除自动编号外的所有其他列插入数据的时候,这是可以省略列名。
 19 insert into T_Seats values(LoginId,RealName,Pwd);
 20 
 21 --向一个已经存在的表中插入数据,数据的来源是另外一张表
 22 insert into NewTblTeacher (tname,tage)
 23 select tname,tage from TblTeacher
 24 --返回刚插入数据的自动增长编号 
 25 insert into Exe2.LoginTbl output inserted.id values(zdpdsy123,123);
 26 --表值函数
 27 /*
 28     格式:insert into 表名(列1,列2,…) values(值1,值2,…), (值1,值2,…),
 29 (值1,值2,…);
 30 */ 
 31 insert into StudentTest(stuName,stuSex,StuAge)
 32 values(牛亮亮,m,30),(王成伟, m, 28),
 33 (赵晓虎, m, 29),(李艳茹, f, 19),
 34 (牛亮亮,f,22),(苏坤,m,30),(苏坤,f,27);
 35 
 36 /*修改 */
 37 
 38 --update 架构名.表名set 字段=值,字段=值.... where 条件
 39 update Mydounaifen.TlStudent set stuAge=20 where stuName=豆奶粉;
 40 
 41 --/*删除数据 */
 42 -- delete from 表名where 条件;
 43 -- drop database|table|schema 名字;
 44 -- truncate table 表名
 45 drop table Student;
 46 
 47 delete from Mydounaifen.TlStudent where stuName=大鹏;
 48 
 49 truncate table TblTeacher
 50 ===========================
 51 两者区别
 52 1.delete删除的时候,自动编号没有恢复到默认值,而truncate 可以.
 53 2.truncate 删除数据的时候,只能一次性都清除,不能根据条件来删除 则delete可以.
 54 3.truncate删除数据的速度比delete快的多
 55 4.truncate语句不会触发delete触发器
 56 
 57 --/*查询 */
 58 /*格式
 59     select distinct |top 数字[percent]
 60         字段as常量
 61         ,包含字段表达式
 62         ,函数 Sum,max
 63         ,常量
 64     from 
 65         表或结果集
 66     where 
 67         条件: 逻辑|空值|多条件|模糊|范围
 68     group by
 69         字段
 70     having
 71         筛选条件
 72     order by
 73         字段 desc | asc
 74     执行顺序
 75     from -> where -> group by -> having -> select -> order by            
 76 */
 77 select 
 78   *
 79 from MyStudent --1>先从MyStudent表中拿到数据
 80 where fage>30  --2>从MyStudent的数据中筛选出所有年龄大于30的人的信息
 81 group by fgender --3>按照性别分组,分完组以后又得到一个新结果集
 82 having count(*)>500 --4>基于分组以后的结果集,然后再筛选,筛选出人数>500的记录
 83 
 84 
 85 /*
 86     from 子句
 87     寻找数据源,后面可以跟表,视图,表值函数,结果集等
 88     where子句
 89     对from所得到的临时表做一次筛选,是直接在结果中将筛选到的结果组成一个临时表
 90     null值处理
 91     判断一个字段是否为null使用
 92         字段 is [not] null
 93     null表示的是不知道,凡是与null参与的运算得到的结果都是null和不知道    
 94 
 95 */
 96 --查看整个表
 97 select * from TblScore;
 98 --考试期中及格
 99 select * from TblScore where ScoreNum>=60;
100 --期末及格考试
101 select * from TblScore where ScoreLast>=60;
102 --按照姓名分组
103 select stuName from StudentTest 
104 group by stuName;
105 --取成绩前五名
106 select top 5 * from MyStudent 
107 order by fag desc
108 /*模糊查询 */
109 通配符;
110 1. % //匹配多个字符
111 select 
112 * 
113 from Mystudent
114 where fname like %敏%
115 2. -//匹配一个字符
116 --查询姓赵的同学,且长度为三个
117 select * from MyStudent
118 where fanme like 赵__
119 
120 select * from MyStudent
121 where fanme like 赵% and len(fname)=3
122 
123 3. []
124 --查询出姓名包含‘雷‘或‘伟‘的人的姓名
125 
126 select * from MyStudent
127 where fname like %[雷伟]% 
128[]括起来,表示转义字符 如[%]
129 
130 --聚合函数
131 --count ,max,min ,avg,sum
132 --聚合函数默认忽略null值
133 --基本语法:函数名(字段)
134 
135 select count(*) from StudentTest;
136 select stuName,count(*),avg(stuAge) from StudentTest
137 group by stuName;
138 select avg(scoreNum) from ScoreAgg;
139 select count(scoreNum) from ScoreAgg;
140 
141 -- 别名
142 --    select列 as 别名    (推荐)
143 --    select列 别名        (不推荐)
144 --  别名=select列        (推荐)
145 select
146     custId as "用户ID"  --(推荐用)
147     ,count(*) as [用户订单数]
148     ,
149     case 
150         when count(*)>1 then 高级用户
151         else 第一次访问用户
152     end as 用户等级
153     ,sum(unitprice * quantity * discount) as 用户总金额
154 from OrdersTable
155 group by custId
156 having sum(unitprice * quantity * discount)>120;
157 
158 --按英语成绩排序,如果英语一样,则按数学成绩排序
159 select * from MyStudent
160 order by FEnligsh desc,FMath desc;
161 --order by 后面可以跟一个表达式
162 --order by 永远是在语句最后面执行
163 
164 /*select into */
165 /*
166     select into 语法
167     
168     select
169         字段等
170     into 表名
171     from
172         数据源
173     其他子句
174 */
175 select * into
176 FormSelect
177 from StuSetInto;
178 
179 select * from FormSelect;
180 /*
181     select * into 新表名from 数据源where 1>2;
182     只会把表的结构复制过来,
183     但是键和约束索引等不会复制过来。
184     除了自动增长的
185 */
186 select * into NewTable from FormSelect where 1>2;
增删改查
SQL基础和高级总结
 1 /*Union all 结果集 */
 2 两个集合必须有相同的列,才能union
 3 --union联合的作用就是多个结果集并到一起
 4 --联合结果集的列名由第一个结果集确定
 5 --对应的数据类型的个数要一致----------------------------------
 6 select fname,fage from mystudent where fid>999
 7 union all
 8 select tsname,tsage tblstudent where tsid>12
 9 练习===============================
10 
11 请查询出每个销售员的销售总金额以及总的销售金额
12 select 
13    销售员,
14    销售金额=sum(销售数量*销售价格)
15 from Myorders
16 gropu by 销售员
17 union all
18 select 总的销售金额:,sum(销售数量*销售价格)
19 from sum(销售数量*销售价格)
20 
21 
22 
23 insert into TblTeacher 
24 select Chiris,1,20,2000000,1999-9-9 union
25 select Chiris,1,20,2000000,1999-9-9 union
26 select James,1,21,2000000,1990-9-9 union
27 select James,1,21,2000000,1990-9-9
28 ========================================
29 [union关键字本身就具有去掉重复的意思,如果不想去掉重复用union all ]
Union all 结果集
SQL基础和高级总结
  1 --/*常用函数(重点)*/
  2 --数学函数,字符串函数,时间函数,转换函数,聚合函数
  3 
  4 
  5 --时期函数
  6 --获的当前时间
  7     select getdate();
  8 --简写形式
  9     --year(时间),month(时间),day(时间)
 10     select year(getdate()),month(getdate()),day(getdate());
 11 /*
 12     dateadd
 13     在指定时间上的指定部分加上一个数字
 14     dateadd(部分,数字,时间对象)    
 15     具体查看联机丛书
 16     在指定位置上加上指定的书,可以获取午夜时间
 17     dateadd(month,1,‘2013-8-7‘)
 18     返回的是一个时间对象
 19 */
 20 select dateadd(day,10,getdate());
 21 select 2013-8-7 11:50,dateadd(day,-10,2013-8-7 11:50);
 22 
 23 select dateadd(month,1,2013-8-7);
 24 
 25 /*
 26     datediff 计算两个时间特定的差比如说差几年,差多少天
 27     语法DATEDIFF (part , startdate , enddate )
 28     part 表示年,月,日,星期这些。
 29     datediff(year,‘1999-9-9‘,getdate())
 30 */
 31 select datediff(year,1999-9-9,getdate());
 32 
 33 select datediff(month,2013-7-31,2013-8-1);
 34 
 35 --获取上一个月的最后一天
 36 select dateadd(day,-1*day(getdate()),getdate());
 37 
 38 /*
 39     datepart 截取日期的特定部分
 40     datepart(部分,日期)
 41 */
 42 
 43 select datepart(weekday,2013-8-7);
 44 
 45 
 46 --转换函数cast,convert
 47 /*
 48     语法
 49     cast ( 数据或字段as 数据类型);
 50     
 51     convert(数据类型,字段);
 52 
 53 */
 54 /*
 55 select cast(1 as varchar(5))+‘a‘;
 56 
 57 select convert(varchar(5),3)+‘a‘;
 58 */
 59 
 60 
 61 --数学函数
 62 --round 四舍五入函数
 63 --语法(源数字,保留位数,截断标志) 
 64 select 122.56,round(122.56,1);
 65 
 66 select 133.59,round(133.59,1),round(133.59,1,2);
 67 
 68 select 1.2,ceiling(1.2),1.8,floor(1.5);
 69 
 70 select sqrt(2);
 71 
 72 
 73 --SIGN 返回符号. 等价于:|x|/x 
 74 -- x的值为正数则sign(x) = 1
 75 -- x的值为负数则sign(x) = -1
 76 -- x的值为       则sign(x) = 0
 77 
 78 select sign(-27),sign(27),sign(0);
 79 
 80 select power(2,30);
 81 
 82 
 83 
 84 --字符串函数
 85 -- len()            字符长度
 86 -- datalength()        字节长度
 87 
 88 select 1二,len(1二),datalength(1二);
 89 
 90 --ltrim rtrim
 91 
 92 select ltrim(    123),rtrim(123   );
 93 select ltrim(rtrim(  123  ));
 94 
 95 -- left() right()
 96 -- left
 97 -- 字符串left(字符串, 数字)
 98 -- 从源字符串的左边开始,截取指定数字个字符,返回
 99 select LEFT(1234567890, 5);
100 -- right 与left刚好相反
101 select right(1234567890, 6);
常用函数(重点)

 

/*SQL 高级(提升) */

SQL基础和高级总结
 1 -- case表达式    相当于选择结构表达式
 2 /*
 3     case
 4         when 条件1 then 值1
 5         when 条件2 then 值2
 6         ...
 7         else  值n
 8     end 
 9 */
10 
11 /*
12     case
13         when 条件then 值
14         when 条件then 值
15         ...
16         else  值n
17     
18     end 
19 */
20 
21 select * from Score where stuID=2;
22 
23 select *,
24     case
25         when testBase>=90 then A
26         when testBase>=80 then B
27         when testBase>=70 then C
28         else E
29     end as 等级
30 from Score where stuID=2;
31 用法1 //相当于switch case
32 
33 Select
34     tscoreId,
35     tsid,
36     tenglish,
37     评级=
38     Case tenglish
39         When 100 then ‘满分’
40     End
41 From TblScore
42 
43 /*纵表变横表*/
44 create table Score
45 (
46     学号 nvarchar(10),
47     课程 nvarchar(10),
48     成绩 int
49 )
50 
51 insert into Score values(0001,语文,87);
52 insert into Score values(0001,数学,79);
53 insert into Score values(0001,英语,95);
54 insert into Score values(0002,语文,69);
55 insert into Score values(0002,数学,84);
56 
57 select * from Score;
58 
59 select 学号,
60 sum(case when 课程 =数学 then 成绩 end )as 数学
61 ,
62 sum(case when 课程 =英语 then 成绩 else 0 end )as 英语 
63 ,
64 sum(case when 课程 =语文 then 成绩 end ) as 语文
65 from Score
66 group by 学号
67 
68 select * from Exe2.LoginTbl;
Case 表达式
SQL基础和高级总结
 1 /*
 2 -- 表连接
 3 -- 作用:将多张表变成一张表
 4 -- 用法与分类(案例)
 5 -- 分类:交叉连接、内连接、外连接
 6 */
 7 
 8 create table joinPerson
 9 (
10     pId int identity(1,1) not null
11     , pName nvarchar(10) not null
12     , titleId int null
13 );
14 alter table joinPerson
15 add constraint PK_joinPerson_pId primary key(pId);
16 
17 create table joinTitle
18 (
19     titleId int identity(1,1) not null
20     , titleName varchar(10) not null
21 );
22 alter table joinTitle
23 add constraint PK_joinTitle_titleId primary key(titleId);
24 
25 insert into joinTitle(titleName) values(Teacher),(Master);
26 insert into joinPerson(pName, titleId) values(牛亮亮, 1),(苏坤, 2),(杨中科, NULL);
27 
28 
29 select * from joinPerson;
30 select * from joinTitle;
SQL基础和高级总结

SQL基础和高级总结

SQL基础和高级总结
/*
    交叉连接
    将第一张表的每一行与第二张表匹配一次,得到的结果
    作为结果。
    语法
    from 表cross join 表
*/
select * from joinPerson cross join joinTitle;
-- 如果两章表中有重名的字段,就会出问题,就需要给表加别名

select t1.pName,t2.titleName
from 
joinPerson as t1
cross join
joinTitle as t2;
SQL基础和高级总结

SQL基础和高级总结

SQL基础和高级总结
 1 /*
 2     内连接:先交叉,在筛选,最后将重要的数据在家回来
 3     inner join
 4     语法
 5     from  表as 别名
 6     inner join
 7     表as 别名
 8     on 别名.列名=别名.列名(条件)
 9 */
10 select *  from
11 joinPerson as t1
12 inner join
13 joinTitle as t2
14 on t1.titleId=t2.titleId;
SQL基础和高级总结

SQL基础和高级总结

 

SQL基础和高级总结
 1 --左外链接
 2 -
 3 /*
 4     把左边中的全部记录都显示出来,对于那些在右表中能找到匹配的记录全部显示,不能匹配的显示为null 
 5 */
 6 
 7 select *
 8 from 
 9 joinPerson as t1
10 left join
11 joinTitle as t2
12 on t1.titleId=t2.titleId
SQL基础和高级总结

SQL基础和高级总结

 

SQL基础和高级总结
 1 --右外链接
 2 /*
 3     把右边中的全部记录都显示出来,对于那些在左表中能找到匹配的记录全部显示,不能匹配的显示为null 
 4 */
 5 
 6 insert into joinTitle(titleName) values(班主任);
 7 
 8 select
 9     *
10 from
11     joinPerson as t1
12     right join
13     joinTitle as t2
14     on t1.titleId = t2.titleId;
SQL基础和高级总结

SQL基础和高级总结

SQL基础和高级总结
 1 -- 视图
 2 /*
 3     视图-里面存储的是查询语句
 4     就是将查询的语句封装成一个对象,每次查询的时候直接操作这个对象即可
 5     本质是虚拟表,即一个查询过程
 6     语法:
 7     create view vw_视图名(一般名字以vw_开头)
 8     as
 9         select 语句
10 
11 */
12 create view vw_StuInfo
13 as
14     select
15         ROW_NUMBER() over(order by t1.stuId) as n
16         , t1.stuId
17         , t1.stuName
18         , case t1.stuSex when f then  else  end as stuSex
19         , datediff(year, t1.stuBirthdate, GETDATE()) as stuAge
20         , t1.stuEmail
21         , t1.stuAddress
22         , t1.stuPhone
23         , t2.className
24         , t3.testBase
25         , t3.testBeyond
26         , t3.testPro
27     from 
28         TestDataBase..Student as t1
29         inner join 
30         TestDataBase..Course as t2
31         on t1.classId = t2.classId
32         inner join
33         TestDataBase..Score as t3
34         on t1.stuId = t3.stuId
35 ;
36 go
37 /*视图是一个虚拟表,存储的只是查询语句,并不是数据。
38 如果把真实表的数据修改之后,视图查询的结果也会随之改变
39 用Vw_开头
40 优点1:降低数据库的复杂程度
41 优点2:防止未经许可的用户访问敏感数据(就是视图把表隐藏起来,让你看不到表)
42 */
43 -- 内联表值函数
44 -- 带有参数的视图
45 -- 作用: 将一个可变条件的查询封装成一个函数对象,执行结果是一张表
46 /*
47     create function fn_函数名
48     (@ 参数名as 类型,)
49     return table
50     as
51         return 查询语句;
52 
53 */
视图

 

SQL基础和高级总结
 1 -- 公用表表达式(CTE)
 2 -- 语法
 3 /*
 4     with 别名
 5     as
 6     (
 7         结果集
 8     )
 9     使用别名的一个查询;
10 */
11 with t
12 as
13 (
14     select
15         t1.stuId
16         , t1.stuName
17         , case t1.stuSex when f then  else  end as stuSex
18         , datediff(year, t1.stuBirthdate, GETDATE()) as stuAge
19         , t1.stuEmail
20         , t1.stuAddress
21         , t1.stuPhone
22         , t2.className
23         , t3.testBase
24         , t3.testBeyond
25         , t3.testPro
26     from 
27         TestDataBase..Student as t1
28         inner join 
29         TestDataBase..Course as t2
30         on t1.classId = t2.classId
31         inner join
32         TestDataBase..Score as t3
33         on t1.stuId = t3.stuId
34 )
35 select * from t where t.stuName = 濮阳语儿;
36 
37 -- t可以重用
38 -- 自交差
39 -- 生成一个数字表
40 
41 select num from (values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) as t(num);
42 
43 -- 自交差 10000
44 select 
45     t1.num * 10 + t2.num + 1
46 from
47     (select num from (values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) as t(num)) as t1
48     cross join
49     (select num from (values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) as t(num)) as t2
50 ;
51 -- 用公用表表达式
52 with t
53 as
54 (
55     select num from (values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) as tt(num)
56 )
57 select
58     t1.num * 1000 + t2.num * 100 + t3.num * 10 + t4.num + 1 as orderId
59 from 
60     t as t1
61     cross join
62     t as t2
63     cross join
64     t as t3
65     cross join
66     t as t4
67 order by
68     orderId;
公用表表达式(With)
SQL基础和高级总结
 1 -变量声明
 2 /*
 3     变量
 4     声明    赋值    使用
 5     declare  @变量名类型
 6     set    @变量名=值
 7     
 8 */
 9 
10 declare @num int;
11 set @num=10;
12 select @num;
13 
14 --局部变量
15 --系统变量@@开头
16 
17 --@@error 最近一次执行Sql 语句的错误码
18 select @@error;
19 
20 --@@identity 最近一次插入数据的自动增长编号
21 
22 select @@identity
23 
24 insert into Exe2.LoginTbl output inserted.id values(zdpdsy123,123);
25 
26 
27 
28 declare @sum int=0;
29 declare @i int =0;
30 
31 while  @i<=100
32 begin
33     set @sum+=@i;
34     set @i +=1;
35 end
36 ;
37 select @sum;
变量声明
SQL基础和高级总结
 1 -- 事务
 2 /*
 3     事务
 4 最基本的操作以事务为单位
 5 将一个已经完成的数据库操作行为规定为一个事务
 6 特点:
 7     原子性
 8         执行的结果是特征(要么完成,要么失败)
 9     持久性
10         执行的结果不可逆转
11     一致性
12         一旦完成事务,各个版本的结果都一样。
13     隔离性
14         事务与事务之间不冲突
15 严格定义:
16 
17 
18 */
19 
20 
21 --事务
22 create table bank
23 (
24     cId char(4) primary key,
25     balance money,            --余额
26 )
27 
28 alter table bank
29 add constraint CH_balance check(balance >=10)
30 
31 go
32 --delete from bank
33 insert into bank values(0001,1000)
34 insert into bank values(0002,10)
35 go
36 
37 select * from bank;
38 -- 0001 -> 0002 1000元
39 
40 -- 默认的事务方式——隐式事务
41 update bank set balance=balance - 1000 where cid=0001;
42 update bank set balance=balance + 1000 where cid=0002;
43 
44 /*
45     手动执行事务
46     开启事务->执行语句->判断满足与否->提交或回滚
47     语法
48     开启    begin transaction 
49     提交    commit
50     回滚    rollback
51 */
52 select @@TRANCOUNT;
53 
54 begin transaction 
55 
56 delete from TestDataBase..Score;
57 delete from TestDataBase..Student;
58 
59 
60 select * from HeiMa8.Exe3.vw_StuInfo;
61 
62 
63 rollback
64 
65 --
66 select * from bank;
67 
68 begin tran
69     declare @myError int;
70     update bank set balance=balance - 900 where cid=0001;
71     set @myError = @@ERROR;
72     update bank set balance=balance + 900 where cid=0002;
73     set @myError += @@ERROR;
74     if @myError > 0
75         rollback
76     else
77         commit
78 ;
79 
80 /*    try-catch
81     begin try
82     end try
83     begin catch
84     end catch
85 */
86 
87 begin tran
88     begin try
89         update bank set balance=balance - 1000 where cid=0001;
90         update bank set balance=balance + 1000 where cid=0002;
91         commit;
92     end try
93     begin catch
94         rollback;
95     end catch
96 ;
事务
SQL基础和高级总结
  1 -- 存储过程
  2 /*
  3     存储过程
  4     简单的看成数据库中的方法
  5     
  6     函数,视图,存储过程
  7     系统中常用的存储过程sp_  stored procedure
  8     执行语法
  9     exec 存储过程名字参数;
 10 */
 11 --修改数据库名字
 12 exec sp_renamedb archive1,heima
 13 
 14 /*
 15     存储过程的语法
 16     create proc[edure] usp_存储过程名
 17     参数名类型名[=初始值] output
 18     ,....
 19     as
 20     begin
 21         脚本(SQL语句)
 22     end
 23 */
 24 
 25 --无参数无返回值的存储过程
 26 create proc usp_PersonInfo
 27 as
 28     select * from joinPerson;
 29 go
 30 exec usp_PersonInfo;
 31 --有参数有默认值的存储过程
 32 --带参数的
 33 create proc usp_PersonSearch
 34 @PersonName nvarchar(20)
 35 as
 36     select * from joinPerson where pName=@PersonName;
 37 go
 38 exec usp_PersonSearch @PersonName=杨中科;
 39 
 40 --带默认值的
 41 create proc usp_FenYe
 42 @pageIndex int=1,
 43 @pageSize int =10
 44 as
 45 begin
 46     select 今天天气还行;
 47     select * from
 48     (
 49         select row_number() over(order by stuId) as num,* from
 50         Student
 51     )as t
 52     where t.num between (@pageIndex-1)*@pageSize+1 and @pageIndex * @pageSize;
 53 end
 54 go
 55 
 56 exec usp_FenYe 2,5;
 57 exec usp_FenYe @pageSize=11,@pageIndex=5; --推荐使用
 58 
 59 --有参数有返回值的存储过程
 60 create proc usp_Bank
 61 @from char(4),
 62 @to char(4),
 63 @money money,
 64 @isSuccess int output
 65 as
 66 begin
 67     begin tran        
 68         begin try
 69             update bank set balance=balance-@money where cid=@from;
 70             update bank set balance=balance+@money where cid=@to;
 71             commit;
 72             set @isSuccess = 1;
 73         end try
 74         begin catch
 75             rollback;
 76             set @isSuccess = 0;
 77         end catch    
 78 end
 79 go
 80 
 81 declare @isSuccess1 int;
 82 
 83 -- exec Exe3.usp_ZhuanZhangExt ‘0001‘, ‘0002‘, 500, @isSuccess output;
 84 exec usp_Bank
 85     @from = 0001, 
 86     @to = 0002, 
 87     @money = 500, 
 88     @isSuccess = @isSuccess1 output;
 89 select @isSuccess1;
 90 select * from bank;
 91 
 92 --创建一个登陆的存储过程
 93 /*
 94 create proc usp_Login
 95 @uid varchar(20),
 96 @pwd varchar(20),
 97 @isOK int output
 98 as
 99         select @isOK=count(*) from Exe2.LoginTbl
100         where uid=@uid and pwd=@pwd;    
101 go
102 select * from Exe2.LoginTbl;
103 
104 declare @OK int;
105 exec usp_Login ‘zdp‘,‘123‘,@isOK=@OK output;
106 select @OK;
107 */
108 
109 
110 create proc usp_Login
111 @uid varchar(20),
112 @pwd varchar(20),
113 @isOK int output
114 as
115     select @isOK=count(*) from Exe2.LoginTbl 
116     where uid=@uid and pwd=@pwd;
117 go
118 
119 select * from Exe2.LoginTbl;
120 
121 declare @isLogin int;
122 exec usp_Login zdp,zdp140,@isOK=@isLogin output;
123 select @isLogin;
存储过程

 

以上是个人的SQL学习总结,有错的地方还望众大神海涵啊

SQL基础和高级总结.zip

SQL基础和高级总结

上一篇:Oracle语句集锦


下一篇:2021-04-02-CKA-练习题