Membandingkan Baris dalam Tabel yang Sama
Temukan pasangan dan hubungan.
Membandingkan Baris dalam Tabel yang Sama adalah pelajaran SQL Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar SQL Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus SQL Academy mencakup 4 pelajaran total.
Apa Itu Penggabungan Mandiri
Penggabungan mandiri adalah ketika Anda menggabungkan sebuah tabel dengan dirinya sendiri. Hal ini mungkin terdengar tidak biasa pada awalnya, tetapi merupakan teknik yang sangat berguna untuk membandingkan baris dalam tabel yang sama.
Bayangkan tabel employees yang setiap karyawannya memiliki manager_id yang menunjuk ke baris lain dalam tabel yang sama. Penggabungan mandiri memungkinkan Anda mencocokkan setiap karyawan dengan manajernya dalam satu kueri.
Menyiapkan Tabel Contoh
Mari kita buat tabel employees sederhana untuk digunakan sepanjang pelajaran ini. Setiap baris memiliki id, name, salary, dan manager_id yang merujuk ke karyawan lain dalam tabel yang sama.
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(50),
salary INT,
manager_id INT
);
INSERT INTO employees VALUES
(1, 'Alice', 90000, NULL),
(2, 'Bob', 70000, 1),
(3, 'Carol', 65000, 1),
(4, 'Dave', 55000, 2),
(5, 'Eve', 60000, 2),
(6, 'Frank', 48000, 3);Sintaks Dasar Penggabungan Mandiri
Untuk melakukan penggabungan mandiri, rujuk tabel yang sama dua kali menggunakan dua nama alternatif yang berbeda. Nama alternatif tersebut berfungsi seolah-olah Anda memiliki dua salinan tabel yang terpisah. Selanjutnya, tentukan kondisi penggabungan yang menghubungkan kedua salinan tersebut.
Di sini kita memberi nama alternatif e (karyawan) dan m (manajer) pada employees, lalu mencocokkannya berdasarkan e.manager_id = m.id.
SELECT
e.name AS employee,
m.name AS manager
FROM employees e
JOIN employees m ON e.manager_id = m.id;Menyertakan Baris Tingkat Teratas dengan LEFT JOIN
INNER JOIN biasa menghapus baris yang manager_id-nya bernilai NULL, yang berarti karyawan tingkat teratas (Alice, sang CEO) akan dikecualikan dari hasil.
Gunakan LEFT JOIN agar setiap karyawan muncul, termasuk mereka yang tidak memiliki manajer. Kolom manajer akan berisi NULL untuk mereka.
SELECT
e.name AS employee,
m.name AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id
ORDER BY m.name NULLS LAST, e.name;Menemukan Pasangan yang Memiliki Sifat yang Sama
Penggabungan mandiri juga berguna untuk menemukan pasangan baris yang memiliki suatu nilai yang sama. Misalnya, Anda dapat menemukan semua pasangan karyawan yang melapor kepada manajer yang sama.
Kondisi a.id < b.id mencegah pasangan duplikat seperti (Bob, Carol) dan (Carol, Bob) muncul bersamaan dalam hasil.
SELECT
a.name AS employee_1,
b.name AS employee_2,
a.manager_id AS shared_manager
FROM employees a
JOIN employees b
ON a.manager_id = b.manager_id
AND a.id < b.id;Membandingkan Gaji Antarbaris
Anda dapat menggunakan penggabungan mandiri untuk membandingkan nilai numerik antarbaris. Kueri di bawah ini menemukan setiap karyawan yang gajinya lebih tinggi daripada gaji manajernya sendiri—sebuah pemeriksaan analitis klasik.
SELECT
e.name AS employee,
e.salary AS emp_salary,
m.name AS manager,
m.salary AS mgr_salary
FROM employees e
JOIN employees m ON e.manager_id = m.id
WHERE e.salary > m.salary;Menemukan Baris Tanpa Kecocokan
Penggabungan mandiri dengan LEFT JOIN dan pemeriksaan WHERE ... IS NULL memungkinkan Anda menemukan baris yang tidak memiliki pasangan yang cocok. Di sini kita menemukan karyawan yang tidak memiliki siapa pun yang melapor kepada mereka—simpul daun dalam hierarki.
SELECT e.name AS employee
FROM employees e
LEFT JOIN employees sub ON sub.manager_id = e.id
WHERE sub.id IS NULL
ORDER BY e.name;Menghitung Bawahan Langsung
Dengan menggabungkan tabel dengan dirinya sendiri dan mengelompokkan berdasarkan sisi manajer, Anda dapat menghitung jumlah bawahan langsung yang dimiliki setiap manajer. Karyawan tanpa bawahan tetap disertakan melalui LEFT JOIN.
SELECT
m.name AS manager,
COUNT(e.id) AS direct_reports
FROM employees m
LEFT JOIN employees e ON e.manager_id = m.id
GROUP BY m.id, m.name
ORDER BY direct_reports DESC;Menggunakan CTE untuk Memperjelas Penggabungan Mandiri
Ketika kueri penggabungan mandiri menjadi rumit, membungkusnya dalam Ekspresi Tabel Umum (CTE) membuat logikanya lebih mudah dibaca. Definisikan satu CTE untuk hierarki, lalu kueri CTE tersebut dengan jelas.
WITH hierarchy AS (
SELECT
e.id AS emp_id,
e.name AS employee,
e.salary AS emp_salary,
m.name AS manager,
m.salary AS mgr_salary
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id
)
SELECT *
FROM hierarchy
WHERE mgr_salary IS NOT NULL
AND emp_salary > mgr_salary;Penggabungan Mandiri pada Tabel Nonhierarkis
Penggabungan mandiri tidak terbatas pada hierarki manajer-karyawan. Contoh di bawah ini menggunakan tabel products untuk menemukan semua pasangan produk yang termasuk dalam kategori yang sama, yang berguna untuk mesin rekomendasi atau pemeriksaan kemiripan.
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(50),
category VARCHAR(30)
);
INSERT INTO products VALUES
(1, 'Laptop', 'Electronics'),
(2, 'Phone', 'Electronics'),
(3, 'Tablet', 'Electronics'),
(4, 'Shirt', 'Clothing'),
(5, 'Jeans', 'Clothing');
SELECT
a.name AS product_1,
b.name AS product_2,
a.category
FROM products a
JOIN products b
ON a.category = b.category
AND a.id < b.id;Kesalahan Umum: Produk Kartesius dan Duplikat
Dua kesalahan umum dalam penggabungan mandiri adalah produk Kartesius (sama sekali lupa menuliskan kondisi penggabungan) dan pasangan duplikat (menggunakan a.id <> b.id alih-alih a.id < b.id).
Selalu pastikan kondisi penggabungan Anda benar dan gunakan <, bukan <>, ketika Anda hanya memerlukan pasangan tanpa urutan, bukan pasangan berurutan.
-- Wrong: returns every ordered pair (A,B) AND (B,A)
SELECT a.name, b.name
FROM employees a
JOIN employees b ON a.manager_id = b.manager_id
AND a.id <> b.id;
-- Correct: returns each unordered pair once
SELECT a.name, b.name
FROM employees a
JOIN employees b ON a.manager_id = b.manager_id
AND a.id < b.id;Pemeriksaan Singkat
Uji pemahaman Anda tentang penggabungan mandiri dan perbandingan baris dalam tabel yang sama.
Ringkasan Pelajaran
Dalam pelajaran ini, Anda mempelajari cara menggunakan penggabungan mandiri untuk membandingkan baris dalam tabel yang sama.
Hal-hal penting:
- Buat alias untuk tabel dua kali (misalnya,
edanm) agar basis data memperlakukannya sebagai sumber yang terpisah. - Gunakan
INNER JOINsaat Anda hanya memerlukan baris yang memiliki pasangan, dan gunakanLEFT JOINsaat Anda juga ingin menyertakan baris tanpa pasangan. - Gunakan
a.id < b.iduntuk menghindari pasangan tanpa urutan yang duplikat. - Penggabungan mandiri berguna untuk hierarki (manajer/karyawan), pencarian kemiripan (kategori yang sama), dan perbandingan apa pun yang mengharuskan dua baris dalam tabel yang sama saling terkait.
- CTE dapat membuat kueri penggabungan mandiri yang rumit jauh lebih mudah dibaca dan dipelihara.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Membandingkan Baris dalam Tabel yang Sama” gratis?
Ya — teks lengkap “Membandingkan Baris dalam Tabel yang Sama” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus SQL Academy, upgrade ke CoddyKit PRO. Kursus SQL Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Membandingkan Baris dalam Tabel yang Sama”?
Temukan pasangan dan hubungan. Kamu berlatih SQL Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai SQL Academy?
Tidak diperlukan pengalaman sebelumnya. SQL Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Membandingkan Baris dalam Tabel yang Sama” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran SQL Academy ini?
Ya. Setiap pelajaran SQL Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Apa Itu Self JOIN
- Karyawan dan Manajer
- Membandingkan Baris dalam Tabel yang Sama
- Batasan Self JOIN