时间: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 on
insert........
--最后记得把选项关掉
--听过一条语句插入多条数据
insert into TblClass(tclassName,tclassDesc)
select ‘...‘,‘...‘ union
select ‘...‘,‘...‘ union
select ‘...‘,‘...‘ union
select ‘...‘,‘...‘ --最后一项不用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 MyOrders
group by 商品名称
union all
select ‘销售总价:‘,sum(销售数量*销售价格) from MyOrders
连接分为内连接和外连接 内连接: 1,普通内连接 inner join.. on.. 仅筛选两个表都有匹配的数据,例如:
select*from TblClass
jion tblstudent on TblClass.tClassId=TblStudent.tSClassId
//查询出两个表符合TblClass.tClassId=TblStudent.tSClassId的数据行,并显示其所有数据
//这里先把两个表的数据拿出,把TblClass.tClassId,与TblStudent.tSClassId相同的那 行构成新的行, //进一步构成新的表,如果TblClass.tClassId有个值为3,而TblStudent.tSClassId没有,那么新的表不会有这行数据,另外这个表是临时存在于内存
select*from TblClass
jion 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行的临时表
--再在这个表中筛选,而这个表叫做笛卡尔表
where
emp.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 groups
insert 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 Temp
select deparment.gname as ‘部门名称‘,company.gname as ‘所属部门‘
from groups as deparment
inner join groups as company
on 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 B
left join dbo.ProjectInfo as P on B.ProjectId=P.Id
left join dbo.Branch as Br On P.BranchId=BR.Id
left 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)
--例子,统计学生表中每个班的男生人数,且显示id
select
班级id=tsclassId
男同学人数=count(*)
from TblStudent
where 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的班级
select
tsclassId as 班级编号
count(*) as 人数
from TbStudent
--如果这里有where,where这不能用聚合函数
group by tsclassId
having count(*)>10//having的内容只能是select选择的内容
返回TblStudent中根据tsclassid在TblClass中找到的班级名称为高一一班或高二二班的整行数据
select * from TblStudent as ts
where exists//如果查到数据返回true
(
select * from TblClass as tc where
tc.tclassId=ts.tsclassId and
(tc.tclassname=‘高一一班‘or tc.tclassname=‘高二二班‘)
)
select top 5 * from Customers where CustomerId not in