文章目录

  • 1. 自关联定义
  • 2. 自关联举例
    • 2.1. 需求
    • 2.2. 设计
    • 2.3. 简化
    • 2.4. 结论
  • 3. MySQL实现
    • 3.1. 创建数据表
    • 3.2. 批量插入数据
    • 3.3. 演练

1. 自关联定义

所谓自关联是指,一个数据表中的某个字段关联了该数据表中的另外一个字段。

2. 自关联举例

下面我们通过设计一套数据表,实现一个具体需求,来通俗解释什么叫自关联。

2.1. 需求

假设现在需要设计一套数据表,使这套数据表可以通过结构化的方式存储全国的省、市、区/县的名称和层级从属关系。如:安徽省–>合肥市–>包河区;江苏省–>南京市–>江宁区等。

2.2. 设计

首先,第一反应是按照上述三个行政层级分别创建一个数据表,即省级信息数据表、市级信息数据表、区/县级数据表,对于省级信息数据表,如表1所示:

表1 省级信息数据表

id 省份
1 安徽省
2 江苏省
3 江西省

对于市级信息表,因为要体现市和省的层级关系,在市级信息数据表2中加了parent_id字段,该字段存储了表1对应省的主键,如景德镇市隶属于江西省,则其parent_id取值为江西在表1中的id值3。

表2 市级信息数据表

id parent_id
1 合肥市 1
2 安庆市 1
3 南京市 2
4 无锡市 2
5 南昌市 3
6 景德镇市 3

对于区/县级信息数据表,类似于表2设计得到了表3,即表3中字段parent_id存储了表2中对应市的主键。

表3 区/县级信息数据表

id 区/县 parent_id
1 包河区 1
2 庐阳区 1
3 宿松县 2
4 望江县 2
5 江宁区 3
6 雨花台区 3
7 崇安区 4
8 北塘区 4

2.3. 简化

上述的设计最终将产生3张数据表,实际使用时可能较为复杂,而且如果后续希望将地区信息进一步细化,如:区/县下设乡镇,乡镇下设村等,则会进一步增加数据表数量。

鉴于上述考虑,我们思考是否可以仅通过一张数据表实现所有层级数据的存储。通过观察表1、2、3我们发现,其格式都可以统一为表4所示,只是对于表1,可以将parent_id全部视为null。

表4 行政层级统一数据表

id 行政层级名称 parent_id

基于表4的设计,我们可以将表1、2、3合并为表5,即:

表5 行政区域信息统一数据表

id 行政区域名称 parent_id
1 安徽省 null
2 江苏省 null
3 江西省 null
4 合肥市 1
5 安庆市 1
6 南京市 2
7 无锡市 2
8 南昌市 3
9 景德镇市 3
10 包河区 4
11 庐阳区 4
12 宿松县 5
13 望江县 5
14 江宁区 6

2.4. 结论

如表5所示,第9条数据中,parent_id为3,即取值为江西省的id值。则表5中字段id和parent_id之间即构成了自关联

3. MySQL实现

3.1. 创建数据表

按照表5结构在数据库test(此处创建数据库过程省略,具体请见MySQL数据库入门(2)——数据库操作基础)中创建一个名为areas的数据表。

create table areas(id int primary key,title varchar(20),parent_id int);

3.2. 批量插入数据

  • 数据准备
    所需批量数据请见中国省市插入sql语句,请将所有数据复制到txt文件后,将.txt后缀更改为.sql。
  • 插入准备
    首先按照下图所示做好数据批量插入的准备。
  • 批量插入
    在mysql>后输入以下语句,从而实现数据批量插入。
source areas.sql

3.3. 演练

-- 查询数据表areas,确定所有parent_id字段为null的记录,即全国的省级行政区域。
select * from areas where parent_id is null;

-- 查询数据表areas,确定安徽省的所有市级行政区域
-- 第一步:查询出安徽省的id字段值
select id from areas where title="安徽省";
-- 第二部:根据安徽省的id字段值,查询出安徽省的所有市级行政区域
select * from areas where parent_id=340000;


上述案例通过两条SQL语句实现了需求,即:先通过一条SQL语句查询areas表获取了安徽省的字段id值,然后基于表5的特征,即市级行政区域的parent_id等于省级行政区域的id,从而得出结果。

下面考虑如何仅通过一条SQL语句实现相同功能,问题在于此处仅有一张数据表,如果省级行政区域和市级行政区域各有一张表,则可以通过MySQL数据库入门(3)——数据库查询操作中学习过连接查询实现,即使用类似以下的SQL语句实现。

-- 假设有两张数据表,分别为province和city,且其结构都如表5所示
select province inner join city on province.id=city.id having province.title="安徽省";

基于上述考虑,即使现在只有一个统一的数据表情况下,也可以实现上述需求,因为可以将数据表areas同时使用两次,分别作为内连接查询语句的左表和右表,即:

-- 将数据表areas分别取别名province和city
select * from areas as province inner join areas as city on city.parent_id=province.id having province.title="安徽省";

【MySQL数据库入门】自关联相关推荐

  1. mysql数据库入门教程(11):视图讲解大全

    一.视图的介绍 含义:虚拟表,和普通表一样使用 mysql5.1版本出现的新特性,是通过表动态生成的数据 举例说明什么是视图:假设一个年级有10个班,上面有领导来啦,说要检查舞蹈功底,学校为了应付检查 ...

  2. mysql数据库入门教程(6):数据的增删改

    前面两篇博文介绍了数据库的查询 mysql数据库入门教程(4):查询讲解大全 mysql数据库入门教程(5):多表操作(连接查询,子查询,分页查询,联合查询) 今天介绍下数据库的增删改. 数据库基本操 ...

  3. mysql数据库入门教程(5):多表操作(连接查询,子查询,分页查询,联合查询)

    前文介绍了单表查询:mysql数据库入门教程(4):查询讲解大全 今天介绍下多表查询 一.连接查询 含义:又称多表查询,当查询的字段来自于多个表时,就会用到连接查询 先送上下面所讲用到的sql脚本 h ...

  4. Python连接Mysql数据库入门

    Python 连接mysql数据库入门教程 直接上代码 数据库建表省略 要执行哪段代码把#去掉即可:有文字解释 难度 : ⭐⭐(全星5颗星的情况下) import pymysql # 导入模块 根据P ...

  5. MySQL数据库入门到高薪培训教程(从MySQL 5.7 到 MySQL 8.0)

    一.MySQL数据库入门到高薪培训视频教程(从MySQL5.7到MySQL8.0) 本套MySQL学习教程地址: https://edu.51cto.com/course/18034.html 为满足 ...

  6. MySQL数据库入门(三)--- 查询、权限、join语法、外键、备份

    MySQL数据库入门(三) 文章目录 MySQL数据库入门(三) @[toc] MySQL回顾 查询: 查看字段 权限管理 查询权限 授权查询 多表查询 join语法 外键 备份: 指定时间段备份: ...

  7. pythonmysql数据分析_Python操作Mysql数据库入门——数据导入pandas(数据分析准备)...

    原标题:Python操作Mysql数据库入门--数据导入pandas(数据分析准备) 欢迎关注天善智能 hellobi.com,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区,学习.问答.求 ...

  8. mysql数据库入门 3 +每日一问

    mysql数据库入门 3 ++++++++++++DAB1_day03 一.数据导入导出 修改搜索路径 ]# mkdir /myload ]# chown mysql /myload ]# vim / ...

  9. centos7 mysql创建表_CentOS7 MySQL数据库入门 小白必看

    昨天网盾科技发布的一篇关于CentOS7配置ssh的文章,有很多小伙伴都收藏了,想必是对大家很有帮助,那么今天网盾科技再给大家分享一篇关于CentOS7配置MySQL数据库入门的文章,小白必看哟! l ...

最新文章

  1. bzoj 2588 Spoj 10628. Count on a tree (可持久化线段树)
  2. 如何修改Web Interface4.5多语言版的版权信息
  3. spring boot整合JPA实现多条件查询并分页
  4. java ee4.8下载_在WildFly 8.2中修补焊接3 – Java EE 8的第一个实验RI
  5. restfull服务器端获取文件,使用 FileREST API (获取文件服务) - Azure 文件存储 | Microsoft Docs...
  6. 条款十一: 为需要动态分配内存的类声明一个拷贝构造函数和一个拷贝赋值运算符...
  7. Hibernate之一对一映射
  8. 090717 T OOD时的接口
  9. datagrid删除所有行卡住_MySQL ------ 删除数据(DELETE) (二十二)
  10. AVPlayer添加播放进度监听
  11. 2016集训队论文吉如一
  12. 【论文笔记】Imagenet-trained cnns are Biased towards Texture; Increasing Shape Bias Improves accuracy
  13. 《ffmpeg入门学习》 五 多个图片合成一张图片
  14. Linux中docker的使用
  15. VB计算汉字笔画数代码
  16. 图文并解Word插入修改删除批注
  17. Dnguard旗舰版代加密加壳服务 20/次
  18. 修改自己电脑连接的路由器的配置网址192.168.1.1
  19. easy excel date 类型解析报错_两个日期相差多少天,你还在一天天的数吗?用Excel轻松完成计算...
  20. 我的一次实习经历总结

热门文章

  1. Description 输入3个数,代表三角形的三条边长,判断这三条边是否能构成三角形,如果能, 计算并输出三角形的面积,否则输出NO。 Input 输入包括多组测试数据,每组有三个数,中间用空格隔开
  2. PyCharm Professional 2018版的破解方法
  3. IntelliJ IDEA 控制台中文乱码和错误: 非法字符: ‘\ufeff‘
  4. 编译性语言和解释性语言的区别
  5. 三级文明的代码_文明6作弊码介绍 文明6作弊代码秘籍一览
  6. 2500元左右性价比最高的手机2023 2500元手机排行榜前十名
  7. 挑战全网最详细靶机教程——vulnhub靶机实战vulnhub Tr0ll: 1【适合刚接触的新人学习】
  8. 计算机桌面位置在哪显示器,笔记本电脑怎么截取屏幕 笔记本截图位置在哪
  9. 1) 以实现用户在桌面上存储的资料不会因为用户改变计算机而消失.,2014年计算机软考程序员考前模拟试题及答案...
  10. python内置函数 enumerate用法