数据类型
是对数据存储空间的约束,作用是规范数据的范围,方便存储
·作用:对数据进行分类,对相同类型的数据给予相同大小的存储空间。
整数、浮点数、字符串、时间日期
1、整数类型
类型 |
字节 |
范围(有符号) |
范围(无符号) |
tinyint |
1 |
(-128,127) |
(0,255) |
smallint |
2 |
(-32768,32767) |
(0,65535) |
mediumint |
3 |
(-8388608,8388607) |
(0,16777215) |
int |
4 |
(-2147483 648,2147483647) |
(0,4294967295) |
bigint |
8 |
(-9223372036854775808,9223372036854775807) |
(0,18446744073709551615) |
2、浮点数和定点数
类型 |
大小 |
float |
4字节:小数位过多会自动四舍五入 |
double |
8字节:相对float精确一些 |
decimal |
decimal(M总长度,D小数位长度)M>D decimal(6,2)代表总共六位数其中后两位是小数,如1000.00 decimal是以字符串方式存储的数字 |
3、日期时间
类型 |
字节 |
范围 |
格式 |
用途 |
DATE |
3 |
1000-01-01/9999-12-31 |
YYYY-MM-DD |
日期 |
time |
3 |
'-838:59:59'/'838:59:59' |
HH:MM:SS |
时间 |
year |
1 |
1901/2155 |
YYYY |
年份 |
datetime |
8 |
1000-01-01 00:00:00/9999-12-31 23:59:59 |
YYYY-MM-DD HH:MM:SS |
年月日时分秒 |
timestamp |
4 |
1970-01-01 00:00:00/2038 结束时间是第 2147483647秒 北京时间2038-1-19 11:14:07, 格林尼治时间2038年1月19日 凌晨 03:14:07 |
YYYYMMDD HHMMSS |
1970~2038,范围太小 |
4、字符串类型
类型 |
大小 |
用途 |
char(100) |
0-255字节 |
定长字符串,适合手机号、身份证号,有可能会浪费存储空间,但查询效率高 |
varchar(100) |
0-65535 字节 |
变长字符串,姓名、密码、地址、简介、标题、短文节约空间,性能不如CHAR |
tinyblob |
0-255字节 |
不超过 255 个字符的二进制字符串 |
tinytext |
0-255字节 |
短文本字符串 |
blob |
0-65 535字节 |
二进制形式的长文本数据,二进制字符 |
text |
0-65 535字节 |
长文本数据,普通文本,评论,简介,短文 |
mediumblob |
0-16 777 215字节 |
二进制形式的中等长度文本数据 |
mediumtext |
0-16 777 215字节 |
中等长度文本数据 |
longblob |
0-4 294 967 295字节 |
二进制形式的极大文本数据 |
longtext |
0-4 294 967 295字节 |
极大文本数据,超长的文本,例如:一本书 |
DQL数据查询语句
mysql>use test;
mysql>show tables;
mysql>desc user_info;
# 添加数据(每个insert语句单独执行,用;分隔)
格式:insert into 表名(字段1,字段2,....) values(值1,值2...);
eg:insert into user_info(username,password,birthday,gender,phone,address,email)
values('张三','123456','2000-1-1','男','12345678','河北','zhangsan@qq.com');
# 查询所有列的所有数据 (*通配符:所有的列名)
select * from user_info;
# 查询某几列的数据
select username,phone,gender from user_info;
打开Navicat数据库,点查询,新建查询,输入select * from user_info;
·update:修改更新表中已有的数据
update 表名 set 字段名='新值' where 条件;
update user_info set password='zhang123' where id=1;
update user_info set address=”太原” where username=”李四”;
## 注意:修改语句必须要加where条件,如果忘记加条件,则会修改所有行中的数据。
------------------------------------------------
·delete:根据条件删除表中的数据
delete from 表名 where 条件;
delete from user_info where id=1;
## 删除数据必须要加where条件,否则会删除所有行的数据。
MySQL约束条件(Constraints)
一、主键(PRIMARY KEY)
约束条件是数据库表中定义的规则,用于限制列中存储的数据,防止无效或不合理的数据进入表中。常见的约束条件包括:
1. 主键约束(PRIMARY KEY)
·作用:唯一标识表中的每条记录,确保记录不重复且非空。
·特点:一个表只能有一个主键,主键字段的值不能为`NULL`,也不能重复。
·示例:
输入create table students (
id int primary key, -- id作为主键、类似于身份证号码
name varchar(50)
);
2. 非空约束(NOT NULL)
·作用:强制列不能存储`NULL`值,确保该字段必须有值。
·示例:
输入create table users (
id int primary key,
username varchar(50) not null -- 用户名不能为空
);
3. 唯一约束(UNIQUE)
·作用:确保列中所有值都是唯一的(不重复),但允许`NULL`(最多一个`NULL`)。
·示例:
输入create table emails (
id int primary key,
email varchar(100) unique -- 邮箱地址不能重复
);
4. 默认约束(DEFAULT)
·作用:当插入数据时未指定该列的值,自动使用默认值填充。
·示例:
输入create table products (
id int primary key,
status varchar(20) default 'active' -- 默认为"active"状态
);
5. 检查约束(CHECK)
·作用:限制列中值的范围或条件(MySQL 8.0.16及以上支持)。
·示例:
输入create table employees (
id int primary key,
salary decimal(10,2) check (salary > 0) -- 工资必须大于0
);
6. 自增约束(AUTO_INCREMENT)
·作用:自动为新记录生成唯一的递增数值,通常与主键配合使用,一般用于id递增。
·示例:
输入create table articles (
id int primary key auto_increment, -- 自动生成1,2,3...
title varchar(100)
);
二、外键(FOREIGN KEY)
外键是用于关联两个表的约束,确保表之间的数据关联性和一致性。
·主表:被从表(包含外键的表)通过主键关联。
·核心作用:强制从表(含外键的表)的某个字段值必须对应主表(被引用的表)中已存在的主键值。
·示例场景:
主表`students`(学生信息)和从表`scores`(成绩信息)通过外键关联,确保成绩表中的学生必须是学生表中已存在的。
-- 主表:学生表
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(50)
);
-- 从表:成绩表(含外键)
CREATE TABLE scores (
score_id INT PRIMARY KEY,
student_id INT, -- 关联学生表的id
score INT, -- 定义外键:student_id必须对应students表的id
FOREIGN KEY (student_id) REFERENCES students(id) ON DELETE CASCADE -- 主表删除学生时,从表关联成绩也删除,黑色这句话可以省略
);
·外键规则:
当主表数据被修改时,可通过`ON DELETE`或`ON UPDATE`定义从表的行为(如`CASCADE`级联删除、`SET NULL`设为NULL等)。
下面是删除的步骤演示:
mysql> select * from students;DATABASE
+----+--------+
| id | name |
+----+--------+
| 1 | 张三 |
| 2 | 李四 |
| 3 | 王五 |
| 4 | 赵六 |
+----+--------+
4 rows in set (0.01 sec)
mysql> desc scores;
+------------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+------+------+-----+---------+-------+
| score_id | int | NO | PRI | NULL | |
| student_id | int | YES | MUL | NULL | |
| score | int | YES | | NULL | |
+------------+------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> insert into scores(score_id,student_id,score) values(1,1,100);
Query OK, 1 row affected (0.01 sec)
mysql> insert into scores(score_id,student_id,score) values(2,2,90);
Query OK, 1 row affected (0.00 sec)
mysql> insert into scores(score_id,student_id,score) values(3,3,95);
Query OK, 1 row affected (0.00 sec)
mysql> insert into scores(score_id,student_id,score) values(4,4,85);
Query OK, 1 row affected (0.00 sec)
mysql> select * from scores;
+----------+------------+-------+
| score_id | student_id | score |
+----------+------------+-------+
| 1 | 1 | 100 |
| 2 | 2 | 90 |
| 3 | 3 | 95 |
| 4 | 4 | 85 |
+----------+------------+-------+
4 rows in set (0.00 sec)
mysql> select * from students;
+----+--------+
| id | name |
+----+--------+
| 1 | 张三 |
| 2 | 李四 |
| 3 | 王五 |
| 4 | 赵六 |
+----+--------+
4 rows in set (0.00 sec)
mysql> delete from students where id=3;
Query OK, 1 row affected (0.00 sec)
mysql> select * from students;
+----+--------+
| id | name |
+----+--------+
| 1 | 张三 |
| 2 | 李四 |
| 4 | 赵六 |
+----+--------+
3 rows in set (0.00 sec)
mysql> select * from scores;
+----------+------------+-------+
| score_id | student_id | score |
+----------+------------+-------+
| 1 | 1 | 100 |
| 2 | 2 | 90 |
| 4 | 4 | 85 |
+----------+------------+-------+
3 rows in set (0.00 sec)
三、数据完整性(Data Integrity)
完整性指数据库中的数据符合预定规则,不存在无效或错误信息,主要分为四类:
1. 实体完整性
确保表中每条记录都是唯一且可识别的,通过主键和唯一约束实现(如学生表中“学号”唯一)。
2. 域完整性
确保列中数据符合特定格式或范围,通过数据类型、非空约束、检查约束等实现(如“年龄”必须是正整数)。
3. 参照完整性
确保多表之间的关联关系合法,通过外键实现(如成绩表的学生必须在学生表中存在)。
4. 用户定义完整性
根据业务需求自定义的规则(如“订单金额必须大于0”),可通过`check`约束或触发器实现。
四、唯一性(Uniqueness)
唯一性是指表中某个字段的值不允许重复,主要通过两种方式实现:
1. 主键(primary key)
- 不仅要求唯一,还不允许`null`,一个表只能有一个主键。
- 示例:`id int primary key`
2. 唯一约束(unique)
- 仅要求值唯一,允许`null`(但最多一个`null`),一个表可以有多个唯一约束。
- 示例:`email varchar(100) unique`
- 区别:主键是“唯一标识记录”,唯一约束是“确保字段值不重复”,主键本质上是一种特殊的唯一约束(加非空限制)。
### 总结
- 约束条件是保障数据规则的“工具集”(主键、外键、非空等);
- 外键是约束的一种,专门用于维护表之间的关联关系;
- 完整性是数据符合规则的“状态”(实体、域、参照等维度);
- 唯一性是数据的“属性”,确保字段值不重复(通过主键或唯一约束实现)。
合理使用这些机制,能有效保证数据库数据的准确性、一致性和可靠性。