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(重要)
作用: 非空并且唯一
被主键约束修饰的列,具有唯一性,可以代表一行数据
比如
![](https://img.haomeiwen.com/i15606715/cf3d11e82a516289.png)
编号具有体现某行数据的唯一性,可以代表这一行数据
主键约束的规则
-
一张表中最多只能有一个主键约束
-
做为主键的列,其中的数据不能是Null
-
一个主键约束可以作用在多个列上,叫做“联合主键”
多个列组成一个主键,这些列数据的组合作为主键出现image
面试题
一张表最多只能有一个主键约束 √
一张表中最多只能有一个列是主键约束 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
一张表的某个数据来源于另一张表,这就形成了外键关系
班级表
![](https://img.haomeiwen.com/i15606715/278698916ebbf31a.png)
学生表
![](https://img.haomeiwen.com/i15606715/00e12f290d9fcb3c.png)
学生表中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的区别
网友评论