自关联
- 设计省信息的表结构provinces
- id
- ptitle
- 设计市信息的表结构citys
- id
- ctitle
- proid
- citys表的proid表示城市所属的省,对应的provinces表的id值
- 问题:能不能将两个表和成一张表呢?
- 思考:观察两张表发现,city表比provinces表多一个列proid,其他列的类型都是一样
- 意义:存储的都是地区信息,而且每种信息的数据有限,没必要增加一个新表,或者将来还要存储区,乡镇信息,都会增加新标的开销太大
- 答案:定义表areas,结构如下
- id
- atitle
- pid
- 因为省没有所属的省份,所以可以填写为null
- 城市所属的省份pid,填写省所对应的编号id
这就是自关联,表中的某一列,关联了这个表的另外一列,但是他们的业务逻辑含义是不一样的,城市信息的pid引用的是省信息的id
- 在这个表中,结构不变,可以添加区县、乡镇街道、村社区等信息
- 创建areas表的语句如下:
create table areas(
aid int primary key,
atitle varchar(20),
pid int
foreign key(pid) references areas(id)
);
- 以sql文件导入数据
source areas.sql;
- 查询一共有多少个省
select count(*) from areas where pid is null;
- 查询省得名称为''山西省"的所有城市
select city * from areas as city
inner join areas as provinces on city.pid=provinces.aid
where province.atitle = "山西省";
- 查询市的名称为"广州市"的所有区县
select dis.* from areas as dis
inner join areas as city on city.aid=dis.pid
where city.atitle = "广州市";