第1章 表的创建和维护

2019-03-13  本文已影响0人  yangsg

1.数据类型

1.1 文本

MySQL 5.0之前的版本char(10)或varchar(10)表述的是10个字节
1英文 = 1字节 可以存储10个英文
1汉字 = 2字节(GBK)/3字节(utf-8) 可以存储5个汉字(GBK)/3个汉字(utf-8)

MySQL 5.0之后的版本char(10)或varchar(10)表述的是10个字符
1英文 = 1字符 可以存储10个英文
1汉字 = 1字符 可以存储10个汉字

1.1.1 char 固定文本

将“学生姓名”列设置为char(10) - 表示可以支持最多10个字符
此时将“Tom”存入“学生姓名”中,实际上存了10个字符 可以理解存储的是"Tom"加7个空格。如果名字长度超过10个,无法存入数据。

1.1.2 varchar 可变文本(重要)

将“学生姓名”列设置为varchar(10) - 表示可以支持最多10个字符
此时将“Tom”存入“学生姓名”中,实际上存了3个字符 。如果名字长度超过10个,无法存入数据。

推荐使用varchar类型作为文本数据的类型,优点:

1.2 数值
1.2.1 int 整数类型(重要)

int类型支持数据为整数性质

1.2.2 float 浮点数类型(小数)(重要)

float类型支持数据为浮点数性质

1.3 时间
1.3.1 date 日期类型(年月日)(重要)

可以存储“年-月-日”的时间

1.3.2 time 时间类型(时分秒)

可以存储“时:分:秒”的时间

1.3.3 datetime 日期时间类型(年月日时分秒)(重要)

可以存储“年-月-日 时:分:秒”的时间

1.3.4 timestamp 时间戳类型(了解)

在Java体系中,时间原点是1970年1月1日 8时0分0秒 GMT+8。时间戳就是表述时间与时间原点之间的所经过毫秒数(1s = 1000ms)

1.4 其他(了解)
1.4.1 blob 字节流类型(二进制数据)

将二进制文件(图片,声音....)的内容存入blob
一般二进制文件占用的空间比较大,存储这种文件可能会拖慢数据库的执行速度

1.4.2 boolean 逻辑类型("真"和"假")

通常情况下使用int类型替代boolean类型
int中认为 0-假 1-真

2.创建表

建表至少需要提供表名,列名和列的数据类型
这些名字的命名规则:

命名规范

语法

CREATE TABLE 表名(
    列1名 列1的数据类型,
    列2名 列2的数据类型,
        ...
    列n名 列n的数据类型
);

3.约束

约束在表中对数据输入的限制,保证数据录入的准确性

3.1 主键约束 Primary Key(重要)

作用
被主键约束修饰的列,具有唯一性,可以代表一行数据
比如


编号性质的主键的列

编号具有体现某行数据的唯一性,可以代表这一行数据

主键约束的规则

面试题
一张表最多只能有一个主键约束
一张表中最多只能有一个列是主键约束 x

主键约束的规范

创建主键的两种方式

列级声明:

CREATE TABLE haha(
    hid INT(8) PRIMARY KEY,
    hname VARCHAR(32),
    birthday DATE
);

表级声明:
创建sno和cno为联合主键的表

CREATE TABLE stu_course(
    sno INT(8), 
    cno INT(8),
    score INT(4),
    PRIMARY KEY(sno,cno)
);
CREATE TABLE haha(
    hid INT(8), 
    hname VARCHAR(32),
    birthday DATE,
    CONSTRAINT PK_HAHA PRIMARY KEY(hid)
);
ALTER TABLE student ADD PRIMARY KEY(sno);
3.2 外键约束 Foreign Key

一张表的某个数据来源于另一张表,这就形成了外键关系
班级表


班级表

学生表


学生表

学生表中cno的数据应该来源于班级表的cno主键,形成外键关系
学生表中cno列依赖于班级表的cno列

为学生表(student)追加外键约束

ALTER TABLE student ADD FOREIGN KEY(cno) REFERENCES classes(cno)

创建学生表(Student)直接设置外键,只有表级声明

CREATE TABLE student(
    sno INT(8) PRIMARY KEY,
    sname VARCHAR(32),
    cno INT(8),
    FOREIGN KEY(cno) REFERENCES classes(cno)
);
3.3 唯一约束 Unique

被唯一约束修饰的列,其中数据不允许出现重复
唯一约束的特点(与主键约束的不同点)

主键约束与唯一约束的区别

添加唯一约束的语句
列级声明

create table student(
    sno INT(8) primary key,
    sname VARCHAR(32) unique,
);

表级声明

create table student(
    sno INT(8),
    sname VARCHAR(32),
    primary key(sno),
    unique(sname)
);
3.4 非空约束 Not Null

约束数据不能为null

列级声明

create table student(
    sno INT(8) primary key,
    sname VARCHAR(32) unique not null,
);
3.5 检查约束 Check(MySQL不支持 Oracle支持)

自定义规则
比如约定某个整数类型的列输入的数字不能小于0
check(xxx > 0)
check(score >= 0 and score <= 100)

笔试题:写出五种数据库的约束,各自进行解释?

4.维护表

4.1 删除表

删除表时一定要事先确认
不仅仅删除的是表中的数据,表结构(表自身)都被删除了

drop table 表名;
4.2 截断表(清空表中的数据)

清空表中的数据,保留表结构(表自身)

truncate table 表名;

面试题
- drop和truncate的区别?
答 drop时删除整张表,包含表结构;truncate是截断表,保留表结构

4.3 更改表名

将表student2更名为student3

ALTER TABLE student2 RENAME student3
4.4 更改列名和列的数据类型

更改student3表中的sname列为snamex,同时列的数据类型varchar(64)

ALTER TABLE student3 CHANGE sname snamex VARCHAR(64);
4.5 增加列

为student3表新增birthday列,列的数据类型是date类型

ALTER TABLE student3 ADD COLUMN birthday DATE
4.6 删除列

删除student3表中birthday列

ALTER TABLE student3 DROP COLUMN birthday

本章重点

  1. 表的概念
  2. 各种约束的概念
  3. 主键约束的一些细节(联合主键)
  4. 主键和唯一的区别
  5. drop和truncate的区别
上一篇下一篇

猜你喜欢

热点阅读