關於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.總結
如果想要對單個表格進行查詢,那麽自聯結其實比自查詢的效率要高很多,當我們要查詢當個表中的數據的時候,查詢又較為復雜的時候,那麽自聯結就能夠派上用場了,但是要註意自聯結的過濾條件和字段的選擇。
關於MySQL中的自聯結的通俗理解