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

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


  • 前言:最近在通过SQL必知必会这本书学习MySQL的基本使用,在学习中也或多或少遇到了点问题,我也正好分享给大家,我的这篇博客用到的所有案例都是来自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 select c1.cust_name,c1.cust_country
2 from customers c1,customers c2
3 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_id这一主键作为联结字段
2 select o1.cust_name,o1.cust_contact,o1.cust_id
3 from customers o1, customers o2
4 where o1.cust_id = o2.cust_id and o2.cust_contact = 'Jim Jones';

  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;


     3.总结

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


 

猜你喜欢

转载自www.cnblogs.com/JNovice/p/9568818.html