- 存储在表中的数据是一种类型的数据,不同类型的数据应放到不同的表中,否则会使以后的检索和访问很困难。
- 数据库中的每个表都有一个名字,用来标识自己。此名字是唯一的, 这表示数据库中没有其他表具有相同的名字。
- 表由一个或多个列组成。每一列存储一列特定的信息,列称为字段,每个列都有相应的数据类型。数据类型定义列可以存储的数据种类。例如,某一列中需要存储数字,该列的数据类型应该定义为数值类型。
数据类型
整型:无符号-unsigned
浮点型、定点型
日期时间类型
字符型
char 和 varchar 的区别:
char:固定长度
最大 255 字符
数据长度不足会再尾部填充空格,查询时会自动去掉空格
效率高,占空间
varchar:长度可变
最大可设置 65535 字节
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, 用于定义和管理数据库中的对象和结构,如表、列、索引等。
创建表
create table [if not exists] 表名(
字段1 字段类型 [列级约束条件],
字段2 字段类型 [列级约束条件],
...
[表级约束条件]
)
注:最后一个字段后面不加“,”
查看表
显示数据库中的表
show tables;
查看表的基本结构
desc 表名;
查看数据库/表的创建语句
show create table 表名:
修改表
- 添加字段
alter table 表名
add column 新列名 数据类型 [约束条件] first / after 列名;
注:
first:添加到最前面(即第一列)
after 列名:添加到该列之后
- 修改字段的类型
alter table 表名
modify column 列名 数据类型 [约束条件];
- 修改字段的位置
alter table 表名
modify column 列名 数据类型 first / after 列名;
- 修改字段名
alter table 表名
change column 旧列名 新列名 数据类型;
- 删除字段
alter table 表名
drop column 列名;
重命名表
alter table 旧表名
rename to 新表名;
删除表
drop table 表名;
练习
DML(数据操作语言)
Data Manipulation Language,用于操作数据库中的实际数据,如插入、更新、删除和查询数据。
插入数据
插入完整的行,所有字段,每一个字段都必须提供一个值,如果某个字段没有值,应该使用NULL,每个字段必须以他们在表中定义的顺序给出。这种语法简单,但是不安全,应该避免使用。
insert into 表名
values (字段1的值,字段2的值,...);
更安全的方法是,在表名后的括号中给出字段名,values 中的值的顺序与前面给出的字段的顺序相同,一一对应。不需要与表中定义的顺序相同,没有值的字段可以不提供。
insert into 表名 (字段1,字段2,...)
values (字段1的值,字段2的值,...);
- values 后面可以跟多个括号,括号间用逗号分隔,每个括号代表要插入的一条数据
- 单条 insert 语句插入多条数据比多条 insert 语句快
更新数据
update 表名
set 字段1 = 字段1的值,字段2 = 字段2的值,...
where 限制条件;
- 注:记得加 where 限制条件,否则更新整个表中的每一条数据
删除数据
delete from 表名
where 限制条件;
- 同样,不加限制条件会删除整个表中每一条数据
- 物理删除,无法恢复
- 注:在对 update 或 delete 使用 where 前,应该先用 select 语句进行测试保,证它的过滤结果是正确的
练习
约束
constraint
约束类型 | 非空约束 | 默认约束 | 唯一约束 | 主键约束 | 外键约束 |
关键字 | not null | default | unique | primary key | foregin key |
非空约束
创建表时设置非空约束
create table 表名(
字段名 字段类型 not null,
...
);
已有字段添加非空约束
alter table 表名
modify column 字段名 字段类型 not null;
删除非空约束(修改为允许为空)
alter table 表名
modify column 字段名 字段类型;
注意:不要混淆 NULL 值和空串,NULL值是没有值,空串是“(两个单引号,中间没有字符)
默认约束
create table 表名(
字段名 字段类型 default 默认值,
...
);
唯一约束
列级
create table 表名(
字段名 字段类型 unique,
...
);
表级,可以给约束起名,可以创建多列的唯一约束(联合唯一约束)
create table 表名(
字段1 字段类型,
字段2 字段类型,
...
[constraint 约束名] unique(字段1,字段2)
);
已有字段添加唯一约束
alter table 表名
modify 字段名 字段类型 unique;
alter table 表名
add [constraint 约束名] unique(字段名);
删除唯一约束
alter table 表名
drop index 约束名;
alter table 表名
drop key 约束名;
主键约束
唯一标识表中每行的这个列(或这组列)称为主键。主键用来表示一个特定的行。没有主键,更新或删除表中特定行很困难,因为没有安全的方法保证只涉及相关的行。
因此:
- 每一个表都应该定义主键
- 主键的值不应该修改
- 不使用可能会修改值的列作为主键(与业务无关,通常使用id 作为主键)
特点:
- 唯一性:主键要求每一行数据的主键值都必须是唯一的,不允许有重复值。
- 非空性:主键要求主键列的值不能为空,即不能为 NULL
- 单一性:每个表只能有一个主键。主键可以由一个列或多个列组成,形成复合主键
列级
create table 表名(
字段名 字段类型 primary key,
...
);
表级,可以给约束起名,可以创建多列的联合主键
create table 表名(
字段1 字段类型,
字段2 字段类型,
...
[constraint 约束名] primary key(字段1,字段2)
);
删除主键
alter table 表名
drop primary key;
自动递增
auto_increment:设置 auto_increment 的列,当每增加一行时自动增量。每个表只允许一个 auto_increment 列。
create table 表名(
字段1 字段类型 auto_increment
);
外键约束
外键为表中的某一字段,该字段是另一表的主键值,外键用来在两个表的数据之间建立联结,一个表中可以有一个或多个外键。外键的作用是保持数据的一致性、完整性。
注意:
外键字段可以为null,外键为空的数据也叫孤儿数据
有了外键引用之后,表分为父表和子表
- 创建表时先创建父表,再创建子表
- 插入数据时,先插入附表数据,再插入子表数据
- 删除时,先删除子表,再删除父表
子表外键类型要与父表外键类型一致
[constraint 外键名] foreign key (列名) references 主表名 (主键);