数据结构和数据库的区别
数据库是应用软件级别研究数据的存储和操作(主要针对磁盘上的数据)
数据结构是在系统软件级别研究数据的存储和操作(主要是针对内存中的数据)
对硬盘数操作是数据库的强项,是数据库研究的核心问题。
什么是连接
客户端和数据库其实是分离的,客户端只是我们管理数据发送命令显示数据的工具,实际上的数据库和这个客户端没有什么关系。
客户端通过连接访问数据库,如果没有开启数据库服务就无法进行访问。
命令通过客户端发送给数据库执行。有些命令可以一起执行,有些命令无法一起执行。
数据库创建和删除
.mdf
数据文件.ldf
日志文件
系统数据库不要进行修改
数据库附加和分离
右击数据库->任务->分离(解除SSMS和数据库之间连接)
然后将数据库文件移动,再在其他机器附加.mdf
文件
右键数据库->附加
需要注意的是有可能附加失败,弹出:附加操作系统错误5什么的,需要修改文件的权限:
如图,添加完全控制。
SQL Server创建登录用户
注意只有管理员才能创建其他用户,注意创建账号的时候去掉强制密码过期
关系型数据库基本概念
- 字段:列、属性,用来模拟许多事物的某一个静态特征
- 记录:行、元组,用来模拟一个事物的许多静态特征,表示事物本身
- 表:记录的组合,用来模拟同类事物的集合
- 主键:唯一标识事务
- 外键:表示该元素和另一个表中元素的关系(一般是多对一的多中含有外键,就是说如果一个表A的某个属性是另一个表B中的属性,且表A中许多记录的属性都是相同的,则应该在表A中添加主键。因为如果我们在表B中添加主键,那么每个表B中的记录都对应多个表A的记录,无法在一个格子中添加,即B->A不是函数)
创建表
创建表之前需要创建库
nvarchar
表示国家化编码可以变化的字符串(支持汉字)
允许NULL值表示是否允许这个属性不填
dbo
表示当前用户是管理员身份
含有外键的表叫做外键表
添加外键
使用图形界面
对某一列选择关系
使用命令
新建查询,选择对应的数据库
注释使用 --
,需要注意的是每条语句后面都应该加上逗号,最后一条语句后面可以加上逗号也可以不加上(Oracel不能在最后一条语句后面加上逗号)
create table dept
(dept_id int primary key,dept_name nvarchar(100) not null,dept_address nvarchar(100)
)create table emp
(emp_id int constraint pk_emp_id primary key,emp_name nvarchar(20) not null, --nvar表示国际化支持汉字可以变化的字符串emp_sex nchar(1),dept_id int constraint fk_dept_id foreign key references dept(dept_id)
)
点击感叹号后执行,然后刷新数据库中的表,就可以看到新建的表。
约束
对一个表中属性操作的限制叫做约束
分类:
- 主键约束:不允许重复数据,避免数据冗余(实体完整性)
- 外键约束:通过外键约束从语法上保证本事物所关联的其他事物一定是存在的(引用完整性),事物和事物之间的关系是通过外键来体现的
- check约束:保证事物属性的取值在合法的范围内
create table student
(std_id int primary key,std_sal int check(std_sal>=1000 and std_sal<=8000)
)insert into student values (1, 1000)
insert into student values (2, 10000)
- default约束:保证事物的属性一定会有一个值
create table student
(std_id int primary key,std_sal int check(std_sal>=1000 and std_sal<=8000),std_sex nchar(1) default ('男') --()可以省略,在数据库中字符串必须用''括起来--数据库中的单引号用来表示字符串--数据库中的双引号用来表示事物的名称
)insert into student(std_id, std_sal) values (1, 1000)
insert into student values (2, 10000, '女')
如果在前面省略了插入字段的集合,则在后面必须给所有属性赋值
允许为空和default之间:可以认为允许为空为default
为Null
insert如果没有给所有的字段赋值,则必须在表后面加上所赋值字段的集合,无论没有赋值的字段是为空还是有default值
- 唯一约束:保证事物属性的取值不允许重复,但允许为空
create table student1
(std_id int primary key,std_sal int check(std_sal>=1000 and std_sal<=8000),std_sex nchar(1) default ('男'),std_name nvarchar(200) unique
)insert into student1 values (1, 6000, '男', '张三')
insert into student1 values (2, 2000, '女', null) --唯一键可以为空,但是主键不允许为空
unique
和not null
可以组合使用,这样也不能为空了
create table student1
(std_id int primary key,std_sal int check(std_sal>=1000 and std_sal<=8000),std_sex nchar(1) default ('男'),std_name nvarchar(200) unique not null
)
虽然允许其中一个为空,但是不能有多个空但是Orecal里面允许多个字段为空
- not null约束:要求用户必须为该属性赋一个值,否则语法出错。默认允许为空,如果不写not null 则不允许为空
唯一约束和主键约束之间的关系
create table student
(std_id int primary key identity, --添加一个没有实际意义的字段当作主键,即代理主键-- identity 表示插入元素的时候不需要录入,自动增长--只有主键能够作为外键std_name nvarchar(50) unique not null, --不要使用业务逻辑当作主键-- 原因1:当使用具有实际意义的字段当作主键的时候,这个字段的元素有可能会改变-- 原因2:查找元素的时候一般按照主键进行查询,使用整型数字更好,效率更高-- 原因3:拥有实际意义的字段一般比较长,浪费储存空间std_email nvarchar(50) not null,-- 默认允许为空,如果不写not null 则不允许为空std_address nvarchar(50)
)
表和约束之间的区别:
通过表来解决事物的存储
通过约束来解决事物取值的有效性和合法性的问题
建表的过程就是指定事物属性以及事物属性各种约束的过程
关系
一对一
一对多
多对多
通过设置不同的外键来表示表和表的不同关系
一对一
- 关联的实体共享一个主键
- 其中一个实体通过外键关联到另外一个实体的主键,需要在外键列添加唯一约束
- 通过外键表表示实体之间的关系
一对多(A表和B表)
B表添加外键关联到A的主键,不需要在外键列添加唯一约束。即在多的一方添加外键。本质上要满足函数关系
多对多(A表和B表)
多对多必须通过单独的一张表来表示
create table cls
-- 表示class,表名不要写复数,写单数
(cls_id int primary key,cls_num int not null,cls_name nvarchar(10)
)create table teacher
(teacher_id int primary key,teacher_name nvarchar(10) not null
)create table cls_teacher_mapping
-- 用来模拟班级和教师的多对多关系
(rela_cls int constraint fk_cls foreign key references cls(cls_id),rela_teacher int constraint fk_teacher foreign key references teacher(teacher_id),rela_course nvarchar(10),constraint pk_cls_teacher primary key (rela_cls,rela_teacher),--主键只允许有一个,外键可以有多个
)insert into cls values (1, 20, 'one')
insert into cls values (2, 30, 'two')
insert into cls values (3, 40, 'three')insert into teacher values (1001, 'a')
insert into teacher values (1002, 'b')
insert into teacher values (1003, 'c')
insert into teacher values (1004, 'd')insert into cls_teacher_mapping values (1, 1001, 'C')
insert into cls_teacher_mapping values (2, 1002, 'C++')
insert into cls_teacher_mapping values (3, 1001, 'C')
insert into cls_teacher_mapping values (2, 1003, 'Python')
主键
主键:能够唯一标识事物的一个字段或者多个字段的组合
主键的特征:
- 主键通常都是整数(不建议使用字符串当作主键,除非是用于集群式服务的时候)。
集群式服务:用户的一个请求可能需要使用不同主机的数据库才能够完成一个服务 - 主键的值通常不允许修改,除非本记录被删除(如果该主键作为其他表的外键的时候如果修改可能导致数据丢失)
- 主键一般定义为表名_id,或者表名Id
- 要用代理主键,不要使用业余主键。即不要使用有业务含义的字段当作主键
外键
外键:如果一个表中的若干个字段是来自若干个表的主键或者唯一键,则这若干个字段就是外键
注意:外键通常是来自另外表的主键而不是唯一键,因为唯一键可能为Null或者被修改
外键不一定来自其他表,也可能来自本表的主键。例如,员工表里面上司字段就是员工表的主键
含有外键的表叫做外键表,外键字段来自的那张表叫做主键表
主键表和外键表的删除问题
应该先删除外键表。先删除主键表,则使得外键表的数据引用失败。如果坚持删除,应该先删除关系。