Mysql自連接的一些用法


自連接是連接的一種用法,但並不是連接的一種類型,因為他的本質是把一張表當成兩張表來使用。

mysql有時在信息查詢時需要進行對自身連接(自連接),所以我們需要為表定義別名。

我們舉例說明,下面是商品采購表,我們需要找到采購價格比惠惠高的所有信息。

 

一般情況我們看到這張表我們第一時間用語句進行操作:

 1 SELECT * FROM shoping WHERE price>27 

可想而知,這是有多么簡單,假設你並不知道數據庫表詳細數據或者數據量相當龐大呢?作為一個數據庫管理員,我們就要用別的方式迅速找出所需要的數據。

分步查詢

SELECT price FROM shopping WHERE name='惠惠' //得出price查詢結果為27
SELECT * FROM shopping WHERE price>27

我們可以獲取到如下表信息:

與采用自連接的方式相比,這種方法需要對中間結果進行人工干預,顯然不利於程序中的自動處理操作。

自連接方式:

SELECT b.* 
from shopping as a,shopping as b
where a.name='惠惠'
and a.price<b.price 
order by b.id2018-03-06

獲取到如下表信息:  

 

注意點:

別名 a,b雖然名稱不同,但是同一個表,定義別名的目的是更方便在自身進行刪選。

執行select通過(中間表)所得到的b.*,,就是最終結果。

 

再舉個實例

CREATE TABLE dept( -- 部門表
deptno INT PRIMARY KEY,-- 部門編號
dname VARCHAR(14),-- 部門名稱
loc VARCHAR(13)-- 地點
);
ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO dept VALUES(10, 'Accounting', 'New York') ;
INSERT INTO dept VALUES(20, 'Research', 'Dallas') ;
INSERT INTO dept VALUES(30, 'Sales', 'Chicago') ;
INSERT INTO dept VALUES(40, 'Operations', 'Boston') ;
INSERT INTO dept VALUES(50, 'Admin', 'Washing') ;

CREATE TABLE emp( -- 員工表
empno INT NOT NULL PRIMARY KEY,-- empno員工號
ename VARCHAR(10), -- ename員工姓名
job VARCHAR(10),-- job工作
mgr INT,-- mgr上級人員編號
hiredate DATETIME,-- 受雇日期
sal DOUBLE,-- 薪金
comm DOUBLE,-- 佣金
deptno INT,-- 部門編號
FOREIGN KEY(deptno) REFERENCES dept(deptno)
);
ENGINE=INNODB DEFAULT CHARSET=utf8;

INSERT INTO emp VALUES(7369, 'Smith', 'Clerk',7902, '1980-12-17',800,0,20) ;
INSERT INTO emp VALUES(7499, 'Allen', 'Salesman',7698,'1981-2-20',1600,300,30) ;
INSERT INTO emp VALUES(7844, 'Turner', 'Salesman',7499, '1981-9-8',1500,0,30) ;
INSERT INTO emp VALUES(7698, 'Tom', 'Manager',0, '1981-9-8',6100,600,40) ;
INSERT INTO emp VALUES(7876, 'Adams', 'Clerk',7900, '1987-5-23',1100,0,20) ;
INSERT INTO emp VALUES(7900, 'James', 'Clerk',7698, '1981-12-3',2400,0,30) ;
INSERT INTO emp VALUES(7902, 'Ford', 'Analyst',7698, '1981-12-3',3000,NULL,20) ;
INSERT INTO emp VALUES(7901, 'Kik', 'Clerk',7900, '1981-12-3',1900,0,30) ;

  

  

打開創建好的表:

如果說列出所有員工的姓名及其直接上級的姓名,我們可以通過自連接進行這樣的操作:

SELECT e.ename,(SELECT ename FROM emp d WHERE d.empno=e.mgr) AS boss FROM emp e; 

查詢的結果:

上面的是一張職員信息表,如果我要查詢這張表中的每個職員的上司,那么必須使用自連接來查詢.所以為了能實現這個查詢,需要給這張表取兩個別名,而且查詢中所用的所有數據都需要加上表的別名前綴,因為兩個表的數據列完全一樣.

 

 

 

 

尾言:萬事開頭難,中間難,最后都很難!!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM