关于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. CSS(五)

    定位 关于定位 我们可以使用css的position属性来设置元素的定位类型,postion的设置项如下: relative 生成相对定位元素,元素所占据的文档流的位置不变,元素本身相对文档流的位置进 ...

  2. vscode插件安装失败的解决方案

    在vscode中点击对应插件的install按钮安装,安装失败,软件提示手动安装(manually install). 手动下载vsix安装包,然后点击install from VSIX...,选择v ...

  3. WIN10远程计算机不支持所需的FIPS安全级别解决

    win10系统的电脑在远程xp系统或者其他系统的电脑时,提示错误,远程计算机可能不支持所需的FIPS安全级别,如果出现一以下2种错误,可以解决!   1 第一步:打开win10下的,控制面板 2 第二 ...

  4. java基础 第八章课后习题

    1.什么是二重循环?在内层循环中使用continue和break语句,程序如何跳转? 答:二重循环就是一个循环结构体内又包含另一个完整的循环结构. continue语句跳转时是跳过了内层循环中的剩余语 ...

  5. sql server2012远程连接用IP登陆进入设置步骤

    第一步:把数据库上要设置的设置好. ↑这步是不是要,我也没弄清楚. 第二部是数据库的配置: 你的电脑图标,右击管理. 以上就是所有步骤. 再次登陆成功.

  6. python连接服务器上传文件,后台执行命令

    上传文件 import os import paramikoimport logging from django.core.cache import cache from YunTai import ...

  7. 安晓辉大神的感悟:如果你发现了自己的学习模式,愿意学并且能坚持,我觉得没什么能阻挡你征服软件世界的脚步(对于开发人员来讲,最大的风险是:在职业规划上没有延续性地乱跳槽。时刻要牢记在心的:培养自己的稀缺性) good

    从技术支持中途转战软件开发,如今从事编程工作已十多有余,2014年CSDN博文大赛编程语言组冠军.CSDN Qt论坛的版主安晓辉老师从今天开始,坐镇CSDN社区问答栏目的 第十四期,届时会接受广大网友 ...

  8. 【大数据和云计算技术社区】分库分表技术演进&最佳实践笔记

    1.需求背景 移动互联网时代,海量的用户每天产生海量的数量,这些海量数据远不是一张表能Hold住的.比如 用户表:支付宝8亿,微信10亿.CITIC对公140万,对私8700万. 订单表:美团每天几千 ...

  9. centos7设置静态IP地址

    1.查看IP配置信息 ifconfig 如上图所示,我的em1网卡已配置好 2.编辑em1对应的配置文件,位于/etc/sysconfig/network-scripts/ifcfg-你的网卡名字 操 ...

  10. docker+kibana+filebeat的安装

    安装filebeat服务(在需要收集日志的主机安装filebeat) 下载和安装key文件 rpm --import https://packages.elastic.co/GPG-KEY-elast ...