数据库范式,外键,视图

文章目录

  • dbms
  • 范式
      • 1NF
      • 2NF
      • 3NF
  • 实体与实体之间的关系
    • 外键
      • 问题1. 外键定义在student表?还是class表?
      • 注意事项
      • 约束
      • 自增长 auto_increament
  • 存储引擎
    • Innodb
    • 截断表和删除表
  • 视图
    • 创建一个视图
    • 使用视图
    • 删除视图
  • 索引
    • 创建索引
    • 数据库索引分类
      • 聚集索引(聚簇索引)
      • 非聚集索引
      • hash 索引(无序)
      • b-tree索引
    • 索引的语法
  • 自定义函数
    • select()
    • 自定义

dbms

数据库管理系统
Database Management System
是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称DBMS
接收客户端指令(语法检查,编译指令,执行)

范式

1NF

一言以蔽之:“第一范式的数据表必须是二维数据表”,第一范式是指数据库的每一列都是不可分割的基本数据项,强调列的原子性。

2NF

第二范式建立在第一范式的基础上,即满足第二范式一定满足第一范式,第二范式要求数据表每一个实例或者行必须被唯一标识。除满足第一范式外还有两个条件,一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。

每一行的数据只能与其中一列相关,即一行数据只做一件事。只要数据列中出现数据重复,就要把表拆分开来。

举例来说:当数据表中是联合主键,但是有的列只依赖联合主键中的一个或一部分属性组成的联合主键,此时需要拆表才能复合第二范式。

3NF

没有传递依赖
举例来说:

  • Employee(emp_id,emp_name,emp_age,dept_id,dept_name,dept_info),当员工表中emp_id能够唯一确定员工员工信息,但是dept_name可由dept_id唯一确定,此时,该表不符合第三范式,此时可以删除除了dept_id之外的其他部门信息,把所有部门信息单独建立一张部门表。

实体与实体之间的关系

  1. 一对一的关系(比如一个身份证号对应一个人)
  2. 多对多关系(一个班级的人,可能选很多的课)
  3. 一对多的关系
  • 在实体中要有体现关系的列(需要有一列记录当前实体和其他实体之间的关系)
  • 外键记录当前实体与其他实体的关系

– student和class之间存在多对一的关系 (存在外键)

外键

外键的作用很重要,最好在数据库中使用。举一个例子比较明白。

  • 比如有两张表格,一个是学生档案,另一个是上学期间的成绩单
    档案中会有:学号,姓名。(学号为主键)
    成绩单有(简化过的):学期号,学号,平均分数(学期号,学号两个同时为主键,学号同时为外键)
    为了保证成绩单上的数据有效,所以要求录入学号时,必需保证档案中有这个学号,否则就不能录入。
    从而保证了成绩单上的成绩数据的引用完整,否则将会是垃圾数据。

问题1. 外键定义在student表?还是class表?

  • 外键一定定义在多方 即student表
    – 多对多关系(定义关系表描述外键)
DROP table if
create TABLE studeng(
	stuid int,
    stuname varchar,
    -- 外键 class表中的classid必须是主键
    classid int
    primary key(stuid),
    constraint FK_classid foreigh key(classid) reference class(classid)
)
create TABLE class(
	classid INT,
    classname varchar(20),
    Primary key(classid)
)

注意事项

  • 删除表时,必须先删除外键表才能删除主键表
  • 创建表时 必须先创建主键表,再创建外键表
  • 外键必须引用主键表的主键

满足第二范式 ,不满足第三范式,

create TABLE studeng(
	stuid int,
    stuname varchar,
    classid int,
    classname int
)

第三范式,不允许传递依赖,即创建外键

create TABLE studeng(
   stuid int,
   stuname varchar,
   classid int
   primary key(stuid),
   constraint FK_classid foreigh key(classid) reference class(classid)
)
create TABLE class(
   classid INT,
   classname varchar(20),
   Primary key(classid)
)
-- constraint 约束 FK——CLASSID主键关系 约束名称
-- reference 引用 class(classid) 外键引用的表 以及表里的主键
  • 创建外键的第二种方式 alter
reate TABLE studeng(
	stuid int,
    stuname varchar,
    cid int
    primary key(stuid)
)
ALTER table studeng add constraint FK_classname foreign key(cid) reference class(classid) 

约束

  1. 主键约束
  2. 外键约束
  3. 唯一性约束 如果一个列添加了唯一性约束,那么当前列的值不允许重复
  4. 检查约束(mysql的innodb引擎不支持)
    检查约束(mysql默认的存储引擎是innidb innidb不支持检查约束)
-- 唯一性约束的创建
-- 1.修改表添加唯一性约束
alter table student ADD constraint UQ_STUNAME UNIQUE(stuname)
-- 2.  
create TABLE studeng(
	stuid int,
    stuname varchar(20) UNIQUE ,
    cid int
    primary key(stuid)
)

自增长 auto_increament

– 自增长的列 列必须是数值型 是主键
– 主键不允许重复 主键有时需要递增1
create TABLE studeng(
stuid int auto_increment,
stuname varchar(20) UNIQUE ,
cid int
primary key(stuid)
)
– insert into student values(default,xx,xx)
– insert into student values(default,xx,xx)
– 修改自增长种子值
create TABLE studeng(
stuid int auto_increment,
stuname varchar(20) UNIQUE ,
cid int
primary key(stuid)
)AUTO_INCREMENT=100

– 删除列
alter table student drop column stuaddress
– 添加列 并指定添加列的结构
alter table student add stuaddress text after stuname
– 修改名
alter table xx rename xx

存储引擎

数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据操作。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。

Innodb

InnoDB 是事务型数据库的首选引擎,

  • 支持事务安全表(ACID),
  • 支持行锁定和外键。
  • MySQL5.5.5之后,InnoDB 作为默认的存储引擎
  • 防止回滚,效率比较低
update account set money=money-1000 where accountName='张三'
update account set money=money+1000 where accountName='李四'

截断表和删除表

数据库范式,外键,视图_第1张图片

视图

视图是一张虚拟表,不写入磁盘
仅仅提供查询

创建一个视图

CREATE VIEW 视图名(列1,列2…) AS SELECT (列1,列2…) FROM …;

create VIEW stu_class_teacher_view
AS 
	select S.'stuid',S.'stuname',S.'stusex'
	FROM atudent S INNER JOIN class C

使用视图

删除视图

数据库范式,外键,视图_第2张图片

索引

想要理解索引原理必须清楚一种数据结构「平衡树」(非二叉),也就是b tree或者 b+ tree,重要的事情说三遍:“平衡树,平衡树,平衡树”。当然, 有的数据库也使用哈希桶作用索引的数据结构 , 然而, 主流的RDBMS都是把平衡树当做数据表默认的索引数据结构的。

创建索引

CREATE TABLE mytable(  
    ID INT NOT NULL,   
    username VARCHAR(16) NOT NULL,  
    INDEX [indexName] (username(length))  
); 

数据库索引分类

  1. 主键索引
  2. 外键索引
  3. 唯一索引(给当前表添加唯一性约束)

非当前表添加唯一性约束的方式

alter table student ass constraint uq_name unique(stuname)
show index from student
  • 以创建索引的方式,创建唯一性索引。相当于给当前表创建唯一性约束
create unique index uq_name on student(stuname)
  • 创建普通索引,不需要tsuname 唯一
  1. 组合索引
ALTER TABLE student ADD INDEX suoyin (stuname(10),age); 
  1. 全文索引

聚集索引(聚簇索引)

索引页 把存储索引的空间称为页
数据页(数据(内容占用的空间))
聚集索引在一张数据表中只能存在一个

  1. 主键:唯一的 一张数据表如果存在主键,那么这个主键就是索引,主键存在,当前数据表就不能存在聚集索引。所以我们创建的索引都是非聚集索引
  2. 级联查询:

非聚集索引

不要求索引排序和数据排序保持一致

hash 索引(无序)

定位快,hash算法 ,O(1),所以索引不能应用到排序上,不能做范围查询。

b-tree索引

索引的语法

  1. crreate index
  2. create unique index
  3. create fulltext index
  4. drop index

自定义函数

执行效率比较高
函数优点:

  1. 函数模块化(一个函数完成一个业务)
  2. 执行效率高
  3. 安全性高
  4. 减少网络流量

select()

选择函数,自定义函数

自定义

create function myfun() return int
begin
	return 10;
end

sql默认的结束符号是; 分号
delimiter 修改当前sql的结束符号

delimiter $$
 create function myfun() return int
begin
	return 10;
end$$

数据库范式,外键,视图_第3张图片
session
打电话的一次通话(没挂断之前)

drop function if exists fun
create function myfun(i int) returns varchar(20)
begin
	return concat('张三',i);
END $$

select myfun()

你可能感兴趣的:(数据库)