数据库的基本操作
1. 操作数据库
增: create database db charset utf8;
查: show databases;
改: alter database db charset latin1;
删: drop database db;
2. 操作表 (先切换到表下: use db)
增: create table t1(id int, name char);
查: show tables;
改: alter table t1 modify name char(3);
alter table t1 change name name1 char(2);
删: drop table t1;
3. 操作表中的记录
增: insert into t1 values(1, 'jack'), (2, 'jason');
查: select * from t1;
改: update t1 set name='ran' where id=2;
删: delete from t1 where id=2;
清空表:
delete from t1; # 如果有自增id,新增的数据,仍然是以删除前的最后一样作为起始。
truncate table t1; # 数据量大,删除速度比上一条快,且直接从零开始
创建表
表: 表就相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段
语法:
create table 表名(字段名1 类型[(宽度) 约束条件],...)
注意:
1. 在同一张表中,字段名是不能相同
2. 宽度和约束条件可选
3. 字段名和类型是必须的
建表基本流程
1) 创建数据库
create database db;
2) 进入数据库
use db;
3) 建立表
create table student (id int(11) primary key, name varchar(32), age int(4), sex enum('male', 'female'));
4) 展示所有表
show tables;
5) 查看表结构
desc(describe) 表名;
6) 查看表结构(engine(存储引擎)和charset(字符集)等全面信息), \G是竖向排列的格式.等信息。
show create table 表名 \G;
7) 按照字段查询表信息;
select id, name from student;
8) 查看表所有信息
select * from student;
插入数据
插入表信息:
- insert into 表名 (字段1,字段2) values (值1,值2); # 按照给出的字段对应插入值
- insert into 表名 values (值1 ,值2); # 必须要按照位置类型等插入对应的值
1) 指定表字段进行插入数据
insert into student (id, name, age, sex) values (1, 'jack', 20, 'male');
2) 直接插入数据 (要按照字段顺序插入)
insert into student values (2, 'jason', 18, 'male');
修改表结构
1. 修改表名
alter table 表名 rename 新表名;
2. 增加字段
alter table 表名 add 字段名 数据类型 [完整性约束条件...],
add 字段名 数据类型 [完整性约束条件...];
3. 删除字段
alter table 表名 drop 字段名;
4. 修改字段
alter table 表名 modify 字段名 [数据类型...];
alter table 表名 change 旧字段名 新字段名 旧数据类型 [完整性约束...];
alter table 表名 change 旧字段名 新字段名 新数据类型 [完整性约束...];
5. 修改字段排列顺序/在增加的时候指定字段位置
ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] FIRST;
ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名;
ALTER TABLE 表名 CHANGE 字段名 旧字段名 新字段名 新数据类型 [完整性约束条件…] FIRST;
ALTER TABLE 表名 MODIFY 字段名 数据类型 [完整性约束条件…] AFTER 字段名;
多表结构的创建与分析
辨别两张表的关系
1. 先站在左表的角度去找
是否左表的多条记录可以对应右表的一条记录,如果是,则证明左表的一个字段 foreign key 右表一个字段(通常是id)
2. 再站在右表的角度去找
是否右表的多条记录可以对应左表的一条记录,如果是,则证明右表的一个字段 foreign key 左表一个字段(通常是id)
3. 总结
1) 多对一
如果只有步骤1成立,则是左表多对一右表
如果只有步骤2成立,则是右表多对一左表
2) 多对多
如果步骤1和2同时成立,则证明这两张表时一个双向的多对一,即多对多,需要定义一个这两张表的关系表来专门存放二者的关系
3) 一对一
如果1和2都不成立,而是左表的一条记录唯一对应右表的一条记录,反之亦然。这种情况很简单,就是在左表foreign key右表的基础上,将左表的外键字段设置成 unique 即可
建立表之间的关系
一对多
三张表: 出版社 作者 书
一对多(多对一): 一个出版社可以出版多本书
关联方式: foreign key
1. 创建出版社表
create table press (id int primary key auto_increment, name char(32));
2. 书籍表 (外键)
create table book (
id int primary key auto_increment,
name varchar(32),
press_id int not null,
foreign key(press_id) references press(id)
on delete cascade
on update cascade
);
多对多
多对多: 一个作者可以写多本书,一本书也可以有多个作者,双向的一对多,即多对多
关联方式: foreign key + 关联表
1. 作者表
create table author (id int primary key auto_increment, name varchar(32));
2. 存放作者和书之间的关系表
create table author_book(
id int primary key auto_increment,
author_id int not null,
book_id int not null,
constraint fk_author foreign key(author_id) references author(id)
on delete cascade
on update cascade,
constraint fk_book foreign key(book_id) references book(id)
on delete cascade
on update cascade,
primary key(author_id, book_id)
);
3. 插入数据
insert into author_book(author_id, book_id) value ((1, 2), (1, 3), (2, 3), (3,4));
constraint(约束): [kən'strent]
一对一
两张表:学生表和客户表
一对一:一个学生是一个客户
关联方式: foreign key + unique
1. 客户表
create table customer(id int primary key auto_increment, name varchar(32) not null,);
2. 学生表
create table student(
id int primary key auto_increment,
class_name varchar(32) not null,
customer_id int unique, # 保证该字段唯一
foreign key(customer_id) references customer(id) # 外键的字段要保证唯一
on delete cascade
on update cascade);
3. 增加学生
insert into student(class_name, customer_id) values ('1班', 2), ('2班', 3);