表的创建

  1. -- 表的创建语法格式输入:
  2. create table 表名(
  3. 字段名1 数据类型,
  4. 字段名2 数据类型,
  5. ...
  6. );
  7. 例如:
  8. $ use demo;
  9. $ create table t_user(
  10. > name varchar(255),
  11. > age int
  12. > );

Mysql 中的数据类型

mysql 常见的数据类型如下:

数据类型 描述
int 整形
bigint 长整型
float 浮点型
char 定长字符串
varchar 可变字符串
date 日期类型
BLOB 二进制大对象(Binary Large Object)
CLOB 字符串大对象(Character Large Object)

char 和 varchar 的选择:
char(10):无论储存的数据有没有达到指定长度,都会分配这些空间,产生多余空间。
varchar(10):如果存储的数据没有达到指定长度,varchar 会自动计算需要的空间,不会产生多余的空间。

在实际开发中,当某个字段数据长度不会发生改变时使用 char,比如说:性别,当一个字段的长度不固定时使用 varchar 比如:简介。

向表中插入数据

  1. -- 插入数据语法:
  2. $ insert into 表名(字段1, 字段2) values (值1, 2);
  3. 例如:
  4. $ insert into t_user(name, age) values ('kk', 18);
  5. -- 下面这种写法可以实现添加, 但是 values 必须和表的结构位置一一对应:
  6. $ insert into t_user values ('sk', 18);
  7. -- 一次插入多条数据使用逗号隔开, 直接写 values
  8. $ insert into 表名(字段1, 字段2) values (值1, 2), (值1, 2), (值1, 2);
  9. 例如:
  10. $ insert into t_user(name, age) values ('kk', 18), ('xk', 20), ('xh', 23);

在插入数据时,字段和值的数量必须相同,且数据类型必须对应, 如果忽略某些字段时,自动填充 null。

表的复制和批量插入

通过 select 把查询数据来的数据复制为一张表或插入到一张表中。

  1. -- 表的复制语法:
  2. $ create table 表名 as select 查询语法;
  3. 例如:
  4. $ create table t_clone_emp as select * from emp;
  5. -- 批量插入语法:
  6. $ insert into t_clone_emp select 查询语法;
  7. 例如:
  8. $ insert into t_clone_emp select * from emp;

修改表中的数据

  1. -- 修改表中数据的语法:
  2. $ update 表名 set 字段1=值, 字段2=值 where 条件;
  3. 例如:
  4. $ update t_user set name='superKK', age = 20 where name = 'kk';

如果不加 where 条件会将表中所有数据都会修改掉!

删除表中的数据

  1. -- 删除表中数据语法:
  2. $ delete from 表名 where 条件;
  3. 例如:
  4. $ delete from t_user where name = 'superKK';

如果不加 where 条件会将表中所有数据都会删除掉!

截断表:

  1. -- 当表中数据非常多时, delete 删除的时间会很长, 可以使用下面语法截断表:
  2. $ truncate table 表名;
  3. 例如:
  4. $ truncate table t_user;

注:

  1. truncate 只是把表中的数据全部删除了,表的结构还存在。
  2. 表被截断后无法回滚,数据彻底丢失,危险操作。

    约束

    常见的约束有:

    • 非空约束 :not null
    • 唯一性约束:unique
    • 主键约束 :primary key
    • 外键约束 :foreign key

      非空约束

      非空约束是指在添加数据时不能为空: ```sql create table t_user( id int not null, — 给 id 字段添加非空约束 not null name varchar(255), age int );

— 添加时不指定 id $ insert into t_user(name, age) values(‘kk’, 18); — 报错:ERROR 1364 (HY000): Field ‘id’ doesn’t have a default value

— 指定 id $ insert into t_user(id, name, age) values(1, ‘kk’, 18);

  1. <a name="MkF6H"></a>
  2. ### 唯一性约束
  3. 唯一性约束指字段的值不能出现重复,但是可以为 null。
  4. ```sql
  5. create table t_user(
  6. id int unique, -- 给 id 字段添加唯一性约束 unique
  7. name varchar(255),
  8. age int
  9. );
  10. -- 添加一条数据
  11. $ insert into t_user(id, name, age) values(1, 'kk', 18);
  12. -- 尝试添加重复的 id
  13. $ insert into t_user(id, name, age) values(1, 'xk', 18);
  14. -- 报错:ERROR 1062 (23000): Duplicate entry '1' for key 'id'

unique 可以给多个字段联合起来成为一个唯一性约束,此时只有两个联合重复时才会报错:

  1. create table t_user(
  2. id int,
  3. name varchar(255),
  4. age int,
  5. unique(id, name) -- id, name 联合添加一个约束
  6. );
  7. -- 单条重复不会报错:
  8. $ insert into t_user(id, name, age) values(1, 'kk', 18);
  9. $ insert into t_user(id, name, age) values(1, 'xk', 18); -- name 没有重复
  10. -- 联合重复报错:
  11. $ insert into t_user(id, name, age) values(1, 'kk', 18);
  12. -- 报错:ERROR 1062 (23000): Duplicate entry '1-kk' for key 'id'

上面这种在最后添加联合添加一个约束称之为表级约束,在字段类型后面定义的叫做列级约束。

主键约束

主键约束 primary key ,值不能为空也不能重复。

  1. create table t_user(
  2. id int primary key, -- id 为主键
  3. name varchar(255),
  4. age int
  5. );
  6. -- 添加一条数据
  7. $ insert into t_user(id, name, age) values(1, 'kk', 18);
  8. -- 不能重复
  9. $ insert into t_user(id, name, age) values(1, 'kk', 18); -- error
  10. -- 不能为空
  11. $ insert into t_user(name, age) values('xk', 18); -- error
  1. -- 复合主键:多个字段联合为一个主键约束
  2. create table t_user(
  3. id int,
  4. name varchar(255),
  5. age int,
  6. primary key(id, name) -- 复合主键
  7. );
  8. -- 添加一条数据
  9. $ insert into t_user(id, name, age) values(1, 'kk', 18);
  10. -- id 重复, 正常
  11. $ insert into t_user(id, name, age) values(1, 'xk', 18);
  12. -- id name 都重复, 出错
  13. $ insert into t_user(id, name, age) values(1, 'kk', 18); -- error
  14. /*
  15. * 注:此方式不推荐使用!
  16. */


主键约束的作用:**
表的设计三范式中要求每一张表都要有一个主键,主键就是这张表中这行数据的唯一标示,就像身份证号一样。

主键的分类:
根据主键字段的字段数量划分为:

  1. - 单一主键 (一个字段的主键约束)
  2. - 复合主键 (多个字段联合为一个主键约束,复合主键不符合设计三范式,不推荐使用)

根据主键的性质划为为:

  1. - 自然主键 (与业务没关联的主键,如:123
  2. - 业务主键 (与业务相关联的数据作为主键,如身份证号,业务耦合太高不推荐使用)

注:一张表中只能有一个主键。

主键自增:
可以设置主键自增 auto_increment,这样后面添加数据时就可以省略主键不写,自动维护一个默认从 1 开始自增的主键。

  1. create table t_user(
  2. id int primary key auto_increment, -- id 为主键, 并设置主键自增
  3. name varchar(255),
  4. age int
  5. );
  6. -- 添加数据
  7. $ insert into t_user(name, age) values ('kk', 18), ('xk', 20);
  8. -- 查询
  9. $ insert into t_user(name, age) values ('kk', 18), ('xk', 20);
  10. -- 结果如下:
  11. +----+------+------+
  12. | id | name | age |
  13. +----+------+------+
  14. | 1 | kk | 18 |
  15. | 2 | xk | 20 |
  16. +----+------+------+

外键约束

外键约束 foreign key , 在一种业务场景下,如:设计表维护学生和班级信息,如果设计一张表会出现数据冗余的情况,因为一个班级会对应多个学生,如果在一张表中,那么每个学生就要维护一个对应班级名称,这个班级名称就冗余了,所以这时可以设计两张表,一张学生表只维护学生信息,另一张班级表维护班级信息,在学生表中有一个 classId 字段来指向班级表的班级 id,这样就减少了冗余的数据。
但是在学生表的 classId 可能会胡乱填写,导致无法和班级表对应上,这时就可以使用外键约束,让学生表中的 classId 只能是班级表中的班级 id 中的一项。

  1. -- 外键添加方式:
  2. $ foreign key(字段名) references 表名(字段名) ; -- 放在添加表语句最后
  3. 例如:
  4. -- 创建班级表
  5. create table t_class(
  6. cid int primary key,
  7. classname varchar(255)
  8. );
  9. -- 创建学生表
  10. create table t_student(
  11. sid int,
  12. name varchar(255),
  13. classid int,
  14. foreign key(classid) references t_class(cid) -- 添加外键
  15. );
  16. -- 测试:
  17. $ insert into t_class(cid, classname) values (1, 'class one');
  18. $ insert into t_student(sid, name, classid) values(1, 'kk', 10); -- classId 不在 t_class id 中, 添加失败
  19. $ insert into t_student(sid, name, classid) values(1, 'kk', 1); -- success
  20. $ insert into t_student(sid, name) values(2, 'xk'); -- 外键值可以为 null

在外键约束中添加外键的表叫做子表,被引用的表叫做父表,如上面的 t_student 表中的 sid 字段是一个外键,t_student 就是子表,t_class 的 cid 字段被 t_student 外键引用着,t_class 就是 t_student 的父表。

在操作这两表时,有一定的顺序要求:

  1. - 删除数据的时候,先删除子表,再删除父表。
  2. - 添加数据时,先添加父表,再添加子表。
  3. - 创建表的时候,先创建父表,再创建子表。
  4. - 删除表的时候,先删除子表,再删除父表。

注:

  • 被外键引用的字段必须具有唯一性约束 unique
  • 外键值可以为 null 。