0Pricing
SQL Academy · Pelajaran

EXISTS dan NOT EXISTS

Periksa baris terkait secara efisien.

EXISTS dan NOT EXISTS 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 EXISTS?

Operator EXISTS menguji apakah sebuah subkueri mengembalikan setidaknya satu baris. Operator ini bernilai TRUE jika subkueri menghasilkan hasil apa pun, dan bernilai FALSE jika subkueri kosong.

Berbeda dari operator subkueri lain yang membandingkan nilai, EXISTS hanya memperhatikan keberadaan—operator ini tidak memeriksa data sebenarnya yang dikembalikan oleh subkueri.

Menyiapkan Tabel Contoh

Sebelum menulis kueri EXISTS, mari buat dua tabel: customers dan orders. Kita akan menggunakannya sepanjang pelajaran untuk mengeksplorasi cara kerja EXISTS dan NOT EXISTS dalam praktik.

CREATE TABLE customers (
  customer_id INT PRIMARY KEY,
  name        VARCHAR(100),
  country     VARCHAR(50)
);

CREATE TABLE orders (
  order_id    INT PRIMARY KEY,
  customer_id INT,
  amount      DECIMAL(10,2),
  order_date  DATE
);

INSERT INTO customers VALUES
  (1, 'Alice',   'US'),
  (2, 'Bob',     'UK'),
  (3, 'Charlie', 'US'),
  (4, 'Diana',   'DE');

INSERT INTO orders VALUES
  (101, 1, 250.00, '2024-01-10'),
  (102, 1, 180.00, '2024-02-15'),
  (103, 2,  95.00, '2024-03-01'),
  (104, 3, 430.00, '2024-03-22');

Sintaks Dasar EXISTS

Sintaks dasar EXISTS menempatkannya di dalam klausa WHERE. Subkueri di dalam EXISTS biasanya merujuk pada kolom dari kueri luar—ini disebut subkueri berkorelasi.

Kueri di bawah menemukan setiap pelanggan yang telah membuat setidaknya satu pesanan.

SELECT customer_id, name
FROM customers c
WHERE EXISTS (
  SELECT 1
  FROM orders o
  WHERE o.customer_id = c.customer_id
);

SELECT 1 di Dalam EXISTS

Anda mungkin memperhatikan bahwa subkueri menggunakan SELECT 1, bukan memilih kolom nyata apa pun. Ini disengaja — EXISTS hanya memeriksa apakah ada baris, bukan apa isinya.

Menggunakan SELECT 1 (atau bahkan SELECT *) tidak membuat perbedaan pada hasil, tetapi SELECT 1 memberi sinyal dengan jelas kepada mesin basis data dan pembaca bahwa nilai sebenarnya tidak penting.

-- Both of these return the same result
SELECT name FROM customers c
WHERE EXISTS (SELECT 1   FROM orders o WHERE o.customer_id = c.customer_id);

SELECT name FROM customers c
WHERE EXISTS (SELECT o.* FROM orders o WHERE o.customer_id = c.customer_id);

Cara Basis Data Mengevaluasi EXISTS

Untuk setiap baris dalam kueri luar, basis data menjalankan subkueri berkorelasi. Begitu satu baris yang cocok ditemukan, mesin berhenti memindai dan menandai EXISTS sebagai TRUE — evaluasi hubung singkat ini membuat EXISTS sangat efisien bahkan pada tabel besar.

Sebaliknya, JOIN akan membangun seluruh kumpulan baris yang cocok sebelum memfilter, yang bisa lebih lambat ketika Anda hanya perlu mengetahui apakah ada kecocokan.

-- EXISTS short-circuits after first match
-- Efficient even when orders table has millions of rows
SELECT name, country
FROM customers c
WHERE EXISTS (
  SELECT 1
  FROM orders o
  WHERE o.customer_id = c.customer_id
    AND o.amount > 200
);

NOT EXISTS: Menemukan Baris yang Tidak Ada

NOT EXISTS adalah kebalikannya: operator ini mengembalikan TRUE ketika subkueri tidak menemukan baris yang cocok. Ini adalah cara SQL standar untuk menjawab pertanyaan seperti "pelanggan mana yang belum pernah membuat pesanan?"

Mencoba menyelesaikan hal ini dengan JOIN biasa atau NOT IN dapat menghasilkan hasil yang keliru ketika NULL terlibat — NOT EXISTS sepenuhnya menghindari jebakan tersebut.

-- Customers who have NOT placed any order
SELECT customer_id, name
FROM customers c
WHERE NOT EXISTS (
  SELECT 1
  FROM orders o
  WHERE o.customer_id = c.customer_id
);

NOT EXISTS vs NOT IN dengan NULL

Satu keunggulan penting NOT EXISTS dibandingkan NOT IN adalah keamanannya terhadap NULL. Jika subkueri yang digunakan oleh NOT IN mengembalikan bahkan satu NULL, seluruh ekspresi NOT IN menjadi NULL — artinya tidak ada baris yang dikembalikan dari kueri luar.

NOT EXISTS kebal terhadap masalah ini karena mengevaluasi keberadaan baris, bukan kesetaraan nilai.

-- Dangerous: if any customer_id in orders is NULL,
-- NOT IN returns zero rows!
SELECT name FROM customers
WHERE customer_id NOT IN (SELECT customer_id FROM orders);

-- Safe: NOT EXISTS handles NULLs correctly
SELECT name FROM customers c
WHERE NOT EXISTS (
  SELECT 1 FROM orders o
  WHERE o.customer_id = c.customer_id
);

EXISTS dengan Beberapa Kondisi

Subkueri di dalam EXISTS dapat berisi pernyataan SQL valid apa pun, termasuk beberapa kondisi WHERE. Dengan demikian, Anda dapat memeriksa baris terkait yang sangat spesifik — misalnya, pelanggan yang melakukan pesanan dengan nilai melebihi ambang batas pada bulan tertentu.

-- Customers who placed an order over 200 in March 2024
SELECT c.name, c.country
FROM customers c
WHERE EXISTS (
  SELECT 1
  FROM orders o
  WHERE o.customer_id = c.customer_id
    AND o.amount > 200
    AND o.order_date >= '2024-03-01'
    AND o.order_date <  '2024-04-01'
);

EXISTS dalam DELETE dan UPDATE

EXISTS tidak terbatas pada pernyataan SELECT. Anda dapat menggunakannya dalam UPDATE dan DELETE untuk mengubah atau menghapus baris berdasarkan keberadaan data terkait di tabel lain.

Contoh di bawah ini menghapus pesanan milik pelanggan dari negara tertentu.

-- Delete orders placed by US customers
DELETE FROM orders o
WHERE EXISTS (
  SELECT 1
  FROM customers c
  WHERE c.customer_id = o.customer_id
    AND c.country = 'US'
);

Membandingkan EXISTS dengan JOIN

EXISTS dan JOIN sering kali dapat menyatakan pertanyaan yang sama, tetapi cara kerjanya berbeda. JOIN menggandakan baris ketika ada beberapa kecocokan; EXISTS selalu mengembalikan setiap baris luar paling banyak satu kali.

Ketika Anda hanya perlu mengetahui apakah suatu hubungan ada (bukan mengambil data dari tabel terkait), EXISTS lebih jelas dan biasanya lebih cepat.

-- JOIN may return duplicate customer rows if a customer has multiple orders
SELECT DISTINCT c.name
FROM customers c
JOIN orders o ON o.customer_id = c.customer_id;

-- EXISTS always returns each customer once
SELECT c.name
FROM customers c
WHERE EXISTS (
  SELECT 1 FROM orders o
  WHERE o.customer_id = c.customer_id
);

NOT EXISTS untuk Pemeriksaan Kualitas Data

NOT EXISTS adalah alat yang ampuh untuk audit kualitas data. Anda dapat menggunakannya untuk menemukan rekaman yatim, referensi yang hilang, atau baris yang seharusnya memiliki data terkait tetapi tidak memilikinya.

Kueri di bawah ini mendeteksi baris pesanan yang customer_id-nya tidak cocok dengan baris mana pun di tabel pelanggan — tanda rusaknya integritas referensial.

-- Find orders with no matching customer (orphaned records)
SELECT o.order_id, o.customer_id, o.amount
FROM orders o
WHERE NOT EXISTS (
  SELECT 1
  FROM customers c
  WHERE c.customer_id = o.customer_id
);

Pemeriksaan Singkat

Uji pemahaman Anda tentang EXISTS dan NOT EXISTS.

Rangkuman Pelajaran

Dalam pelajaran ini, Anda mempelajari cara EXISTS dan NOT EXISTS memungkinkan Anda memeriksa ada atau tidaknya baris terkait tanpa membandingkan nilai secara langsung.

Poin utama:

  • EXISTS mengembalikan TRUE segera setelah subkueri menemukan satu baris yang cocok (evaluasi hubung singkat).
  • NOT EXISTS mengembalikan TRUE ketika subkueri tidak menemukan baris yang cocok.
  • Gunakan SELECT 1 di dalam EXISTS — nilai yang dikembalikan tidak relevan.
  • NOT EXISTS aman terhadap NULL; NOT IN tidak — pilih NOT EXISTS jika NULL mungkin muncul.
  • EXISTS berfungsi dalam pernyataan SELECT, UPDATE, dan DELETE.
  • Jika hanya memerlukan keberadaan, EXISTS sering kali lebih sederhana dan lebih cepat daripada JOIN.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “EXISTS dan NOT EXISTS” gratis?

Ya — teks lengkap “EXISTS dan NOT EXISTS” 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 “EXISTS dan NOT EXISTS”?

Periksa baris terkait secara efisien. 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 “EXISTS dan NOT EXISTS” 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. Subkueri Berkorelasi
  2. EXISTS dan NOT EXISTS
  3. IN vs ANY vs ALL
  4. Kinerja EXISTS vs JOIN
← Kembali ke SQL Academy