关于MySQL中的自联结的通俗理解


  • 前言:最近在通过SQL必知必会这本书学习MySQL的基本使用,在学习中也或多或少遇到了点问题,我也正好分享给大家,我的这篇博客用到的所有表格的代码都是来自SQL必知必会的官方下载地址,但是其理解都是自己的原创没有任何抄袭,SQL必知必会的代码有兴趣的朋友可以前去下载

一、基本概念


(一) SQL的概述

  SQL,英文全称叫Structured Query Language,是结构化查询语言的意思,结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以具有完全不同底层结构的不同数据库系统, 可以使用相同的结构化查询语言作为数据输入与管理的接口。结构化查询语言语句可以嵌套,这使它具有极大的灵活性和强大的功能。(摘自百度百科)

(二) MySQL的概述

  MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。(摘自百度百科)

(三) 联结和自联结

  联结:其实联结的意思很容易理解,就是将两个表的列结合到一起,形成一个新的表,那么此时就是说两个表进行了联结。因为一个表的数据可能很有限,为了能够获得更多的数据并且将这些列放在一起,那么此时就需要联结。联结一般是需要有联结字段的。

  自联结:自联结字面的意思就是,自己和自己联结。此时联结所用到的表只有一张,此时我们可以把自联结想象成两张一模一样的表在进行联结。

二、自联结的心得体会


自联结的原理解释和可能出现的问题

    1.自联结的原理解释,为此我准备了两张一模一样的表格,进行模拟自联结的进行

表格演示

代码演示

 1 -- 以下是该表的字段信息
2 CREATE TABLE `customers` (
3 `cust_id` CHAR ( 10 ) NOT NULL,
4 `cust_name` CHAR ( 50 ) NOT NULL,
5 `cust_address` CHAR ( 50 ) DEFAULT NULL,
6 `cust_city` CHAR ( 50 ) DEFAULT NULL,
7 `cust_state` CHAR ( 5 ) DEFAULT NULL,
8 `cust_zip` CHAR ( 10 ) DEFAULT NULL,
9 `cust_country` CHAR ( 50 ) DEFAULT NULL,
10 `cust_contact` CHAR ( 50 ) DEFAULT NULL,
11 `cust_email` CHAR ( 255 ) DEFAULT NULL,
12 PRIMARY KEY ( `cust_id` )
13 ) ENGINE = INNODB DEFAULT CHARSET = utf8

    1)自联结的一张表的代码演示和查询结果

  代码演示

1 -- 以下的代码是在同一张表上进行的真正的自联结
2 select c1.cust_name,c1.cust_country
3 from customers c1,customers c2
4 where c1.cust_country = c2.cust_country and c2.cust_contact = 'Michelle Green'; 

  查询结果

2)模拟自联结的两张表进行联结的代码演示和查询结果

  代码演示 

1 -- 以下代码里面是两个一样的表,另外一个表叫customers_copy是对原表的备份
2 select c1.cust_name,c1.cust_country
3 from customers c1,customers_copy c2
4 where c1.cust_country = c2.cust_country and c2.cust_contact = 'Michelle Green';

  查询结果

3)总结

  我们会发现查询的结果是一样的,那么我们就可以简单地认为自联结查询和两张一样的表进行联结的效果等同,但是其实我不了解其底层实现,所以也不敢说他们肯定是一样,我只能说可能效果上是相似的。


    2.自联结可能出现的问题

1)自联结的没有充分过滤

  A 自联结没有充分过滤条件的代码演示

1 -- 以下仅仅使用了cust_name这一包含重复信息的字段进行了联结,但是没有再多加条件进行二次过滤,可能出现笛卡尔积的类似错误,得到错误的信息
2 select o1.cust_name,o1.cust_contact,o1.cust_id
3 from customers o1, customers o2
4 where o1.cust_name = o2.cust_name;

演示结果,出现了四个Fun4All,其实我们的原表就只有两个Fun4All这样的结果就是出现了垃圾信息

  B 自联结进行了过滤的代码演示

1 -- 以下的代码也是使用了cust_name作为联结字段,但是加了一个过滤条件,那么得到的结果就更为正确
2 select o1.cust_name,o1.cust_contact,o1.cust_id
3 from customers o1, customers o2
4 where o1.cust_name = o2.cust_name and o2.cust_contact = 'Jim Jones';

演示结果,添加了双重过滤之后,表格的结果就更加正确,没有更多的垃圾或者错误的信息


    2)总结

      如果想要对单个表格进行查询,那么自联结其实比自查询的效率要高很多,当我们要查询单个表中的数据的时候,查询又较为复杂的时候,那么自联结就能够派上用场了,但是要注意自联结的过滤条件和字段的选择。

关于MySQL中的自联结的通俗理解的更多相关文章

  1. mysql中not exists的简单理解

    http://www.cnblogs.com/glory-jzx/archive/2012/07/19/2599215.html http://sunxiaqw.blog.163.com/blog/s ...

  2. Effective Java通俗理解(持续更新)

    这篇博客是Java经典书籍<Effective Java(第二版)>的读书笔记,此书共有78条关于编写高质量Java代码的建议,我会试着逐一对其进行更为通俗易懂地讲解,故此篇博客的更新大约 ...

  3. Effective Java通俗理解(上)

    这篇博客是Java经典书籍<Effective Java(第二版)>的读书笔记,此书共有78条关于编写高质量Java代码的建议,我会试着逐一对其进行更为通俗易懂地讲解,故此篇博客的更新大约 ...

  4. 3个问题:MySQL 中 character set 与 collation 的理解;utf8_general_ci 与 utf8_unicode_ci 区别;uft8mb4 默认collation:utf8mb4_0900_ai_ci 的含义

    MySQL 中 character set 与 collation 的理解 出处:https://www.cnblogs.com/EasonJim/p/8128196.html 推荐: 编码使用 uf ...

  5. 我对数据库事务的理解(MYSQL中)

    -- 设置数据库事务为手动的提交SET @@AUTOCOMMIT = 0;-- 查看是否被修改SELECT @@autocommit;-- 查看当前的编码格式SELECT @@character_se ...

  6. 如何理解 MySQL 中的 <=> 操作符?

    问题 : 我在看以前的一个开发者的代码时看到 WHERE p.name <=> NULL 在这个查询语句中 <=>符号是什么意思啊?是不是和 =号是一样啊?还是一个语法错误啊? ...

  7. PHP+MySQL中对UTF-8,UTF8(utf8),set names gbk 的理解

    问题一:在我们进行数据库操作时会发现,数据库中表的编码用的是utf-8,但是在进行dos命令是要使用set names gbk (一)Mysql中默认字符集设置有四级:服务器级,数据库级,表级,和字段 ...

  8. MySQL中group_concat函数深入理解

    本文通过实例介绍了MySQL中的group_concat函数的使用方法,比如select group_concat(name) . 一.MySQL中group_concat函数 完整的语法如下: gr ...

  9. 正确理解MySQL中的where和having的区别

    原文:https://blog.csdn.net/yexudengzhidao/article/details/54924471 以前在学校里学习过SQLserver数据库,发现学习的都是皮毛,今天以 ...

随机推荐

  1. django——模型层之多表操作

    django的多表操作 1.使用场景 在实际生产过程多,我们面对的数据纷繁复杂,此时就需要良好的数据结构设计,多表之间的约束关系为我们提供了数据管理以及查询的便利.在MYsql中我们利用外键(fore ...

  2. Json.NET Performance Tips

    原文: http://www.newtonsoft.com/json/help/html/Performance.htm To keep an application consistently fas ...

  3. 一次Spring Bean初始化顺序问题排查记录

    最近在使用Springboot的时候需要通过静态的方法获取到Spring容器托管的bean对象,参照一些博文里写的,新建了个类,并实现ApplicationContextAware接口.代码大致如下: ...

  4. Python Learning - One

    ## Create a directory each day, and can create files in the directory. 1. variable 2. comments 1) # ...

  5. yii2 gridview checkbox

    给checkbox(在GridView里的)添加一个value 控制器:$dataProvidermStu->key = "student_no"; view:[ 'clas ...

  6. go 并发编程(1)

    优雅的并发编程范式,完善的并发支持,出色的并发性能是go语言区别于其他语言的一大特色. 1.并发基础 win和linux 出现之前,程序员并没有并发的概念.因为命令式程序设计语言是以串行为基础的,程序 ...

  7. fiddler修改Requests之前的数据和response 之后的数据

    1. 开启抓包 file--->capture traffic 2. 在页面底部黑框输入bpu http://www.runoob.com/?s=mysql 3. 在浏览器URL输入http:/ ...

  8. superset安装配置

    1.安装操作系统依赖 yum -y install vim net-tools yum upgrade python-setuptools yum -y install gcc gcc-c++ lib ...

  9. Spring Boot2.1.3全局跨域

    /** * 配置跨域访问 * * @author Terwer */ @Bean public WebMvcConfigurer corsConfigurer() { return new WebMv ...

  10. oo第二单元作业总结

    oo第二单元博客总结 在第一单元求导结束后,迎来了第二单元的多线程电梯的问题,在本单元前两次作业中个人主要应用两个线程,采用“生产者-消费者”模式和共享数据变量的方式解决问题.在第三次作业中加入多个电 ...