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类型作为文本数据的类型,优点:
- 数据在存储中不会有多余的冗余部分(主要指的是填满长度的空格)
- 数据准确性,"Tom"和"Tom+7个空格"不是一样的数据
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.创建表
建表至少需要提供表名,列名和列的数据类型
这些名字的命名规则:
- 不能使用中文,只能英文和数字,不能以数字开头
- 名字中间不允许出现空格
- 不要使用SQL中的关键字
- 不能使用已有的名字
命名规范
- 使用英文单词进行命名
语法
CREATE TABLE 表名(
列1名 列1的数据类型,
列2名 列2的数据类型,
...
列n名 列n的数据类型
);
3.约束
约束在表中对数据输入的限制,保证数据录入的准确性
3.1 主键约束 Primary Key(重要)
作用: 非空并且唯一
被主键约束修饰的列,具有唯一性,可以代表一行数据
比如
编号具有体现某行数据的唯一性,可以代表这一行数据
主键约束的规则
一张表中最多只能有一个主键约束
做为主键的列,其中的数据不能是Null
-
一个主键约束可以作用在多个列上,叫做“联合主键”
多个列组成一个主键,这些列数据的组合作为主键出现
面试题
一张表最多只能有一个主键约束 √
一张表中最多只能有一个列是主键约束 x
主键约束的规范
- 不使用有实际意义的数据做为主键列,因为实际意义的列可能发生改动
创建主键的两种方式
- 建表时声明主键约束
创建表时,直接在主键列后进行primary key进行声明
列级声明:
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)
);
- 建表后追加主键约束
为student表的sno列添加主键约束
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
被唯一约束修饰的列,其中数据不允许出现重复
唯一约束的特点(与主键约束的不同点)
- 一张表中可以有多个唯一约束
- 唯一约束的数据中可以有null
主键约束与唯一约束的区别
添加唯一约束的语句
列级声明
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
本章重点
- 表的概念
- 各种约束的概念
- 主键约束的一些细节(联合主键)
- 主键和唯一的区别
- drop和truncate的区别