0Pricing
Coding Interview Prep · Pelajaran

Mengembalikan NULL Saat Nilai ke-N Tidak Ada

Kasus tepi yang disukai pewawancara: tangani jumlah baris yang terlalu sedikit dengan baik.

Mengembalikan NULL Saat Nilai ke-N Tidak Ada adalah pelajaran Coding Interview Prep gratis di CoddyKit. Ini adalah pelajaran 4 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 Coding Interview Prep, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Coding Interview Prep mencakup 4 pelajaran total.

Kasus Batas yang Disukai Pewawancara

Setelah Anda berhasil membuat kueri nilai tertinggi ke-N, pewawancara menambahkan: "Bagaimana jika tabel memiliki kurang dari N gaji yang berbeda? Saya ingin satu NULL, bukan hasil kosong."

Inilah pertanyaan yang membedakan kandidat yang menghafal sebuah kueri dari kandidat yang memahami perilaku set hasil. Banyak solusi diam-diam mengembalikan nol baris, bukan satu baris yang berisi NULL.

Pelajaran ini membahas cara memaksa tepat satu baris keluaran, yang nilainya adalah NULL ketika nilai ke-N tidak ada.

Mengapa DENSE_RANK saja tidak mengembalikan baris

Ingat kueri standar untuk nilai tertinggi ke-N. Jika hanya ada dua gaji yang berbeda dan Anda meminta nilai tertinggi ke-3, WHERE rnk = 3 tidak menemukan kecocokan, sehingga kueri mengembalikan himpunan kosong: nol baris.

Himpunan kosong tidak sama dengan satu baris yang berisi NULL. Jika spesifikasi menyatakan "kembalikan NULL", hasil kosong gagal dalam pengujian, meskipun logika dasarnya benar.

SELECT salary
FROM (
  SELECT salary,
         DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
  FROM employee
) t
WHERE rnk = 3;  -- returns NO rows if fewer than 3 distinct salaries

Perbaikan 1: bungkus dalam SELECT luar

Perbaikan paling sederhana dan andal: jadikan seluruh kueri nilai tertinggi ke-N sebagai subkueri skalar di dalam satu SELECT. Subkueri skalar yang tidak menemukan baris menghasilkan NULL, dan SELECT luar selalu menghasilkan tepat satu baris.

Ini adalah jawaban baku untuk varian "kembalikan NULL" bergaya LeetCode dan berfungsi pada setiap dialek.

SELECT (
  SELECT DISTINCT salary
  FROM employee
  ORDER BY salary DESC
  LIMIT 1 OFFSET 2   -- N = 3
) AS third_highest;

Mengapa trik subkueri skalar berhasil

Dua aturan berpadu untuk menghasilkan perilaku yang Anda inginkan:

  • Subkueri skalar harus mengembalikan paling banyak satu nilai. Jika tidak mengembalikan baris, SQL menggantinya dengan NULL.
  • SELECT luar tanpa FROM (atau dengan sumber satu baris) selalu menghasilkan tepat satu baris.

Jadi, ketika kueri bagian dalam menemukan nilai ke-N, Anda mendapatkannya; ketika tidak menemukan apa pun, Anda mendapat satu baris yang berisi NULL. Persis seperti kontrak yang dinyatakan pewawancara.

Perbaikan 1 dengan versi DENSE_RANK

Pembungkus yang sama dapat digunakan untuk solusi fungsi jendela. Letakkan kueri yang telah diberi peringkat di dalam subkueri skalar; jika tidak ada baris yang memiliki peringkat N, subkueri menghasilkan NULL dan SELECT luar tetap mengembalikan satu baris.

SELECT (
  SELECT salary
  FROM (
    SELECT salary,
           DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
    FROM employee
  ) t
  WHERE rnk = 3
) AS third_highest;

Perbaikan 2: MAX mengembalikan NULL secara otomatis

Ingat gagasan MAX-di bawah-MAX dari pelajaran 1. Agregasi atas nol baris menghasilkan NULL dan tetap menghasilkan satu baris. Untuk nilai tertinggi kedua, ini adalah solusi satu baris yang sudah memenuhi persyaratan NULL.

Kekurangannya: memperluas penumpukan MAX murni ke N sembarang menjadi rumit, jadi pendekatan ini paling cocok khusus untuk kasus nilai tertinggi kedua.

SELECT MAX(salary) AS second_highest
FROM employee
WHERE salary < (SELECT MAX(salary) FROM employee);

Perbaikan 3: COALESCE dengan nilai cadangan

Jika lingkungan Anda menjamin adanya satu baris tetapi nilainya mungkin hilang karena cara lain, Anda dapat membungkus hasilnya dengan COALESCE untuk memberikan nilai bawaan yang eksplisit.

Catatan: COALESCE hanya membantu setelah sebuah baris ada. Fungsi ini tidak mengubah set hasil kosong menjadi satu baris. Jadi, gabungkan dengan pembungkus subkueri skalar (yang menjamin satu baris), lalu gunakan COALESCE pada nilainya jika Anda menginginkan sesuatu selain NULL, misalnya 0.

SELECT COALESCE((
  SELECT DISTINCT salary
  FROM employee
  ORDER BY salary DESC
  LIMIT 1 OFFSET 2
), 0) AS third_highest_or_zero;

Yang tidak memperbaikinya

Waspadai perbaikan yang tampak benar tetapi gagal:

  • Menambahkan COALESCE langsung di sekitar kueri yang mengembalikan nol baris tidak menghasilkan apa pun; tidak ada baris yang dapat diproses oleh COALESCE.
  • IFNULL / ISNULL memiliki keterbatasan yang sama seperti COALESCE.
  • Menambahkan LIMIT 1 tidak menciptakan baris ketika tidak ada baris yang memenuhi syarat.

Masalah jumlah baris harus diselesaikan dengan pembungkus subkueri skalar atau agregasi, bukan hanya dengan fungsi pengganti NULL.

Contoh lengkap: meminta nilai ke-3 dari dua

Gaji: 500, 500, 300. Gaji yang berbeda hanya 500 dan 300, jadi tidak ada nilai tertinggi ke-3.

  • DENSE_RANK biasa dengan WHERE rnk = 3: mengembalikan nol baris. Tidak memenuhi spesifikasi.
  • Pembungkus subkueri skalar: kueri bagian dalam tidak menemukan apa pun, sehingga SELECT luar mengembalikan satu baris: NULL. Memenuhi spesifikasi.
  • COALESCE(..., 0): mengembalikan satu baris: 0, jika nilai bawaan numerik diminta.

Menjelaskannya saat wawancara

Dapatkan poin dengan menjelaskan:

  • "Kueri naif mengembalikan himpunan kosong, bukan NULL, jadi saya akan membungkusnya dalam subkueri skalar untuk menjamin satu baris."
  • "Subkueri skalar tanpa baris yang cocok menghasilkan NULL, persis seperti yang dipersyaratkan."
  • "Jika Anda lebih memilih nilai bawaan seperti 0 daripada NULL, saya akan menambahkan COALESCE di sekitar subkueri."

Memperlihatkan bahwa Anda memahami perbedaan semantik antara jumlah baris dan nilai adalah inti pertanyaan ini.

Menggabungkan semuanya

Solusi nilai tertinggi ke-N atau NULL yang tangguh dan dapat diberi parameter: beri peringkat pada gaji yang berbeda, filter berdasarkan peringkat N di dalam subkueri skalar, dan biarkan SELECT luar menjamin satu baris.

Satu kueri ini menangani duplikat (dengan DENSE_RANK), dapat digunakan untuk N apa pun, dan mengembalikan NULL secara tepat ketika N melebihi jumlah gaji yang berbeda.

SELECT (
  SELECT salary
  FROM (
    SELECT salary,
           DENSE_RANK() OVER (ORDER BY salary DESC) AS rnk
    FROM employee
  ) t
  WHERE rnk = :n
  LIMIT 1
) AS nth_highest;

Pemeriksaan singkat

Analisis jumlah baris dibandingkan dengan nilai NULL.

Rangkuman

Ketika N melebihi jumlah gaji berbeda yang tersedia, kueri pemeringkatan biasa mengembalikan himpunan kosong, bukan NULL.

  • Bungkus kueri nilai tertinggi ke-N dalam subkueri skalar di dalam SELECT luar agar selalu menghasilkan satu baris, dengan NULL ketika tidak ada nilai yang cocok.
  • Bentuk MAX-di bawah-MAX mengembalikan NULL secara otomatis untuk kasus nilai tertinggi kedua.
  • COALESCE hanya mengganti nilai setelah sebuah baris ada; fungsi ini tidak dapat mengubah nol baris menjadi satu baris.

Selalu bedakan jumlah baris dari nilai ketika pewawancara meminta penanganan NULL yang baik.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Mengembalikan NULL Saat Nilai ke-N Tidak Ada” gratis?

Ya — teks lengkap “Mengembalikan NULL Saat Nilai ke-N Tidak Ada” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Coding Interview Prep, upgrade ke CoddyKit PRO. Kursus Coding Interview Prep mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Mengembalikan NULL Saat Nilai ke-N Tidak Ada”?

Kasus tepi yang disukai pewawancara: tangani jumlah baris yang terlalu sedikit dengan baik. Kamu berlatih Coding Interview Prep 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 Coding Interview Prep?

Tidak diperlukan pengalaman sebelumnya. Coding Interview Prep 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 4 dari 4.

Berapa lama pelajaran “Mengembalikan NULL Saat Nilai ke-N Tidak Ada” 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 Coding Interview Prep ini?

Ya. Setiap pelajaran Coding Interview Prep 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. Gaji Tertinggi Kedua, Lima Cara
  2. Nilai Tertinggi ke-N dengan DENSE_RANK
  3. Penerima Penghasilan Tertinggi Per Departemen
  4. Mengembalikan NULL Saat Nilai ke-N Tidak Ada
← Kembali ke Coding Interview Prep