MySQL查询 8:自关联查询

  • 设计省信息的表结构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='广州市';

猜你喜欢

转载自blog.csdn.net/qq_36658051/article/details/110631615