sql server 笔记
sql语句 不区分大小写!
在 sql 语句里面 所有的字符串 都用单引号 ''
create database Library
新建一个名字为 Library 的表
建一个表 名字叫 Users 的表
(UserId int primary key, 是设置主键的意思)
create table Users
(
UserId int primary key,
UserName nvarchar(20) not null,
UserPwd nvarchar(20) not null,
)
注释 两个横线 --
select * from UserInfor
查询 名字 为UserInfor 我表里面的所有内容
* 表示所有字段
select UserId,UserName,Pwd from UserInfor
只查询部分的内容 比如 id name 密码
where 查询 查询 name 为 admin pwd 为123456
select * from UserInfor where UserName='admin' and Pwd='123456'
select * from UserInfor where Sex='男'
查询 UserInfor 表中 所有 Sex 为男的
select * from UserInfor where Sex='男' and Origin='江西'
查询 UserInfor 表中 所有 Sex 为男的 Origin 为江西的
select * from UserInfor where Sex='男' and Origin='江西' and Age>18
查询 UserInfor 表中 所有 Sex 为男的 Origin 为江西的 年龄大于18的
or 是或者 或 的意思
select * from UserInfor where Sex='男' and (Origin='江西' or Origin='湖北' ) and Age>18
湖北 或 江西
select * from UserInfor where (age<30 or age>25)
select * from UserInfor where age<=30 and age>=25
select * from UserInfor where Age between 25 and 30
查询年龄 小于 25大于30的
select * from UserInfor where Age between 25 and 30
是查区间
查记录数
select count(*) from UserInfor where Origin='江西'
查询江西的 个数 个数 返回个数
select count(*) as UserCount from UserInfor where Origin!='江西'
不为江西 的个数
select count(*) as UserCount from UserInfor where Origin='江西'
返回的那个个数 多了个 列名 UserCount
select * from UserInfor order by Age
select * from UserInfor order by Age asc
排序查询 通过 Age 升序 查询
默认是升序 后面的 asc 可以省略
select * from UserInfor order by Age desc
按照 Age 降序查询 desc 表示降序
select * from UserInfor where UserId=5 or UserId=8 or UserId=10
select * from UserInfor where UserId in(5,8,10)
查询 UserId 为 5 8 10 的
select * from UserInfor where UserId not in(5,8,10)
除了 UserId 为 8 5 10 的
select * from UserInfor where UserName like '谢%'
查询查 UserName 为 谢 开头的
select * from UserInfor where UserName like '%帅'
查询 UserName 为 帅 结尾的
select * from UserInfor where UserName like '%帅%'
查询 UserName 包含 帅 的
select min(Age) as MinAge from UserInfor
查询 Age 最小的 列名 为 MinAge
select max(Age) as MaxAge from UserInfor
查询 Age 最大的 列名 为 MaxAge
select avg(Age) as AvgAge from UserInfor
求平均数 列名 为 AvgAge
select sum(Age) as SumAge from UserInfor
求和 列名 为 SumAge
select * from UserInfor where Age>
(
select avg(Age) from UserInfor
)
查询大于 平均值的
select top 3 * from UserInfor order by Age desc
查询 年龄最高的三个
select count(*) as oruginCount,Origin from UserINfor group by Origin
分组查询
select count(*) as oruginCount,Origin from UserINfor group by Origin having count(*)>2
查询结果大于二的
select distinct UserName from UserInfor
查询不重复的 distinct 表示不重复
left join
select UI.UserId,UI.UserName,UI.Sex,SC.MathScore,SC.ChinaScore
from UserInfor UI left join Score SC on
UI.UserId=SC.UserId
联合查询 UI.UserId=SC.UserId 关联
right join
select UI.UserId,UI.UserName,UI.Sex,SC.MathScore,SC.ChinaScore
from UserInfor UI right join Score SC on
UI.UserId=SC.UserId
inner join
select UI.UserId,UI.UserName,UI.Sex,SC.MathScore,SC.ChinaScore
from UserInfor UI inner join Score SC on
UI.UserId=SC.UserId
select UISC.* ,PT.Father,PT.Mum from
(
select UI.UserId,UI.UserName,UI.Sex,SC.MathScore,SC.ChinaScore
from UserInfor UI inner join Score SC on
UI.UserId=SC.UserId
) UISC inner join Parent PT on
UISC.UserId=PT.UserId
三个表 联合查询 嵌套式
联合查询 很重要 一定要过
select row_number() over(order by UserId)as rownumber,* from UserInfor
分页查询
select top 5* from
(
select row_number() over(order by UserId)as rownumber,* from UserInfor
) A where rownumber>5
行号大于5
(以后用的非常多)
select UserId Age,
case
when Age<20 then '大一'
when Age>20 and Age<=25 then '大二'
when Age>25 and Age<=30 then '大三'
else '大四'
end as geade from UserInfor
对某个字段进行判断
获取时间
select year(getdate())
获取当前系统年
select month(getdate())
获取当前系统月
select day(getdate())
获取当前系统日
select dateadd(yy,100,getdate())
当前系统时间再加100年 yy是年
select dateadd(mm,100,getdate())
当前系统时间再加 100个月 mm是月
select dateadd(dd,100,getdate())
当前系统时间再加 100个天 dd是天
可以用在VIP到期时间 添加临时VIP
间隔时间
select datediff(yy,getdate(),'2108/12/31')
当前时间 距离 2108/12/31 多少年
select datediff(mm,getdate(),'2108/12/31')
select datediff(dd,getdate(),'2108/12/31')
间隔多少月 间隔多少天
下面是增加 增
查询到这了告一段落
--添加 下面这种方式 表里面的每一个字段都要写
insert into UserInfor values ('林东群','dongdong520',20,'1997-7-12 00:00','女','广东')
如果不想 写值 ‘’ 不能不填
--下面这种方式可以添加表单中的指定项
insert into UserInfor(UserName,Pwd,Age) values('刘严','liuyan',22)
下面学 删除 删
delete UserInfor
删除这个 叫 UserInfor 的表
--下面是删除
delete UserInfor where UserId=1004
删除 UserId=1004 的
下面是该 修改
update UserInfor set UserName='刘翔',Age=22,Pwd='qwe1234' where UserId=11
修改 UserId 为11的 UserNam Age Pwd
--约束
找到对应的表 设计 选择对应的项 CHECK 约束 然后写表达式
也可以在JS里面约束 比如年龄 不能小于1 不能大于100
索引 数据库优化 要用的技术
聚集索引
非聚集索引
一个表里面只有一个聚集索引
设置了主键 那么就被默认设置了是聚集索引
提高查询效率
(聚集索引 访问量不是特别大就不要加 访问量特别大就要就 比如和百度大那样的就要加)
------------------------------------
视图 原理 就是联合查询
联合查询 是写在程序里面 写在C# 里面
视图 把它当做单独个体存在数据库里面 可以单一个单独的表使用
视图(占用数据库空间 用的比较少)
存储过程
相对安全 相对高效
--触发器
利用触发器 把删除的东西 显示出来
delete UserInfor where UserId=1005
create trigger trigDeIuser
ON UserInfor
after delete /* 有三种INSERT,DELETE,UPDATE*/
AS
begin
select * from deleted /*在删除后同时查出删除后的内容*/
end
数据库的还原 备份
备份方式 三种
方法1. 选中要备份的数据库----任务-----备份 找到备份文件
还原 选中数据库---右键----还原数据库---设备--添加----覆盖现有数据库---确实
如果向下兼容?
修改兼容级别
选中数据库---右键----属性----选项----降低至自己需要的级别
方法2.通过日志文件还原
C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA
下的.mdf 文件 和.ldf
要先保存起来 不然删了库 这个两个文件也会被删除
然后加进去
还原 选中数据库---右键---附加---选中---确定
方法3.导出脚本
选择数据库----右键---任务----生成脚本----下一步----下一步----高级---倒数第二个
要修改的脚本类型:架构和数据。---然后一直按确定
存入进去
找到脚本 拉倒软件里面 执行就可以了 也可以复制代码执行
修改VIP到期
--update Users set Isvip='false' where Isvip='true' and datediff(dd,getdate(),Expire)<0
--到期了 结果是负数 没到期 结果是正数 刚刚好是0