sqlServer 基础知识

sqlServer   基础知识

大纲

创建数据库 1

创建表 2

备份表 3

删除表 4

修改表 5

查询出重复的数据 6

增删改查 7

添加约束 8

分页存储过程 9

排序 10

类型转换 11

表连接 12

事务 13

获取数据库信息 14

sql函数 15

 

 

  1 use Books

  2 --------------------------------------------------------------------------------------------------------------------创建数据库 1

  3 create database BookShop

  4 on

  5 (

  6 name='BookShop.mdf',

  7 filename='E:\Data\BookShop.mdf',

  8 size=10mb,

  9 maxsize=1024MB,

 10 filegrowth =10%

 11 )

 12 log on

 13 (

 14 name='BookShop_log.ldf',

 15 filename='E:\Data\BookShop_log.ldf'

 16 )

 17 use bookshop

 18 go

 19 ------------------------------------------------------------------------------------------------------------------------创建表 2

 20 ----------一一个主键

 21 create table Users 

 22 (

 23 Id int identity(1,1) primary key(Id),

 24 UName nvarchar(50) not null,

 25 UPwd varchar(50) not null,

 26 UDelFlag int not null,

 27 

 28 )

 29 go

 30 

 31 --------------组合主键

 32 create table Users1 

 33 (

 34 UName nvarchar(50) not null,

 35 UName1 nvarchar(50) not null,

 36 primary key(UName,UName1),

 37 UPwd varchar(50) not null,

 38 UDelFlag int not null,

 39 

 40 )

 41 go

 42 ------------------------------------------------------------------------------------------------------------------------备份表 3

 43 --------新表不存在,在复制的时候,自动创建新表

 44 select * into newStudent from student;

 45 --------新表存在,在复制之前,表必须建好

 46 insert into newStudent select * from student;

 47 --------复制表结构

 48 select top 0,* into newstudnet  form student; --效率比下面效率高,优先使用

 49 select * into newstudnet  form student where 1<>1;-效率低

 50 ------------------------------------------------------------------------------------------------------------------------删除表 4

 51 

 52 --删除表中的所有数据,表还在,主键自增不变

 53 delete from Users;

 54 --删除表,表不存在

 55 drop table Users;

 56 --删除表中所有数据,主键自增重置默认值,不触发delete触发器,速度快

 57 truncate table Users;

 58 ------------------------------------------------------------------------------------------------------------------------修改表 5

 59 -------------------------手动(增删)一列,及修改数据类型 

 60 --增加一列

 61 alter table Users add  URegistTime datetime;

 62 --删除一列

 63 alter table Users drop column URegistTme;

 64 --修改某列的数据类型

 65 alter table Users alter column URegistTime datetime;

 66 

 67 --------------------------------------------------------------------------------------------------------------查询出重复的数据 6

 68 select Name from Users group by Name having count(Name) > 1;

 69 --------------------------------------------删除重复数据,保留一条,某个字段数据重复

 70 --删除主键小的,保留大的

 71 delete from Grade 

 72 where grade in

 73 (select Grade, from Grade group by Grade having count(*)>1) and id

 74 not in (select min(Id) from Grade group by Grade having count(Grade)>1)

 75 --备份表的方式,删除重复数据,保留重复数据的一条,这是指的记录重复,而不是仅仅某个字段重复

 76 select distinct * into Users1 from Users

 77 drop table Users

 78 ----------------------------------------------------------------------------------------------------------------------增删改查 7

 79 --插入

 80 insert into Users( UName, UPwd,UDelFlag) values( '李四','lisi',0)

 81 ----------一次插入多条数据

 82 insert into Score( Name, Score)

 83 select '6',110 union all

 84 select '7',120 Union all

 85 select'8',130 Union all

 86 select '9',140Union all 

 87 select '10',150

 88 --删除

 89 delete from  Users where Id=2

 90 --修改

 91 update Users set UName='张三' where Id=1

 92 -----------------------------------------------------------查询

 93 select * from users--简单查询

 94 ----------------------------------------纵表转横表查询

 95 select Name

 96 ,sum(case Course when '语文' then Score else 0 end) as 语文

 97 ,sum(case Course when '数学' then Score else 0 end) as 数学

 98 ,sum(case Course when '英语' then Score else 0 end) as 英语 

 99 from Test group by Name

100 

101 ----------------------------------------横表转纵表查询

102 select Name as 姓名,'语文' as 科目,Chineses as 分数 from Test1 union all

103 select Name as 姓名,'数学' as 科目,Math as 分数 from Test1 union all 

104 select Name as 姓名,'英语' as 科目,English as 分数 from Test1

105 go

106 ---------------------分页查询

107 select top 2 * from Users  where Id not in (select top (2 * 3) Id from Users order by Id) order by Id 

108 

109 go

110 

111 ---------------------------------子查询

112 

113 --独立子查询,切记:子查询的结果只能是一个值

114 --一个表

115 select * from Score where Name=(select Name from Score where Score=80 )

116 select * from Score where Name in(select Name from Score where Score=80 )

117 select * from Score where Name not in(select Name from Score where Score=80 )

118 --两个表

119 select * from Score where Name in (select Name from Grade where name='2' or Name='3')

120 select * from Score where Name not in (select Name from Grade where name='2' or Name='3')

121 --相关子查询

122 select * from Score as s   where  exists(select Name from Grade as g where s.Name=g.Name and  g.Name='2')

123 select * from Score as s   where not  exists(select Name from Grade as g where s.Name=g.Name and  g.Name='2')

124 

125 --------------------带条件查询

126 --between and   已优化,效率高,优先使用; id>2 and id<4

127 select * from UserInfo where Id between 2 and 4

128 --in ;id=1 or id=2 or id=3

129 select * from UserInfo where Id in(1,2,3)

130 --------------------模糊查询(主要针对字符串操作)

131 --通配符:_    、   %   、  []   、  ^

132 --like  , not like

133 --只能匹配一个任意字符

134 select * from UserInfo where UName like '张_王';

135 --匹配单个字符王字的,只有一个字符

136 select * from UserInfo where UName like '';

137 --匹配后面以王字结尾的

138 select * from UserInfo where UName like '%王';

139 --匹配前面以王字开头的

140 select * from UserInfo where UName like '王%';

141 --匹配包含王字的

142 select * from UserInfo where UName like '%王%';

143 --只能匹配一个字符 ,必须是:a-z,0-9

144 select * from UserInfo where UName like '[王]';

145 --不像

146 select * from UserInfo where UName like  '[^张]';

147 

148 

149 ----------------------------------------------------------------------------------------------------------------------添加约束 8

150 

151 --主键约束(一个主键)

152 alter table Users add  constraint PK_Users primary key(Id);

153 

154 --主键约束(组合主键)

155 alter table Users add  constraint PK_Users primary key(UName,UName1);

156 

157 --外键约束

158 alter table Users add  constraint FK_Users foreign key(UsersInfoId) references UsersInfo(UsersInfoId);

159 --非空约束

160 alter table Users  alter column UPwd varchar(50) not null ;

161 --唯一约束

162 alter table Users add  constraint UQ_Users unique(UName);

163 --默认约束

164  alter table Users add  constraint DK_Users default(getdate()) for UTime;--时间默认值

165  alter table Users add  constraint DK_Users default(0) for age;--年龄默认值

166 

167 ------------------------------------------------------------------------------------------------------------------分页存储过程 9

168  create procedure usp_GetPage

169 --当前页码

170 @pageIndex int,

171 --每页条数

172 @pageSize int,

173 --总页码数

174 @pageCount int output

175 as

176 begin

177 set @pageCount=(ceiling((select count(*) from Users)*1.0/@pageSize));

178 select * from

179 (select ROW_NUMBER() over(order by Id asc) as num,* from Users)as u

180 where u.num

181 between

182 @pageSize*(@pageIndex-1)+1

183 and

184 @pageSize*@pageIndex

185 end

186 declare @count int 

187 exec usp_GetPage 11,10,@count output

188 

189 -------------------------------------------------------------------------------------------------------------------------排序 10

190 --order by 子句位于SELECT语句的末尾,带where的放在where的后面,默认是asc排序,  

191 --可以根据多个列排序,前提是,第一个列都一样时,则会以第二个列排序

192 select * from UserInfo  order by Age desc

193 --带where

194 select * from UserInfo where age<20  order by Age desc

195 --没有出现在GROUP BY子句中的列是不能放到SELECT语句后的列名列表中的 (聚合函数中除外)

196 select UName from UserInfo group by UName

197 --having 相当于where 对分组后,但赛选的列必须是分组的列,才能进行赛选,必须放在 group by  后面

198 select UName from UserInfo group by UName having UName='张三'

199 

200 ---------------------------------------------------------------------------------------------------------------------类型转换 11

201 --cast 类型转换

202 select cast('张三' as varchar);

203 --转换成int,然后可以进行运算

204 select cast(right('5',3) as int);

205 select cast(right('5',3) as int)+1;

206 select cast(right('5',3) as int)-1;

207 select cast(right('5',3) as int)*5;

208 select cast(right('5',3) as int)/5;

209 --convert 将日期转换成指定格式的字符串

210 select  convert(varchar(50),getdate(),120);

211 

212 

213 -----------------------------------------------------------------------------------------------------------------------表连接 12

214 --内联

215 select Grade,Score.Score from Grade inner join  Score on  Score.Name=Grade.Name

216 --左外联

217 select Grade,Score.Score from Grade left join  Score on  Grade.Name=Score.Name

218 --右外联

219 select Grade,Score.Score from Score right join  Grade on  Score.Name=Grade.Name

220 

221 -------------------------------------------------------------------------------------------------------------------------事务 13

222 declare @sumError int=0 --错误

223 --打开事务

224 begin transaction

225 update score set score=score+1 where id=1

226 set @sumError=@sumError+@@ERROR

227 update score set score=score-1 where id=10

228 set @sumError=@sumError+@@ERROR

229 if(@sumError>0)

230 begin

231 --事务回滚

232 rollback transaction

233 end

234 --事务提交

235 commit transaction

236 

237 ---------------------------------------------------------------------------------------------------------------获取数据库信息 14

238 

239 

240 

241 -------------------------------------------------------------通过视图获取数据库信息,表信息,字段信息 

242 --字段类型:xtype=编号,如忘记可以通过   select*from syscolumns或者select * from systypes   查看

243  --查看数据库中的所有类型对应的信息

244  select * from systypes 

245 

246 34 image

247 35 text

248 36 uniqueidentifier

249 48 tinyint

250 52 smallint

251 56 int

252 58 smalldatetime

253 59 real

254 60 money

255 61 datetime

256 62 float

257 98 sql_variant

258 99 ntext

259 104 bit

260 106 decimal

261 108 numeric

262 122 smallmoney

263 127 bigint

264 165 varbinary

265 167 varchar

266 173 binary

267 175 char

268 189 timestamp

269 231 sysname

270 231 nvarchar

271 239 nchar

272 -------------------------------------------

273 

274 --查询服务器

275 

276 --远程连接数据库

277 select * from opendatasource('SQLOLEDB','Data Source=远程ip;User

278 ID=sa;Password=密码').库名.dbo.表名

279 

280 --查询所有的用户

281 

282 islogin='1'表示帐户

283 islogin='0'表示角色

284 status='2'表示用户帐户

285 status='0'表示糸统帐户

286 

287 select * from sys.sysusers

288 

289  --查询出所有的数据库,status

290   select * from master..sysdatabases 

291   --查询出所有的表,根据需求筛选;xtyep='u'

292   select *from sysobjects 

293   --查询出去表中所有字段,根据需求筛选:id

294   select*from syscolumns

295   --指定的表名中的所有字段

296   select * from syscolumns where id = object_id('grade') 

297   --主键

298   select * from syscolumns where id = object_id('grade') and colstat = 1

299 

300 -------------------------------------------------通过存储过程获取数据库信息,表信息,字段信息

301 --获取所有数据库名

302 exec sp_databases

303 --获取所有的表名,当前选中的表名

304 exec sp_tables 

305 --获取表中所有字段名

306 exec sp_columns books

307 

308 

309 -------------------------------------------------

310 

311 ----------------------------------------------------------------------------------------------------------------------sql函数 15

312 -----------------------------------------------------聚合函数

313 --总数

314 select count(Age) as 总数 from UserInfo

315 --

316 select= sum(Age) from UserInfo

317 --最大

318 select max(Age)as 最大值 from UserInfo

319 --最小

320 select min(Age) as 最小值 from UserInfo

321 --平均值

322 select avg(Age) as 平均值 from UserInfo

323 

324 -------------------------------------------------------日期函数

325 --当前时间

326 select getdate();

327 --指定部分

328 select datepart(month,getdate());

329 --返回指定部分的===上面的

330 year(),month(),day(),hour(),minute(),second();

331 --为指定的时间进行加值,减值操作

332 select dateadd(MONTH,3,getdate());

333 --时间差

334 select datediff(MONTH,getdate(),getdate());

335 

336 ----------------------------------------------------字符串函数

337 --计算字符串字符个数

338 select len('张立平');

339 --计算字符串所占字节数,一个汉字两个字节

340 select datalength('张三王五');--不是字符串函数

341 --转大写

342 select upper('abc');

343 --转小写

344 select lower('ABC');

345 --去掉左边的空格

346 select ltrim('    abcaba');

347 --去掉右边的空格

348 select rtrim('abcaba    ');

349 --截取左边的一个字符串

350 select left('abc',1)

351 --截取右边的一个字符串

352 select right('abc',1);

353 --截取字符串的从指定位置开始,截取指定的字符个数,而不是字节个数

354 select substring('张三李四王无为',1,3);
View Code

 

整理未完成,那里有不正确的,或者有更好的方法,请评论,内容仅供初学者参考。谢谢!

 

你可能感兴趣的:(sqlserver)