本文主要介绍微软的SQLServer的数据库操作,内容由浅至深,望读者坚持阅读。
文章目录
简介
- 关系型数据库
- 基于E-R模型,使用sql语言进行操作
分类:
- 文档型sqlite(直接访问)
- 服务型(间接访问数据),如MySQL
- 三范式
- 列不可拆分,唯一标识,引用主键
连接数据库
两种方式:
- Windows 身份认证
- SQL Server 身份认证
第一种:当可以连接到一台电脑进行操作时;第二种:当只能连接到电脑的数据库时。一般使用SQL Server.
- 移动数据库数据
- 右击数据库-任务-分离-勾选删除连接和更新
数据库
表
表的一些概念
- 表的列名
- 表述实体的一些性质
数据唯一性设置
为列名添加数据类型:一般int类型即可,如果需要永远都不会相同的数字,可以选择guid
设置数据类型永远不重复,也可以在列属性下的标识规范中选择–是标识
一般给主键设置唯一标识
- 标识种子
- 第一条数据,标识增量用来区分第一条以后的数据与第一条的间隔
字段类型
- char/varchar : 非unicode编码
- 英文占一个字节,中文占两个字节
- varchar : 可变长度
- char : 数据长度不可变
- nvarchar/nchar : unicode编码
- 中文英文都占一个字节
- decimal(n1,n2) : n1个数字,n2个小数位
- 一般用于设置带有小数位的数据
- bit : 只能存储 0 和 1
- 一般用于一个数据只能有两个值的时候
约束
- 约束
- 实现数据的有效性检查
主键 :
- 非空约束(Not Null)
- 唯一约束 : 右击列名-索引/值-常规类型-唯一键
- 默认值约束 : 可设置为空,而需要列添加默认
- 操作 : 常规-默认值或绑定-设置大小
- 检查约束 : 对设置的值进行要求,若满足要求,则数据可以加入表中
- 操作 : 右击列名-CHECK约束-写约束表达式
- 外键约束 : 对关系进行有效性检查,当然有关系时,也可以不做外键。
主键表和外键表判定: 一个表的内容决定了另一个表的内容,则起决定作用的表为主键表
外键添加操作
- 新建一个外键表
- 在主键表中添加外键表的主键名(使得两个表之间发生关系)
- 添加外键 : 右击外键名-关系-设置外键表与主键表-设置相关的列
当出现表中的列与现有主键或UNIQUE约束不匹配的错误时,要注意可能是没有设置外键的引用唯一约束
主键与外键
主键 | 外键 | |
---|---|---|
定义 | 唯一标识一条记录,不能有重复的,不允许为空 | 表的外键是另一表的主键, 外键可以有重复的, 可以是空值 |
个数 | 主键只能有一个 | 一个表可以有多个外键 |
主键表决定外键表中的一些数据是否为有效。
脚本操作
功能分类
- DDL : 数据定义语言
- 各种数据库对象的创建
- DML : 数据管理语言
- 对表数据的增删改查
- create | alter | drop
- DCL : 数据控制语言
- 进行权限分配
- insert | update | delete | select
查询
- 新建查询
- 点击新建查询
使用某数据库:
use dbName
- 查看master数据库中的sysdatabases表来了解当前存在的数据库
-
select * from sysdatabases
- 增加/删除数据库
-
create/drop database 数据库名
常用辅助命令
- 在消息栏显示详细执行时间
-
set statistics time on/off
- 执行
-
ctrl + e
- 隐藏消息栏
-
ctrl + r
- 计划任务,对sql语句进行分享
-
ctrl + l
使用脚本添加数据表
create database 数据库名
on primary
(
name='dbName_data', -- 主数据文件的逻辑名称
filename='Path~\dbName_data.mdf', --主数据文件的物理名称
size=5mb,
maxsize=100mb, --主数据文件增长的最大值
filegrowth=15% --主数据文件的增长率
)
log on
(
name='dbName_log', -- 主数据日志的逻辑名称
filename='Path~\dbName_log.mdf', --主数据日志的物理名称
size=2mb,
filegrowth=1mb
)
使用脚本创建表
-- 先选定向哪个数据库中进行添加表
use dbtest
create table ClassInfo
(
-- primary key 设置为主键
-- identity(1,1) 设置唯一标识和种子增量
cId int not null primary key identity(1,1),
cTitle nvarchar(10)
)
create table StudentInfo
(
sId int not null primary key identity(1,1),
sName nvarchar(10) not null,
-- default(0) 默认值设置为0
sGender bit default(0),
sBirth date ,
-- 设置外键,不用设置唯一标识
cId int not null.
-- 外键命令 foreign key() references xxx()
foreign key (cId) references ClassInfo(cId)
)
引入外键 : foreign key() references xxx() . 其中
references xxx()
是引用哪一个表里的主键
基本命令
为列,表起别名
select * from UserInfo as ui
为UserInfo起别名为ui,当然as可以省略.注意,一旦取别名之后,调用表的列时,必须用别名来调用。
select查询
查询某些列
-- 查询某些列
select UserName , UserPwd
from UserInfo
查询前n部分数据:
top n 列名
: 表示查询前n行top n percent 列名
: 表示查看前百分之N的数据
select top 2 *
from UserInfo
排序查询:
- 语法:
order by 列名 asc|desc
select * from StudentInfo
-- 当前面的排序条件,数据是满足相同的条件,此时可以提供多种排序方式
order by cId desc,sId asc
上述步骤会先从cId开始排序,如果所有的cId都相同,则会再根据sId排序。
条件查询:
- 语法:
where
- 添加细节 :
between .. and ...
: 区间之间in(n1,n2)
: 符合n1或者n2条件,非连续- 逻辑运算符 :
and | or | not
- 添加细节 :
select * from ClassInfo
-- sId 在1-5之间的
where sId between 1 ans 5
-- sId不在1或者3, 使用 not 和 in
where sId not in(1,3)
-- 逻辑运算符条件
where sId=1 or sId-3
-- 查找编号在3-5的1班学生
where sId between 3 and 5 and cId=1
注意:使用
between ... and ...
需要连续区间。
注意 between的
and
会寻找sql语句中离它最近的。
模糊查询
- 语法 :
like % _ [] ^
%
: 表示零到多个任意字符_
: 表示一个任意字符[]
: 表示范围内的一个字符^
: 非,写在[]
之前表示不在范围内
-- 查询班级姓张的同学
select * from ClassInfo
where sName like '张%'
-- 电话号码第二位为0-4
where sPhone like '1[^579]'
连接查询
当需要的结果从多张表中取得时,使用连接查询
-- 查询学生姓名及所在班级名称
-- StudentInfo
-- ClassInfo
-- 关系:StudentInfo.cid =>ClassInfo.cid
select UserInfo.UserName , classInfo.cTitle
from UserInfo
inner join ClassInfo on StudentInfo.cid=ClassInfo.cid
-- 当然也可以多个表联结,只需要在后面继续添加join语句即可
on
后面写入连接查询的条件
- 连接关键字:
join
左右表:在
join
左边的表为左表。
两种主要的连接方式 | |
---|---|
内联结:inner join | 如果查询的内容严格对应,则为内联结 |
外联结 | |
左外联结:left outer join | 左表特有的数据,右边没有,依旧可以查询出来,显示值为NULL |
右外联结:right outer join | |
完全外联结:full outer join | 左右两表公有的,左表和右表特有的,三者均表示出来 |
insert插入
select * from UserInfo
-- md5加密
insert UserInfo(UserName,UserPwd)
values('1','2')
如果所有列按照默认顺序赋值,则可以使用如下方式
insert UserInfo
values('小孙','password')
- 只为某些列进行赋值
insert UserInfo(UserName)
values('小杰')
- 一次增写入多个数据
使用逗号隔开各个数据
select * from UserInfo
insert into UserInfo
values('小红'),('小菊'),('小巴')
update修改
语法:
update 表名
set 列名1=值1,列名2=值2,...
where ...
where : 为指定行进行修改列
将值设置为空
update 表名 set 列名=null
delete删除
语法:
delete from 表名
where ...
其中
from
写不写都可以。当删除一个列的数据,如果设置了~Id为唯一标识,则Id的计数器会在删除的最后一条数据的Id的基础上,继续自增,即如果删到了第15条,则此时insert
插入后,这条数据的Id将从16开始计数。
清空 : truncate table 表名
-- 清空
truncate table UserInfo
这个命令既是将表内容删除了,也会同时将表的内容进行重置,即计数器将会从1开始。
消除重复行:
- 语法 :
distinct
select distinct cId from StudentInfo
函数
聚合函数
count
计数
-- 查询班级表的列的个数
select COUNT(*) from ClassInfo
-- 此时也可以添加WHERE条件语句
当希望不做计数时,可以将值设置为NULL.
max/min
求最大/小值
-- 计算表中的最大值
select MAX(score) from GradeInfo
avg
求平均值
对行的值进行合并,将多行合并成一行显示。
select AVG(score)
from GradeInfo
聚合函数一般搭配分组
group by
使用,对分组的数据进行统计。
实例:统计男女分别的人数
select COUNT(*)
from StudentInfo
group by sGender
- 注意
-
group by
分组本身就是将条件一致的数据合并在一起,如女生放在一起,男生放在一起,然后可以在
搭配聚合函数,对这两个组进行操作。
开窗函数
- 开窗函数(
over()
) - 将统计出来的数据分布到原表的
每一行中,结合聚合函数、排名函数使用。
-- 同时查询所有列的信息和求和的信息
select GradeInfo.* , sum(score) over()
from ScoreInfo
- 注意
- 如果这里没有使用
over()
函数,则
Grade.*
显示的所有行,而
sum
显示的是合并后的一行,两种无法同时显示,故使用开窗函数将统计数据直接合并在原表的每一行中。