Self join là ghép một bảng với chính nó — dùng hai bí danh (alias) khác nhau cho cùng bảng như thể là hai bảng riêng. Dùng khi các hàng trong cùng một bảng có quan hệ với nhau.
Ví dụ kinh điển — quan hệ nhân viên–quản lý (cả hai đều là hàng của employees, quản lý được trỏ bằng manager_id):
SELECT e.name AS employee, m.name AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;(Dùng LEFT JOIN để giữ cả người không có quản lý — vd CEO.)
Các tình huống hay dùng:
- Cấu trúc phân cấp trong một bảng: nhân viên–sếp, danh mục cha–con.
- Tìm cặp hàng liên quan: hai sản phẩm cùng giá, hai người cùng thành phố (a.id < b.id để tránh trùng cặp và tự-ghép).
Bản chất chỉ là JOIN bình thường; điểm khác duy nhất là bắt buộc dùng alias để phân biệt hai "bản sao" của bảng. Quan hệ phân cấp sâu/không giới hạn cấp thì cần recursive CTE thay vì self join một tầng.