zoukankan      html  css  js  c++  java
  • MySQL(12):自关联

        1.将省与市的表合成一个大表

        设计省信息的provinces表结构:id、ptitle。

        设计市信息的citys表结构:id、ctitle、proid,citys表的proid表示城市所属的省,对应着provinces表的id值

        (1)问题:能不能将两个表合成一个表呢?

        (2)思考:观察两张表发现,citys表比provinces表多一个列proid,其他的列的类型都是一样的

        (3)意义:存储的都是地区信息,而且每种信息的数据量有限,没必要增加一个新表,或者将来还要存储区、乡镇信息,都增加的话新表的开销太大。

        (4)答案:定义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)    //外键关联同表中其他字段
    );
    


        2.自关联查询的应用

        (1)从sql文件中导入数据

    source areas.sql;    //注意该sql文件名与表名一致

        (2)查询一共有多少个省

    select count(*) from areas where pid is null;

        (3)查询省的名称为山西省的所有城市

    select city.* from areas as city    //此处将areas的别名取做city
    inner join areas as province on city.pid=province.aid    //此处将areas的别名取做province,便于与city进行区分
    where province.atitle='山西省';

        (4)查询市的名称为广州市的所有区县

    select dis.* from areas as dis
    inner join areas as city on city.aid=dis.pid
    where city.atitle='广州市';
  • 相关阅读:
    【文学文娱】《屌丝逆袭》-出任CEO、迎娶白富美、走上人生巅峰
    天纵英才-阿里巴巴《马云》
    我的《大宋王朝》
    《1024 程序员节》—我喂自己袋盐
    【文学文娱】《失控》读后感
    《由河南人--首富许家印说起》
    《将博客搬至CSDN》
    【置顶】技术每天一点点--2017.09-2018.10月
    saltstack的简单搭建
    rabbitMQ基础应用
  • 原文地址:https://www.cnblogs.com/wangchongzhangdan/p/9409604.html
Copyright © 2011-2022 走看看