[mysql] 基础学习

106 阅读4分钟

数据库的三范式

第一范式(1NF)

  • 第一范式是指数据库的每一列都是不可分割的基本数据项,而下面这样的就存在可分割的情况:

学生(姓名,电话号码)

  • 电话号码实际上包括了家用座机电话移动电话,因此它可以被拆分为:

学生(姓名,座机号码,手机号码)

  • 满足第一范式是关系型数据库最基本的要求!

第二范式(2NF)

第二范式要求表中必须存在主键,且其他的属性必须完全依赖于主键,比如:

学生(学号,姓名,性别)

  • 学号是每个学生的唯一标识,每个学生都有着不同的学号,因此此表中存在一个主键,并且每个学生的所有属性都依赖于学号,学号发生改变就代表学生发生改变,姓名和性别都会因此发生改变,所有此表满足第二范式。

第三范式(3NF)

  • 在满足第二范式的情况下,所有的属性都不传递依赖于主键,满足第三范式。

学生借书情况(借阅编号,学生学号,书籍编号,书籍名称,书籍作者)

  • 实际上书籍编号依赖于借阅编号,而书籍名称和书籍作者依赖于书籍编号,因此存在传递依赖的情况,我们可以将书籍信息进行单独拆分为另一张表:

学生借书情况(借阅编号,学生学号,书籍编号)

书籍(书籍编号,书籍名称,书籍作者)

  • 这样就消除了传递依赖,从而满足第三范式。

BCNF

  • BCNF作为第三范式的补充,假设仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量),且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。这个数据库表中存在如下决定关系:

(仓库ID, 存储物品ID) →(管理员ID, 数量)

(管理员ID, 存储物品ID) → (仓库ID, 数量)

  • 所以,(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是StorehouseManage的候选关键字,表中的唯一非关键字段为数量,它是符合第三范式的。但是,由于存在如下决定关系:

(仓库ID) → (管理员ID)

(管理员ID) → (仓库ID)

  • 即存在关键字段决定关键字段的情况,如果修改管理员ID,那么就必须逐一进行修改,所以其不符合BCNF范式。

数据库 操作

库操作(查、建、删、用)

  • 查看当前所有的数据库: show databases;
  • 创建数据库:create database [IF NOT EXISTS] 数据库名 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
  • 删除数据库:drop database 数据库名;
  • 使用数据库:use 数据库名;

表 操作

  • 查看所有表:show tables;
  • 建表:
create table 表名(
    字段名 类型[列级约束条件],
    ....
) defalult charset=utf-8;
  • 删除表:drop table 表名;
  • 清空表 delete from 表名;truncate table 表名;(速度快、无法回滚撤销等)
  • 清空表:
    • 添加列

      alter table 表名 add 列名 类型;
      alter table 表名 add 列名 类型 DEFAULT 默认值;
      alter table 表名 add 列名 类型 not null default 默认值;
      alter table 表名 add 列名 类型 not null primary key auto_increment;
      
    • 删除列

      alter table 表名 drop column 列名;
      
    • 修改列 类型

      alter table 表名 modify column 列名 类型;
      
    • 修改列 类型 + 名称

      alter table 表名 change 原列名 新列名 新类型 额外的配置;
      
      alter table  tb change id nid int not null;
      alter table  tb change id id int not null default 5;
      alter table  tb change id id int not null primary key auto_increment;
      
      alter table  tb change id id int; -- 允许为空,删除默认值,删除自增。
      
    • 修改列 默认值

      ALTER TABLE 表名 ALTER 列名 SET DEFAULT 1000;
      
    • 删除列 默认值

      ALTER TABLE 表名 ALTER 列名 DROP DEFAULT;
      
    • 添加主键

      alter table 表名 add primary key(列名);
      
    • 删除主键

      alter table 表名 drop primary key;
      

列级约束条件

列级约束有六种:主键Primary key外键foreign key唯一 unique检查 check (MySQL不支持)、默认default非空/空值 not null/ null

数据类型

  • char(n)可以存储任意字符串,但是是固定长度为n,如果插入的长度小于定义长度时,则用空格填充。
  • varchar(n)也可以存储任意数量字符串,长度不固定,但不能超过n,不会用空格填充。

以下数据类型用于存储数字:

  • smallint用于存储小的整数,范围在 (-32768,32767)
  • int用于存储一般的整数,范围在 (-2147483648,2147483647)
  • bigint用于存储大型整数,范围在 (-9,223,372,036,854,775,808,9,223,372,036,854,775,807)
  • float用于存储单精度小数
  • double用于存储双精度的小数

以下数据类型用于存储时间:

  • date存储日期
  • time存储时间
  • year存储年份
  • datetime用于混合存储日期+时间