之前写了个小爬虫程序爬取了电影天堂的所有电影信息,但是由于当时对mysql的多表操作不太理解
于是直接在表中添加了一个moveclass列来表示电影的类别
在网上找了一些资料,了解到多表创建的方法
1:单表和对应的多表的创建,拿tv 和所属与tv的move,dongman来距离
创建tv表只有一个表示类别的主键列
create table tvclass(class primary key varchar(20))
创建move表和dongman表
create table move(
moveid int primary key auto_increment,
movename varchar(20),
class_id varchar(20)
)
create table dongman(
dongmanid int primary key auto_increment,
dongmanname varchar(20),
class_id varchar(20)
)
添加约束
ALTER TABLE move ADD FOREIGN KEY (tvclass_id) REFERENCES tvclass(class) ;
ALTER TABLE dongman ADD FOREIGN KEY (tvclass_id) REFERENCES tvclass(class) ;
新建架构选择器可以查看表之间的关系
多对多表的创建
比如订单和商品,一个订单可以对应多个商品,但是存在多个订单
一般在开发中引入一张中间表,在中间表中存放两张表的主键,一般还会将这两个主键设置成中间表的联合主键,主键1对应多个主键2即可实现多对多表
create table zhongjianbiao(id1 int,id2 int)
添加外键约束
alter table zhongjianbiao add foreign key(id1) references table1(id);
alter table zhongjianbiao add foreign key(id2) references table2(id);
多表的查询:
笛卡尔积:
多张表无条件的联合查询(没有任何意义)
select a.*,b.* from a,b
内连接:
格式1:显示内连接
select a.*,b.*from a [inner] join b on (的连接条件)
格式2:隐式内连接
select a.*,b.* from a,b where (的连接条件)
外连接:
左外连接:
select a.*,b.* from a left [outer] join on b (连接的条件)
意思:
先展示join左边的a表的所有数据,根据条件关联查询join 右边的表(b),符合条件的展示出来,不符合为null
右外连接:
select a.*,b.* from b right [outer] join a on (连接条件)
意思:
先展示join右边的表(a)的所有数据,根据条件关联查询join左边的表(b),符合条件的展示出来,不符合为null
子查询:
一个查询依赖于另一个查询的结果
比如查询某一元素的多表信息
1:先查某一元素的id,关联的主键列
select * from a where name = ' '
2:根据这个主键列查多表的值查出多表信息
select * from b where aid = id
合并
select * from b where aid = (select * from a where name='');
查多元素的多表信息,使用in