### 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(重要)
作用: 非空并且唯一
被主键约束修饰的列,具有唯一性,可以代表一行数据
比如
![image](https://img.haomeiwen.com/i15606715/cf3d11e82a516289.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/373/format/webp)
编号具有体现某行数据的唯一性,可以代表这一行数据
主键约束的规则
* 一张表中最多只能有一个主键约束
* 做为主键的列,其中的数据不能是Null
* 一个主键约束可以作用在多个列上,叫做“联合主键”
*多个列组成一个主键,这些列数据的组合作为主键出现*
![image](https://img.haomeiwen.com/i15606715/ca79919884db906f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/961/format/webp)
*面试题*
*一张表最多只能有一个主键约束* √
*一张表中最多只能有一个列是主键约束* 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
一张表的某个数据来源于另一张表,这就形成了外键关系
班级表
![image](https://img.haomeiwen.com/i15606715/278698916ebbf31a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/147/format/webp)
学生表
![image](https://img.haomeiwen.com/i15606715/00e12f290d9fcb3c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/207/format/webp)
学生表中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
```
**本章重点**
1. 表的概念
2. 各种约束的概念
3. 主键约束的一些细节(联合主键)
4. 主键和唯一的区别
5. drop和truncate的区别
网友评论