关于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. 编程菜鸟的日记-初学尝试编程-C++ Primer Plus 第5章编程练习5

    #include <iostream>using namespace std;const MAXSIZE=12;const year=3;int main(){ char *month[M ...

  2. idea搜索jar中的类

    ctrl+n快捷键

  3. HBuilder 的使用

    创建一个nui项目 打开index.html才能运行 查看夜神模拟器 创建App标题:mhe :在body中输入mhe让后回车,如果右侧不显示,Ctrl+s保存一下 创建标题:mhe 创建九宫格:mb ...

  4. NOIP-无线网路发射器选址

    题目描述 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的129条东西向街道和129条南北向街道所形成的网格状,并且相邻的平 ...

  5. Vue(二十五)打包后路径报错问题

    1.修改 config - index.js 2.修改 build - utils.js

  6. 切换controller 后面的最好不要用id参数,不然会根据路由规则改变

    //切换actionResult             return RedirectToAction("Edit", "EngineeringCase",  ...

  7. xampp+discuz 安装踩坑后总结

    之前安装xampp先是出现mysql无法启动,接着安装discuz到最后一部时出现乱码,以及报错(0).后来卸载了xampp,重新安装xampp和discuz后就可以了,应该是版本太高的问题, xam ...

  8. LeetCode 169 Majority Element 解题报告

    题目要求 Given an array of size n, find the majority element. The majority element is the element that a ...

  9. linux自定义开机自启多个服务的脚本

    linux服务器重启后,每次要启动redis.ftp.tomcat等应用总是很麻烦,于是写了一个自定义脚本,在开机或重启的时候,自动启动多个服务.应用. 很简单,写脚本.设置开机启动.   第一步.准 ...

  10. Flask 接入第三方云通讯平台时出现 {‘172001’:’网络错误’}

    错误:{‘172001’:’网络错误’},经过上网查找原因,原来是 Python 升级到 2.7.9 之后引入了一个新特性,当打开一个 https 链接时,会验证一次 SSL 证书.而当目标网站使用的 ...