0Pricing
SQL Academy · Pelajaran

Menelusuri Pohon Kategori

Perluas pohon induk-anak sepenuhnya.

Menelusuri Pohon Kategori adalah pelajaran SQL Academy gratis di CoddyKit. Ini adalah pelajaran 2 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 Pohon Kategori

Banyak kumpulan data di dunia nyata memiliki hubungan induk-anak. Katalog produk mungkin memiliki kategori seperti Elektronik → Ponsel → Ponsel Cerdas. Setiap simpul memiliki induk sehingga membentuk struktur pohon.

Dalam SQL, data ini biasanya disimpan sebagai tabel yang merujuk dirinya sendiri: setiap baris memiliki id dan parent_id yang menunjuk ke baris lain dalam tabel yang sama.

CREATE TABLE categories (
  id       INT PRIMARY KEY,
  name     VARCHAR(100) NOT NULL,
  parent_id INT REFERENCES categories(id)
);

Contoh Data Kategori

Mari isi sebuah pohon kategori kecil. Simpul akar memiliki parent_id = NULL karena tidak memiliki induk. Setiap simpul lainnya menunjuk ke induknya melalui parent_id yang bernilai bukan NULL.

INSERT INTO categories (id, name, parent_id) VALUES
  (1, 'Electronics',   NULL),
  (2, 'Phones',         1),
  (3, 'Laptops',        1),
  (4, 'Smartphones',    2),
  (5, 'Feature Phones', 2),
  (6, 'Gaming Laptops', 3),
  (7, 'Ultrabooks',     3);

Masalah pada Kueri Sederhana

SELECT biasa hanya dapat mengambil satu tingkat dalam satu waktu. Untuk mencapai kedalaman tiga tingkat, Anda memerlukan tiga kueri terpisah atau tiga penggabungan mandiri, yang menjadi sulit dikelola seiring pohon bertambah besar.

WITH RECURSIVE mengatasi hal ini dengan memungkinkan sebuah kueri merujuk pada keluarannya sendiri dan menelusuri tingkat demi tingkat hingga tidak ada baris baru yang ditemukan.

-- This only shows direct children of Electronics (level 1)
SELECT id, name
FROM   categories
WHERE  parent_id = 1;

Anatomi WITH RECURSIVE

CTE rekursif memiliki dua bagian yang dipisahkan oleh UNION ALL:

1. Bagian jangkar — SELECT biasa yang menyediakan baris awal.

2. Bagian rekursif — SELECT yang menggabungkan kembali CTE dengan dirinya sendiri, lalu menghasilkan tingkat berikutnya pada setiap iterasi.

Mesin mengulangi bagian rekursif hingga tidak menghasilkan baris apa pun.

WITH RECURSIVE cte AS (
  -- Anchor: starting rows
  SELECT ...
  UNION ALL
  -- Recursive: join cte to base table
  SELECT ... FROM base_table JOIN cte ON ...
)
SELECT * FROM cte;

Menelusuri Seluruh Pohon dari Akarnya

Mulailah dari akar (ketika parent_id IS NULL) dan telusuri hingga semua turunannya. Bagian rekursif menggabungkan setiap baris yang telah terkumpul kembali dengan categories berdasarkan hubungan induk-anak.

WITH RECURSIVE category_tree AS (
  -- Anchor: root nodes
  SELECT id, name, parent_id, 1 AS depth
  FROM   categories
  WHERE  parent_id IS NULL

  UNION ALL

  -- Recursive: children of current level
  SELECT c.id, c.name, c.parent_id, ct.depth + 1
  FROM   categories      c
  JOIN   category_tree   ct ON ct.id = c.parent_id
)
SELECT id, name, depth
FROM   category_tree
ORDER  BY depth, id;

Melacak Jalur

Mencatat jalur lengkap dari akar ke setiap simpul akan sangat membantu. Kita dapat membangun teks path dengan menggabungkan nama-nama leluhur saat menelusuri tingkat yang lebih dalam.

Dengan begitu, Anda dapat menampilkan jejak navigasi seperti Elektronik / Ponsel / Ponsel Cerdas dengan mudah.

WITH RECURSIVE category_tree AS (
  SELECT id, name, parent_id,
         name AS path
  FROM   categories
  WHERE  parent_id IS NULL

  UNION ALL

  SELECT c.id, c.name, c.parent_id,
         ct.path || ' / ' || c.name
  FROM   categories    c
  JOIN   category_tree ct ON ct.id = c.parent_id
)
SELECT id, name, path
FROM   category_tree
ORDER  BY path;

Memulai dari Simpul Tertentu

Anda tidak harus memulai dari akar. Dengan mengubah klausa WHERE pada bagian jangkar, Anda dapat menelusuri subpohon dari simpul mana pun. Di sini kita memulai dari Ponsel (ID = 2) dan mengambil semua turunannya.

WITH RECURSIVE subtree AS (
  SELECT id, name, parent_id, 0 AS depth
  FROM   categories
  WHERE  id = 2          -- start at Phones

  UNION ALL

  SELECT c.id, c.name, c.parent_id, s.depth + 1
  FROM   categories c
  JOIN   subtree    s ON s.id = c.parent_id
)
SELECT id, name, depth
FROM   subtree
ORDER  BY depth, id;

Menelusuri ke Atas: Menemukan Semua Leluhur

Pohon juga dapat ditelusuri secara terbalik — dari daun ke akar. Balik saja penggabungannya agar Anda mengikuti parent_id ke atas, bukan ke bawah. Cara ini berguna ketika Anda memerlukan jejak navigasi lengkap untuk simpul daun yang telah diketahui.

WITH RECURSIVE ancestors AS (
  SELECT id, name, parent_id
  FROM   categories
  WHERE  id = 4          -- start at Smartphones

  UNION ALL

  SELECT c.id, c.name, c.parent_id
  FROM   categories c
  JOIN   ancestors  a ON a.parent_id = c.id
)
SELECT id, name
FROM   ancestors
ORDER  BY id;

Menambahkan Tampilan Berindentasi

Pola umum pada antarmuka pengguna adalah menampilkan simpul anak dengan indentasi visual. Kita dapat menggunakan REPEAT (atau LPAD) bersama kolom depth untuk menambahkan spasi di depan setiap nama, sehingga menghasilkan tampilan pohon berbasis teks.

WITH RECURSIVE category_tree AS (
  SELECT id, name, parent_id, 0 AS depth
  FROM   categories
  WHERE  parent_id IS NULL

  UNION ALL

  SELECT c.id, c.name, c.parent_id, ct.depth + 1
  FROM   categories    c
  JOIN   category_tree ct ON ct.id = c.parent_id
)
SELECT
  REPEAT('    ', depth) || name AS indented_name,
  depth
FROM   category_tree
ORDER  BY path;

Mencegah Perulangan Tak Terbatas

Jika data Anda mengandung siklus (A adalah induk B, B adalah induk A), rekursi akan berjalan selamanya dan menyebabkan kerusakan. Anda dapat mencegahnya dengan melacak ID yang telah dikunjungi dalam sebuah larik dan berhenti ketika ID saat ini sudah ada di dalamnya.

WITH RECURSIVE safe_tree AS (
  SELECT id, name, parent_id,
         ARRAY[id] AS visited
  FROM   categories
  WHERE  parent_id IS NULL

  UNION ALL

  SELECT c.id, c.name, c.parent_id,
         st.visited || c.id
  FROM   categories c
  JOIN   safe_tree  st ON st.id = c.parent_id
  WHERE  c.id <> ALL(st.visited)   -- stop if already seen
)
SELECT id, name FROM safe_tree;

Menghitung Turunan per Simpul

Setelah memiliki seluruh pohon, Anda dapat melakukan agregasi. Di sini kita menghitung jumlah turunan setiap simpul dengan mengelompokkan kembali baris anak berdasarkan daftar leluhur. Cara ini berguna untuk menampilkan jumlah item di samping nama kategori dalam menu navigasi.

WITH RECURSIVE category_tree AS (
  SELECT id, name, parent_id, id AS root_id
  FROM   categories
  WHERE  parent_id IS NULL

  UNION ALL

  SELECT c.id, c.name, c.parent_id, ct.root_id
  FROM   categories    c
  JOIN   category_tree ct ON ct.id = c.parent_id
)
SELECT
  root_id,
  COUNT(*) - 1 AS descendant_count
FROM   category_tree
GROUP  BY root_id
ORDER  BY root_id;

Pemeriksaan Singkat

Uji pemahaman Anda tentang kueri pohon kategori rekursif.

Rangkuman Pelajaran

Dalam pelajaran ini, Anda mempelajari cara menelusuri tabel kategori yang merujuk ke dirinya sendiri menggunakan WITH RECURSIVE.

Poin penting:

- Bagian jangkar memilih simpul awal, biasanya akar.

- Bagian rekursif menggabungkan kembali CTE dengan tabel dasar untuk menemukan tingkat berikutnya.

- Tambahkan kolom depth untuk melacak kedalaman setiap simpul.

- Bangun teks path untuk menghasilkan jejak navigasi.

- Telusuri ke atas dengan mengikuti parent_id secara terbalik untuk menemukan semua leluhur.

- Gunakan larik visited untuk mencegah siklus dalam data yang bermasalah.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Menelusuri Pohon Kategori” gratis?

Ya — teks lengkap “Menelusuri Pohon Kategori” 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 “Menelusuri Pohon Kategori”?

Perluas pohon induk-anak sepenuhnya. 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 2 dari 4.

Berapa lama pelajaran “Menelusuri Pohon Kategori” 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

  1. Cara Kerja CTE Rekursif
  2. Menelusuri Pohon Kategori
  3. Membuat Deret dan Urutan
  4. Menghindari Perulangan Tak Terbatas
← Kembali ke SQL Academy