MySQL中的自關(guān)聯(lián)查詢是指在同一張表中,使用相同的表名將兩個(gè)或多個(gè)表連接起來(lái),以實(shí)現(xiàn)多表查詢或單表查詢的操作。自關(guān)聯(lián)查詢需要在查詢中使用表別名 alias,以便在使用表中的字段時(shí)不產(chǎn)生命名沖突。在MySQL中,自關(guān)聯(lián)查詢的具體實(shí)現(xiàn)方式如下:
SELECT tb1.id, tb2.name FROM test_table as tb1, test_table as tb2 WHERE tb1.id = tb2.pid;
上面的查詢語(yǔ)句使用了表別名tb1和tb2,分別代表了test_table表的兩個(gè)不同實(shí)例,它們之間的關(guān)系通過(guò)WHERE子句的條件tb1.id = tb2.pid來(lái)建立。
接下來(lái),我們來(lái)看一個(gè)具體的例子,該例子將演示如何使用自關(guān)聯(lián)查詢來(lái)查找test_table表中所有部門經(jīng)理的信息。
-- 創(chuàng)建test_table表 CREATE TABLE IF NOT EXISTS test_table ( id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, pid INT UNSIGNED, name VARCHAR(20) NOT NULL, salary FLOAT NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 添加測(cè)試數(shù)據(jù) INSERT INTO test_table (pid, name, salary) VALUES (0, 'A', 1000); INSERT INTO test_table (pid, name, salary) VALUES (1, 'B', 800); INSERT INTO test_table (pid, name, salary) VALUES (1, 'C', 900); INSERT INTO test_table (pid, name, salary) VALUES (2, 'D', 500); INSERT INTO test_table (pid, name, salary) VALUES (2, 'E', 700); INSERT INTO test_table (pid, name, salary) VALUES (3, 'F', 600); -- 使用自關(guān)聯(lián)查詢查找所有的部門經(jīng)理信息 SELECT tb1.id, tb1.name AS manage_name, tb2.name AS employee_name FROM test_table AS tb1, test_table AS tb2 WHERE tb1.id = tb2.pid;
上述查詢結(jié)果將返回如下結(jié)果,其中id為部門經(jīng)理id,manage_name為部門經(jīng)理姓名,employee_name為該部門下的員工姓名:
+----+-------------+---------------+ | id | manage_name | employee_name | +----+-------------+---------------+ | 1 | B | C | | 2 | C | D | | 2 | C | E | | 3 | D | F | +----+-------------+---------------+
在自關(guān)聯(lián)查詢時(shí),需要注意避免出現(xiàn)循環(huán)引用的情況。例如,在上述例子中,如果將tb1.id = tb2.pid修改為tb1.pid = tb2.id,則會(huì)出現(xiàn)循環(huán)引用的情況,導(dǎo)致查詢結(jié)果出現(xiàn)重復(fù)。