关于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. Python 之map、filter、reduce

    MAP 1.Python中的map().filter().reduce() 这三个是应用于序列的内置函数,这个序列包括list.tuple.str. 格式: 1>map(func,swq1[,s ...

  2. Cmake知识----编写CMakeLists.txt文件编译C/C++程序

    1.CMake编译原理 CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多.CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt ...

  3. __x__(39)0909第五天__ 表格 table

    表格 表示一种格式化的数据,如课程表,银行对账单... ... 在网页中,使用 table 创建一个表格. html代码: <!doctype html> <html> < ...

  4. macos解决Hadoop之Unable to load native-hadoop library

    很显然,native-hadoop library不支持macos,如果是Linux就不会有这个问题.在百度上搜了,要下载在macos上编译的native hadoop library,我在网上下载了 ...

  5. [LeetCode] Card Flipping Game 翻卡片游戏

    On a table are N cards, with a positive integer printed on the front and back of each card (possibly ...

  6. Reward List 赏金列表

    博主昨晚正在刷题,突然手机语音大声提示“微信支付收款到账”,把博主吓了一跳,打开一看,居然收到了第一笔打赏,还是博主最喜欢的数字,老开心了-感谢网友对于博主工作的认可与支持,多谢多谢!不管大家是物质打 ...

  7. Red hat查找命令所属的rpm包

    当安装命令软件包时,很多时候命令名不一定就是软件包的名字 如scp命令,其命令名就和软件包名字不一样,直接安装会失败: #yum install scp .... Trying other mirro ...

  8. 总结:极光推送java服务端(1)

    遇到的问题: 1.怎么用极光推送 2.极光推送发送失败报错 返回{ } 3.透传和推送区别以及怎么设置 我的解决方案: 问题1.极光推送类里面有不同的方法,需要发给那些人就调用相应的方法.有安卓.io ...

  9. java 实现文件上传下载以及查看

    项目的目录结构 代码  IOUtils.java package cn.edu.zyt.util; import java.io.IOException; import java.io.InputSt ...

  10. C语言复习0_准备工作

    前言: 第一次接触C语言是大一下学期的时候,2013年上半年,那个时候的开发工具还是VS C++,今天了解了一下,常用的开发工具变成了CodeBlocks.决定趁着毕业到入职这一段CD时间,拾起这门语 ...