欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MySQL查询:自关联查询

程序员文章站 2022-08-18 09:38:54
设计省信息的表结构provincesidtitleproid设计市信息的表结构citysidtitleproid设计区县信息表结构areasidtitleproidtitle表示名称,proid表示所属上一级的id值,比如citys.proid 是对应所属省份的id,areas.proid对应的是所属城市的id值问题:能不能将三个表合成一张表呢?思考:观察三张表发现,表的结构都是一样的,存储的都是...
  • 设计省信息的表结构provinces
    • id
    • title
    • proid
  • 设计市信息的表结构citys

    • id
    • title
    • proid
  • 设计区县信息表结构areas

    • id
    • title
    • proid
  • title表示名称,proid表示所属上一级的id值,比如citys.proid 是对应所属省份的id,areas.proid对应的是所属城市的id值

问题:

能不能将三个表合成一张表呢?

思考:

观察三张表发现,表的结构都是一样的,存储的都是地区信息,而且每种信息的数据量有限

意义:

假如合成一张表,即可减少创建表的开销,也用不着多个表关联查询

答案:

定义表areas,结构如下

  • id
  • atitle
  • pid

说明:

  • 因为省没有所属的省份,所以可以填写为null
  • 城市所属的省份pid,填写省所对应的编号id
  • 区县所属的城市pid,填写城市所对应的编号id
  • 这就是自关联,表中的某一列,关联了这个表中的另外一列,但是它们的业务逻辑含义是不一样的,城市信息的pid引用的是省信息的id

创建areas表的语句如下:

create table areas(
    aid int primary key,
    atitle varchar(20),
    pid int
);
  • 从sql文件中导入数据
source areas.sql;
  • 查询一共有多少个省
select count(*) from areas where pid is null;
  • 例1:查询省的名称为“山西省”的所有城市
select city.* from areas as city
inner join areas as province on city.pid=province.aid
where province.atitle='山西省';
  • 例2:查询市的名称为“广州市”的所有区县
select dis.* from areas as dis
inner join areas as city on city.aid=dis.pid
where city.atitle='广州市';

本文地址:https://blog.csdn.net/qq_36658051/article/details/110631615

相关标签: MySQL