标签:
--创建数据库create database School;--删除数据库drop database School;--创建数据库的时候指定一些选项create database School;on primary--配置主数据文件(name=‘School‘,--逻辑名称,数据库内部用的名字filename=‘‘,--保存路径size=5MB,--设置初始化大小filegrowth=10MB或10%,--设置增长速度maxsize=100MB--设置最大大小)log on--配置主日志文件(name=‘‘,--设置逻辑名称filename=‘‘,--设置路径size=3MB,filegrowth=3%,maxsize=20MB)
//每个项设置后面都加逗号 最后一项不加--切换数据库use School;--在School数据库中创建一个学生表create table TblStudent(--表中的定义在这对的小括号中--开始创建列--列名 数据类型 自动编号(从几开始,增长步长) 是否为空(不写默认允许,或者写null 不允许空写 not null)--tsid int identity(1,1) not null--设置名为tsid 类型为int 从1开始增长,每次增长1的主键列tsid int identity(1,1) primary key,)
--查询表select * from TblClass--insert向表插入数据(一次只能插一条)insert into TblClass(tclassName,tclassDesc) values(‘tclassName的值‘,‘tclassDesc的值‘)--TblClass后面的括号设置在哪些列插入数据,value后面的括号要与前面的一一对应.如果要给除自动编号的所有列插入数据,TblClass后面的括号可省--插入同时返回指定列的数据:在value前加上output inserted.列名
--向自动编号列插入数据--先把一个选项打开 倒数第二个是列名set IDENTITY_INSERT tblclass oninsert........--最后记得把选项关掉--听过一条语句插入多条数据insert into TblClass(tclassName,tclassDesc)select ‘...‘,‘...‘ unionselect ‘...‘,‘...‘ unionselect ‘...‘,‘...‘ unionselect ‘...‘,‘...‘ --最后一项不用union--把一个表的书数据插入另一个表insert into 被插表(列名,列名)select 列名,列名 from 数据来源表--插入汉字记得在字符串前加入N
update 表名 set 列名=值,列名2=值2 where 条件 and..or...--如果没有条件,所有数据都会更新
--删除delete from 表名 where 条件--删除整表数!据!与drop不同,两种--1,delete from 表名--速度慢--自动编号依然保留当前已经增长的位置delete from 表名--2,truncate table 表名--速度快--自动编号重置truncate table 表名
--修该列--删除指定列alter table 表名 drop column 列名--增加指定列alter table 表名 add 列名(这里跟创建表一样)--修改指定列alter table 表名 alter column 列名--增加约束--给指定列添加主键约束alter table 表名 add constraint 约束名 primary key(列名)--给指定列添加非空约束alter table 表名 alter column 列名 数据类型 not null--给指定列添加唯一约束alter table 表名 add constrainy UQ开头的约束名 unique(列名)--给指定列添加默认约束alter table 表名 add constraint 约束名 default(值) for 列名--给指定列添加检查约束alter table 表名 add constraint 约束名 check(表达式)--增加外键约束 alter table 表名 add constraint FK_约束名 foreign key(外键列名)references 主键表名(列名)--删除多个约束alter table 表名 drop constraint 约束名,...,...--创建多个约束alter table 表名 add constraint 约束名 unique(列名), constraint 约束名 check(表达式), constraint 约束名 foreign key(要引用列) references 被引用表(列)on delete cascade on update cascade --设置级联删除和更新
--数据检索,查询指定列的数据,不加where返回所有select 列名,列名,... from 表名 where 条件--用select显示东西,列名可省略,列名可以不‘‘起来,除非名字有特殊符号select 值 (空格或者as) 列名--top获得前几条数据,选到的都是向上取整select top (数字或数字 percent) * from 表名 order by 列名 (asc//升序,默认值 desc//降序)--Distinct去除查询出的重复数据,只要有一点不同(显示出来的列的内容不同)不算重复,比如自动增长的那列select distinct 要显示的列 from 表名 ...
合并行叫做"联合"联合必须保证每行的数据数目与第一行一致,数据类型兼容列名为第一行的列名union all 在联合时不会去除重复数据,也不自动排序不能分别排序常用:底部总和例:select商品名称,销售总价格=(sum(销售数量*销售价格))from MyOrdersgroup by 商品名称union allselect ‘销售总价:‘,sum(销售数量*销售价格) from MyOrders
select*from TblClassjion tblstudent on TblClass.tClassId=TblStudent.tSClassId//查询出两个表符合TblClass.tClassId=TblStudent.tSClassId的数据行,并显示其所有数据
select*from TblClassjion tblstudent on TblClass.tClassId=TblStudent.tSClassId
select * from TestJoin1Emp emp inner join TestJoin2Dept dept on emp.EmpDeptid=dept.DeptId- --两者等效
select * from TestJoin1Emp emp , TestJoin2Dept dept--假设emp与dept,行数分别是3,5.select * from 这两个表,实际会形成3*5=15行的临时表--再在这个表中筛选,而这个表叫做笛卡尔表whereemp.EmpDeptid=dept.DeptId
create table groups(gid int identity(1,1) primary key not null,gname nvarchar(10),gparent int)select * from groupsinsert into groups values(‘总部‘,0)insert into groups values(‘北京分公司‘,1)insert into groups values(‘上海分公司‘,1)insert into groups values(‘.net部门‘,2)insert into groups values(‘.net部门‘,3)--查询部门对应的上级部门use Tempselect deparment.gname as ‘部门名称‘,company.gname as ‘所属部门‘from groups as deparmentinner join groups as companyon deparment.gparent=company.gid
------多表查询案例分析:-- dbo.Branch:结构表: 银行,开发商,政府房管局--dbo.BuildingInfo: 建筑信息表。 天堂花园 1号楼。--dbo.ProjectInfo:项目信息表。天堂花园1期。--dbo.UserInfo:用户信息表---查询建筑信息表,顺便:建筑信息所属的项目名,项目所属的机构名字,项目创建人的名字select B.*,P.ProjectName,BR.BranchName,u.UName as SubBy from dbo.BuildingInfo as Bleft join dbo.ProjectInfo as P on B.ProjectId=P.Idleft join dbo.Branch as Br On P.BranchId=BR.Idleft join dbo.UserInfo as U On P.SubBy=U.Id
--模糊查询,通配符,当使用通配符必须使用like,可以在like前面加no 表示除了匹配数据的数据--%,表示匹配任意多个字符--例子,查询以张开头的字符串select * from 表名 where 列名 like N‘张%‘--查询包含%的字符串select * from 表名 where 列名 like ‘%[%]%‘-- _ ,表示一个任意字符-- [ ],表示匹配一个字符,这个字符是[]访问内的通常是[0-9][a-z]-- ^ 非
--例子,统计学生表中每个班的男生人数,且显示idselect班级id=tsclassId男同学人数=count(*)from TblStudentwhere tsgender=‘男‘group by (tsclassId,这就是group by包含的列,可以逗号添加多个列,意味着分组后在分组)- --有时候要把一些信息放到group by后才能放到select,这时不一定担心,在group by 语句写过多会造成过多的分组,
- --例子如下
- --列1 列2 列 3
- --A aa 少壮不努力
- --B bb 老大LOL
- --如果group 列1,列2 因为当列1为A,列2必须aa,列1B,列2必须bb时最终只会会分成两个组,所以有时候不用担心分组过多
--例子:按笔记编号分组,筛选出班级人数大于10的班级selecttsclassId as 班级编号count(*) as 人数from TbStudent--如果这里有where,where这不能用聚合函数group by tsclassIdhaving count(*)>10//having的内容只能是select选择的内容
select * from TblStudent as tswhere exists//如果查到数据返回true(select * from TblClass as tc wheretc.tclassId=ts.tsclassId and(tc.tclassname=‘高一一班‘or tc.tclassname=‘高二二班‘))
select top 5 * from Customers where CustomerId not in(select top (n-1)*5 CutomerID from Customers order by CustomerId asc)order by CustomerId asc
--每页7条,看第4页。select * from(selectrow_number() over(order by CustomerId asc) as Rn ,*--over()子句把数据按CustomerId排序--通过row_number()函数吧查到的数据添加一条编号列,列名为Rn--再通过编号得到想要的数据from Customers) as Tbl where Tbl.Rn between (4-1)*7+1 and 4*7
select b.studentid,b.score,b.courseName ,- (select count(*) from StudentScore where courseName=b.courseName group by courseName) as ‘参加该科目考试的额人数为‘
from StudentScore as border by b.studentid,courseName- --等效于
select studentid,score,courseName,count(*) over (partition by courseName) as‘参加该科目考试的额人数为‘from StudentScoreorder by studentid,courseName
create view v_Areaasselect * from 表
alter view v_Areaasselect * from 表
drop view v_Area
select * fromv_Area
select * from v_Areaorder by ....
select a1.AreaId,a1.AreaName,a2.AreaNamefrom TblArea as a1 inner join TblArea as a2 on a2.AreaId=a1.AreaPId--这个select用了两个AreaName,这样不能确定视图的列名,会报错
update bank set balance=balance-1000 where cid=‘0001‘update bank set balance=balance + 1000 where cid=‘0002‘--模拟银行转账,如果第一条出错,第二条还是会执行--所以这里需要用到事务
begin transactiondeclare @sumErrors int=0--执行操作update bank set balance=balance-1190 where cid=‘0001‘--立刻验证一下这句话是否执行成功了。。set @sumErrors=@sumErrors+@@errorupdate bank set balance=balance+1190 where cid=‘0002‘set @sumErrors=@sumErrors+@@error--验证是否执行成功if @sumErrors=0begin--表示没有出错commit transaction --将事务提交endelsebeginrollback --失败则回滚end
create procedure usp_Add1@num1 int,@num2 intasbeginprint @num1+@num2end--带默认值的存储过程create procedure usp_Add2@num1 int=3,@num2 intasbeginprint @num1+@num2end--带输出参数的存储过程create procedure usp_Add3@num1 int,@num2 int,@num3 intasbegin@num3=@num1+@num2end
exec usp_Add1 5,4 --输出9- exec sp_helptext ‘sp_databases‘ --看指定存储过程源码的
- exec usp_Add2 @num2=8 --输出11,usp_Add2如果给@num2赋值必须写@num2=...,否则会认为给@num1赋值
- delcare @answer int--跟c#里面out参数差不多,声明与调用都要写output
- exec usp_Add3 6,6,@answer ouput
alter procedure usp_fenye@pageSize int,--每页的记录条数@pageIndex int,--用户当前要查看第几页@pageCount int output --输出参数,返回总共有几页asbeginselect *from(select *,Rn=row_number()over(order by tSid)from TblStudent) as stuwhere Rn between (@pageIndex-1)*@pageSize+1 and @pageIndex* @pageSize--设置输出参数的值declare @datacount int=(select count(*) from TblStudent)set @pageCount=ceiling(@datacount/(@pageSize*1.0))--向较大的数取整end
--聚集索引创建create clustered index 名字 on 表(列)--非聚集索引创建create index 名字 on 表(列)--删除索引(略有不同)drop index 表名.索引名
--create trigger 触发器名 on 表名create trigger tri_delete_TblPerson on TblPerson--for/after/instead of(for与after都表示after触发器) delete/insert/update,可以写多个触发器类型用逗号隔开instead of delete,insertasbegin--执行内容,会用到selected表或inserted表end
--1.定义一个游标declare cur_Area cursor fast_forward for select top 100 * from Area--2.打开游标open cur_Area--3.查询使用游标fetch next from cur_Areawhile @@fetch_status=0beginfetch next from cur_Areaend--4.关闭游标close cur_Area--5。释放资源deallocate cur_Area
DROP TABLE 语句显式除去临时表,否则临时表将在退出其作用域时由系统自动除去:
(1)、当存储过程完成时,将自动除去在存储过程中创建的本地临时表。由创建表的存储过程执行的所有嵌套存储过程都可以引用此表。但调用创建此表的存储过程的进程无法引用此表;
(2)、所有其它本地临时表在当前会话结束时自动除去;
(3)、全局临时表在创建此表的会话结束且其它任务停止对其引用时自动除去。任务与表之间的关联只在单个Transact-SQL语句的生存周期内保持。换言之,当创建全局临时表的会话结束时,最后一条引用此表的Transact-SQL语句完成后,将自动除去此表。
3、示例代码
(1)创建
标签:
原文地址:http://www.cnblogs.com/Recoding/p/4590271.html