MySQL学习笔记
数据类型
数据类型 | 大小(字节) | 用途 | 格式 |
---|---|---|---|
INT | 4 | 整数 | |
FLOAT | 4 | 单精度浮点数 | |
DOUBLE | 8 | 双精度浮点数 | |
ENUM | -- | 单选,如性别 | ENUM('a','b','c') |
SET | -- | 多选 | SET('1','2','3') |
DATE | 3 | 日期 | YYYY-MM-DD |
TIME | 3 | 时间点或持续时间 | HH:MM:SS |
YEAR | 1 | 年份值 | YYYY |
CHAR | 0-255 | 定长字符串 | |
VARCHAR | 0-255 | 变长字符串 | |
TEXT | 0-65535 | 长文本数据 |
整数除了 INT 外,还有 TINYINT、SMALLINT、MEDIUMINT、BIGINT。
unsigned:将数据类型设置无符号化。例如INT的类型范围是 -2147483648 ~ 2147483647, INT UNSIGNED的范围类型就是 0 ~ 4294967295。
auto_increment:设置自增长,主键会自动以相同的步长进行增长
id INT(10) UNSIGNED AUTO_INCREMENT PRIMARY KEY NOT NULL,
使用UNSIGNED可能会产生一些问题,请读者自行研究。
CHAR 和 VARCHAR 的区别
CHAR 的长度是固定的,而 VARCHAR 的长度是可以变化的,比如,存储字符串 “abc",对于 CHAR(10),表示存储的字符将占 10 个字节(包括 7 个空字符),而同样的 VARCHAR(12) 则只占用 4 个字节的长度(增加一个额外字节来存储字符串本身的长度),12 只是最大值,当你存储的字符小于 12 时,按实际长度存储。
ENUM 和 SET 的区别
ENUM 类型的数据的值,必须是定义时枚举的值的其中之一,即单选,而 SET 类型的值则可以多选。
约束(CONSTRAINT)
约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性、唯一性。比如,规定一个用户的用户名不能为空值且没有重复的记录,这就是一种约束规则。
约束类型 | 主键 | 默认值 | 唯一 | 外键 | 非空 |
---|---|---|---|---|---|
关键字 | PRIMARY KEY | DEFAULT | UNIQUE | FOREIGN KEY | NOT NULL |
主键(PRIMARY KEY)作为数据表中一行数据的唯一标识符,在一张表中通过主键就能准确定位到某一行数据,因此主键十分重要,它不能有重复记录且不能为空。创建主键方式如下:
CREATE TABLE user(
id INT PRIMARY KEY,
name VARCHAR(20)
);
CREATE TABLE user(
id INT,
name VARCHAR(20),
[CONSTRAINT id_pk] PRIMARY KEY(id) -- id_pk为自定义的主键名称 约束名可以省略
);
CREATE TABLE user(
id INT,
name VARCHAR(20),
[CONSTRAINT test_pk] PRIMARY KEY(id, name) --复合主键,可以由表中的两列或多列来共同标识 test_pk为自定义的主键名称 约束名可以省略
);
默认值约束 (DEFAULT) 规定,当有 DEFAULT 约束的列,插入数据为空时,将使用默认值。
people_num INT DEFAULT 10,
唯一约束 (UNIQUE) 比较简单,它规定一张表中指定的一列的值必须不能有重复值,即这一列每个值都是唯一的。
people_num INT UNIQUE,
非空约束 (NOT NULL),听名字就能理解,被非空约束的列,在插入值时必须非空。
people_num INT NOT NULL,
外键 (FOREIGN KEY) 既能确保数据完整性,也能表现表之间的关系。
一个表可以有多个外键,每个外键必须 REFERENCES (参考) 另一个表的主键,被外键约束的列,取值必须在它参考的列中有对应值。
比如,现在有用户表和图书表,给图书表中添加一个指向用户 name 的外键,表示这本书所属的用户 name,外键将确保这个外键指向的记录是存在的,如果你尝试删除一个用户,而这个用户还有图书存在于数据库中,那么操作将无法完成并报错。因为你删除了该用户过后,图书没有所属用户了,而这样的情况是不被允许的。同理,你在创建一篇图书的时候也不能为它指定一个不存在的用户 name。
create database test;
use test;
CREATE TABLE user(
name VARCHAR(10) PRIMARY KEY NOT NULL,
age INT NOT NULL
);
CREATE TABLE book(
id INT unsigned PRIMARY KEY NOT NULL,
user VARCHAR(10) NOT NULL,
price INT NOT NULL,
[CONSTRAINT test_pk] FOREIGN KEY(user) REFERENCES user(name) --注意外键必须指向user表中的主键 约束名可以省略
);
INSERT INTO user VALUES('Tom', 6);
INSERT INTO user VALUES('Jack', 8);
在创建了如上的表结构后,我们可以尝试向book表中添加数据,此时由于参考列中没有Mike,添加失败
INSERT INTO book VALUES(1, 'Mike', 20);
我们将Mike改为Tom再次尝试,可以添加成功
INSERT INTO book VALUES(1, 'Tom', 20);
目前由于已经有数据指向Tom,此时删除Tom的数据,会发现删除失败
DELETE FROM user WHERE name = 'Tom';
SQL内置函数
SQL 允许对表中的数据进行计算。SQL 有 5 个内置函数,这些函数都对 SELECT 的结果做操作:
函数名 | COUNT | SUM | AVG | MAX | MIN |
---|---|---|---|---|---|
作用 | 计数 | 求和 | 求平均值 | 最大值 | 最小值 |
其中 COUNT 函数可用于任何数据类型(因为它只是计数),而 SUM 、AVG 函数都只能对数字类数据类型做计算,MAX 和 MIN 可用于数值、字符串或是日期时间数据类型。