时间:2021-07-01 10:21:17 帮助过:4人阅读
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
连接分为内连接和外连接 内连接: 1,普通内连接 inner join.. on.. 仅筛选两个表都有匹配的数据,例如:
select*from TblClassjion tblstudent on TblClass.tClassId=TblStudent.tSClassId//查询出两个表符合TblClass.tClassId=TblStudent.tSClassId的数据行,并显示其所有数据
//这里先把两个表的数据拿出,把TblClass.tClassId,与TblStudent.tSClassId相同的那 行构成新的行, //进一步构成新的表,如果TblClass.tClassId有个值为3,而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
外连接: 1,左外连接 语法:左表 left join右表on... 左表的信息全部输出,右表的信息在左表有匹配才输出 未匹配的用null填充
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]-- ^ 非
--对得到的组进一步筛选(having)
--例子,统计学生表中每个班的男生人数,且显示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选择的内容
返回TblStudent中根据tsclassid在TblClass中找到的班级名称为高一一班或高二二班的整行数据
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