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

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

  代码演示

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

  查询结果

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

  代码演示 

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

  查询结果

3)总结

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


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

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

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

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

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

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

  1. 1 -- 以下的代码也是使用了cust_name作为联结字段,但是加了一个过滤条件,那么得到的结果就更为正确
  2. 2 select o1.cust_name,o1.cust_contact,o1.cust_id
  3. 3 from customers o1, customers o2
  4. 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. MVC中EF代码优先问题

    在练习Mvc项目时,提示如下数据库错误: The model backing the 'EFDbContext' context has changed since the database was ...

  2. IOS开发中获取当前WIFI的名字

            ifs = [self fetchSSIDInfo]; ssid = [ifs objectForKey:@"SSID"]; self.sSIDTxt.textFi ...

  3. (59)Wangdao.com第十天_JavaScript 对象在 栈和堆

    对象的属性值 如果要使用特殊的属性名,需 对象["属性名"] = 属性值       // 存 对象["属性名"]       // 取 obj["1 ...

  4. 问题:CMD安装mysql-server遇到找不到MSVCR120.dll问题(已解决)

    今天,我用CMD安装mysql服务器端遇到了找不到msvcr120.dll问题,所以我去网上下载这个dll,但是出现找不到入口,或者什么的.  我想了想,去下载运行时库(因为MSVCR是Microso ...

  5. Android 进程间的通信

    localsocket:   https://blog.csdn.net/azhengye/article/details/73863404 https://www.cnblogs.com/basta ...

  6. Python练手例子(6)

    31.请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母. 程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或if语句判断第二个字母. letter ...

  7. Linux学习笔记(三)

    昨天将计算机概论部分算是看完了,然后我又将后面的内容过了一遍,因为我本身对Linux有一些了解,所以就跳到这文件权限与目录管理配置这章了,话不多说,开始做笔记. Linux文件权限与目录配置 群组 所 ...

  8. 6. Scala面向对象编程(基础部分)

    6.1 基本介绍 6.1.1 Scala语言是面向对象的 1) Java时面向对象的编程语言,由于历史原因,Java中海存在着非面向对象的内容:基本类型,null,静态方法等 2) Scala语言来自 ...

  9. JAVA 第五周学习总结

    20175303 2018-2019-2 <Java程序设计>第五周学习总结 教材学习内容总结 •使用关键字interface来定义一个接口,定义接口分包含接口声明和接口体. •接口体中包 ...

  10. Java代码实现封装多级树结构对象

    前言: 在开发中,我们经常见到,前端展示树状结构的,这时候就需要后端去封装一个多级树结构对象,前端根据这样结构的数据去渲染数据,这篇文章讲的是如何封装成多级树结构对象. 正文: 1.先封装个树结构的对 ...