MySQL-表

  • 存储在表中的数据是一种类型的数据,不同类型的数据应放到不同的表中,否则会使以后的检索和访问很困难。
  • 数据库中的每个表都有一个名字,用来标识自己。此名字是唯一的, 这表示数据库中没有其他表具有相同的名字。
  • 表由一个或多个列组成。每一列存储一列特定的信息,列称为字段,每个列都有相应的数据类型。数据类型定义列可以存储的数据种类。例如,某一列中需要存储数字,该列的数据类型应该定义为数值类型。

数据类型

整型:无符号-unsigned

浮点型、定点型

日期时间类型

字符型

char 和 varchar 的区别:

char:固定长度

最大 255 字符

数据长度不足会再尾部填充空格,查询时会自动去掉空格

效率高,占空间

varchar:长度可变

最大可设置 65535 字节

sql 复制代码
insert into vc(v,c) values('ab  ','ab  ');

select * from vc where v='ab  ';  # 能查到
select * from vc where c='ab  ';  # 能查到

select * from vc where v like 'ab  ';  # 能查到
select * from vc where c like 'ab  ';  # 不能查到

注:'=' 不是完全对等,'like' 可以表示完全对等

DDL(数据定义语言)

Data Definition Language, 用于定义和管理数据库中的对象和结构,如表、列、索引等。

创建表

sql 复制代码
create table [if not exists] 表名(
    字段1 字段类型 [列级约束条件],
    字段2 字段类型 [列级约束条件],
    ...
    [表级约束条件]
)

注:最后一个字段后面不加","

查看表

显示数据库中的表

sql 复制代码
show tables;

查看表的基本结构

sql 复制代码
desc 表名;

查看数据库/表的创建语句

sql 复制代码
show create table 表名:

修改表

  • 添加字段
sql 复制代码
alter table 表名
add column 新列名 数据类型 [约束条件] first / after 列名;

注:

first:添加到最前面(即第一列)

after 列名:添加到该列之后

  • 修改字段的类型
sql 复制代码
alter table 表名
modify column 列名 数据类型 [约束条件];
  • 修改字段的位置
sql 复制代码
alter table 表名
modify column 列名 数据类型 first / after 列名;
  • 修改字段名
sql 复制代码
alter table 表名
change column 旧列名 新列名 数据类型;
  • 删除字段
sql 复制代码
alter table 表名
drop column 列名;

重命名表

sql 复制代码
alter table 旧表名
rename to 新表名;

删除表

sql 复制代码
drop table 表名;

练习

DML(数据操作语言)

Data Manipulation Language,用于操作数据库中的实际数据,如插入、更新、删除和查询数据。

插入数据

插入完整的行,所有字段,每一个字段都必须提供一个值,如果某个字段没有值,应该使用NULL,每个字段必须以他们在表中定义的顺序给出。这种语法简单,但是不安全,应该避免使用。

sql 复制代码
insert into 表名
values (字段1的值,字段2的值,...);

更安全的方法是,在表名后的括号中给出字段名,values 中的值的顺序与前面给出的字段的顺序相同,一一对应。不需要与表中定义的顺序相同,没有值的字段可以不提供。

sql 复制代码
insert into 表名 (字段1,字段2,...)
values (字段1的值,字段2的值,...);
  • values 后面可以跟多个括号,括号间用逗号分隔,每个括号代表要插入的一条数据
  • 单条 insert 语句插入多条数据比多条 insert 语句快

更新数据

sql 复制代码
update 表名
set 字段1 = 字段1的值,字段2 = 字段2的值,...
where 限制条件;
  • 注:记得加 where 限制条件,否则更新整个表中的每一条数据

删除数据

sql 复制代码
delete from 表名
where 限制条件;
  • 同样,不加限制条件会删除整个表中每一条数据
  • 物理删除,无法恢复
  • 注:在对 update 或 delete 使用 where 前,应该先用 select 语句进行测试保,证它的过滤结果是正确的

练习

约束

constraint

|------|----------|---------|--------|-------------|-------------|
| 约束类型 | 非空约束 | 默认约束 | 唯一约束 | 主键约束 | 外键约束 |
| 关键字 | not null | default | unique | primary key | foregin key |

非空约束

创建表时设置非空约束

sql 复制代码
create table 表名(
    字段名 字段类型 not null,
    ...
);

已有字段添加非空约束

sql 复制代码
alter table 表名
modify column 字段名 字段类型 not null;

删除非空约束(修改为允许为空)

sql 复制代码
alter table 表名
modify column 字段名 字段类型;

注意:不要混淆 NULL 值和空串,NULL值是没有值,空串是"(两个单引号,中间没有字符)

默认约束

sql 复制代码
create table 表名(
    字段名 字段类型 default 默认值,
    ...
);

唯一约束

列级

sql 复制代码
create table 表名(
    字段名 字段类型 unique,
    ...
);

表级,可以给约束起名,可以创建多列的唯一约束(联合唯一约束)

sql 复制代码
create table 表名(
    字段1 字段类型,
    字段2 字段类型,
    ...
    [constraint 约束名] unique(字段1,字段2)
);

已有字段添加唯一约束

sql 复制代码
alter table 表名
modify 字段名 字段类型 unique;

alter table 表名
add [constraint 约束名] unique(字段名);

删除唯一约束

sql 复制代码
alter table 表名
drop index 约束名;

alter table 表名
drop key 约束名;

主键约束

唯一标识表中每行的这个列(或这组列)称为主键。主键用来表示一个特定的行。没有主键,更新或删除表中特定行很困难,因为没有安全的方法保证只涉及相关的行。

因此:

  • 每一个表都应该定义主键
  • 主键的值不应该修改
  • 不使用可能会修改值的列作为主键(与业务无关,通常使用id 作为主键)

特点:

  • 唯一性:主键要求每一行数据的主键值都必须是唯一的,不允许有重复值。
  • 非空性:主键要求主键列的值不能为空,即不能为 NULL
  • 单一性:每个表只能有一个主键。主键可以由一个列或多个列组成,形成复合主键

列级

sql 复制代码
create table 表名(
    字段名 字段类型 primary key,
    ...
);

表级,可以给约束起名,可以创建多列的联合主键

sql 复制代码
create table 表名(
    字段1 字段类型,
    字段2 字段类型,
    ...
    [constraint 约束名] primary key(字段1,字段2)
);

删除主键

sql 复制代码
alter table 表名
drop primary key;

自动递增

auto_increment:设置 auto_increment 的列,当每增加一行时自动增量。每个表只允许一个 auto_increment 列。

sql 复制代码
create table 表名(
    字段1 字段类型 auto_increment
);

外键约束

外键为表中的某一字段,该字段是另一表的主键值,外键用来在两个表的数据之间建立联结,一个表中可以有一个或多个外键。外键的作用是保持数据的一致性、完整性。

注意:

外键字段可以为null,外键为空的数据也叫孤儿数据

有了外键引用之后,表分为父表和子表

  • 创建表时先创建父表,再创建子表
  • 插入数据时,先插入附表数据,再插入子表数据
  • 删除时,先删除子表,再删除父表

子表外键类型要与父表外键类型一致

sql 复制代码
[constraint 外键名] foreign key (列名) references 主表名 (主键);

练习

相关推荐
Dann Hiroaki1 小时前
文献分享: ConstBERT固定数目向量编码文档
数据库·机器学习·自然语言处理·nlp
黑风风1 小时前
探索 Ubuntu 中的 Hostname 配置与管理
数据库·ubuntu·php
rkmhr_sef3 小时前
MyBatis-Plus 自定义 SQL 和复杂查询
数据库·sql·mybatis
Craaaayon3 小时前
Docker基础-自定义镜像与容器网络
java·运维·网络·数据库·后端·docker·容器
茂桑3 小时前
记录一次Spring事务失效导致的生产问题
数据库
天地风雷水火山泽3 小时前
二百八十五、华为云PostgreSQL——建分区表并设置主键
数据库·postgresql·华为云
IT程序媛-桃子3 小时前
Oracle连接满了,无法登录数据库,如何分析连接来源?
数据库·oracle
Watink Cpper4 小时前
[MySQL初阶]MySQL(3)表的约束
linux·运维·服务器·数据库·mysql·表的约束
然子而4 小时前
苍穹外卖学习笔记(跳过微信支付)
java·spring boot·git·学习·mysql·maven·mybatis
Craaaayon4 小时前
Docker基础-常见命令与数据卷
java·数据库·后端·mysql·docker·容器·eureka