針對相同的表進行的連接被稱為“自連接”(self join)。
那么為什么要把相同的一張表連接起來呢?一開始還是挺難理解的。把它想象成連接兩張不同的表,這樣容易理解一些。事實上,自連接還是有很多用處的。
自連接的用途:
1,在同一張表內進行比較
例子:查找收入超過各自經理的員工的姓名
Id | Name | Salary | ManagerId ----+-------+--------+----------- 1 | Joe | 70000 | 3 2 | Henry | 80000 | 4 3 | Sam | 60000 | NULL 4 | Max | 90000 | NULL
SELECT e1.Name AS employee_name FROM Employee AS e1, Employee AS e2 WHERE e1.ManagerId=e2.Id AND e1.Salary>e2.Salary
例子:查找比昨天溫度高的所有日期的 Id
| Id(INT) | RecordDate(DATE) | Temperature(INT) | +---------+------------------+------------------+ | 1 | 2015-01-01 | 10 | | 2 | 2015-01-02 | 25 | | 3 | 2015-01-03 | 20 | | 4 | 2015-01-04 | 30 |
SELECT w1.Id FROM weather w1 JOIN weather w2 ON DATEDIFF(w1.RecordDate,w2.RecordDate)=1 WHERE w1.Temperature>w2.Temperature
2,找出列的組合
例子:查找共用同一車站的所有公交路線
SELECT * FROM route R1, route R2
WHERE R1.stop=R2.stop;
3,查找部分內容重復的記錄
例子:查找價格相同但商品名稱不同的商品信息
SELECT DISTINCT P1.name, P1.price FROM Products P1, Products P2 WHERE P1.price = P2.price AND P1.name != P2.name;
例子:刪除 Person 表中所有重復的電子郵箱
| Id | Email | +----+------------------+ | 1 | john@example.com | | 2 | bob@example.com | | 3 | john@example.com |
DELETE p1 FROM Person p1, Person p2 WHERE p1.Email = p2.Email AND p1.Id > p2.Id