自連接是連接的一種用法,但並不是連接的一種類型,因為他的本質是把一張表當成兩張表來使用。
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;
查詢的結果:
上面的是一張職員信息表,如果我要查詢這張表中的每個職員的上司,那么必須使用自連接來查詢.所以為了能實現這個查詢,需要給這張表取兩個別名,而且查詢中所用的所有數據都需要加上表的別名前綴,因為兩個表的數據列完全一樣.
尾言:萬事開頭難,中間難,最后都很難!!!