Operator not equal (tidak sama dengan), ditulis <> atau !=, bernilai true jika dua nilai berbeda. Taruh di klausa WHERE untuk mengecualikan baris yang cocok dengan suatu nilai. Contoh-contohnya berfungsi di PostgreSQL, MySQL, SQLite, dan SQL Server.
Cara menggunakan not equal
Taruh <> atau != di antara dua nilai. Keduanya memiliki arti yang persis sama. <> adalah penulisan standar SQL, sedangkan != dipakai oleh sebagian besar bahasa pemrograman.
value1 <> value2
value1 != value2
SELECT 5 <> 3;
-- Output: true
SELECT 'apple' != 'apple';
-- Output: false
SELECT NULL <> 3;
-- Output: NULL
-- MySQL and SQLite show true and false as 1 and 0. SQL Server can't
-- select a comparison like this: use it in a WHERE clause there.
Dalam query, not equal ditaruh di klausa WHERE dan mempertahankan setiap baris yang nilainya berbeda:
-- Input: tickets
-- id | subject | status
-- ---+-----------------------+--------
-- 1 | Login fails on Safari | open
-- 2 | Typo on pricing page | closed
-- 3 | Export times out | pending
-- 4 | Add a dark theme | NULL
SELECT id, subject, status
FROM tickets
WHERE status <> 'closed';
-- Output:
-- id | subject | status
-- ---+-----------------------+--------
-- 1 | Login fails on Safari | open
-- 3 | Export times out | pending
Tiket 4 tidak muncul di hasil, padahal statusnya bukan 'closed'. Itulah aturan pertama di bawah ini.
Aturan yang perlu diketahui
-
Not equal tidak pernah cocok dengan NULL. Membandingkan NULL dengan apa pun menghasilkan NULL (tidak diketahui), bukan true, sehingga klausa
WHEREmembuang baris tersebut. TambahkanOR column IS NULLuntuk mempertahankan baris yang tidak punya nilai:
-- Input: the tickets table above
SELECT id, subject, status
FROM tickets
WHERE status <> 'closed' OR status IS NULL;
-- Output:
-- id | subject | status
-- ---+-----------------------+--------
-- 1 | Login fails on Safari | open
-- 3 | Export times out | pending
-- 4 | Add a dark theme | NULL
-
Satu NULL di daftar
NOT INmenghapus semua baris.status NOT IN ('closed', 'pending')adalah singkatan daristatus <> 'closed' AND status <> 'pending', jadi satu NULL saja di daftar membuat seluruh kondisi menjadi tidak diketahui. Waspadai ini saat daftarnya berasal dari subquery pada kolom yang mengizinkan NULL:
-- Input: the tickets table above
SELECT id, status FROM tickets WHERE status NOT IN ('closed', 'pending');
-- Output:
-- id | status
-- ---+-------
-- 1 | open
SELECT id, status FROM tickets WHERE status NOT IN ('closed', NULL);
-- Output:
-- id | status
-- ---+-------
-- (0 rows)
-
MySQL dan SQL Server secara default mengabaikan huruf besar/kecil, jadi di sana
'Apple' <> 'apple'bernilai false. -
Sebisa mungkin, minta apa yang Anda inginkan.
status <> 'closed'juga akan cocok dengan status apa pun yang ditambahkan nanti, dan karena biasanya cocok dengan sebagian besar tabel, database jarang terbantu oleh index. Jika maksud Anda “open atau pending”, tulis sajastatus IN ('open', 'pending').
Sintaks alternatif
NOT (status = 'closed') adalah cara lain menulis status <> 'closed', dan juga melewatkan NULL dengan cara yang sama.
Untuk membandingkan tanpa kejutan NULL, gunakan IS DISTINCT FROM, not equal yang aman terhadap NULL dan memperlakukan NULL sebagai nilai tersendiri (SQL Server menambahkannya di 2022, SQLite di 3.39):
-- Input: the tickets table above
SELECT id, status FROM tickets WHERE status IS DISTINCT FROM 'closed';
-- Output:
-- id | status
-- ---+--------
-- 1 | open
-- 3 | pending
-- 4 | NULL
-- MySQL has no IS DISTINCT FROM. Use its NULL-safe <=> instead:
SELECT id, status FROM tickets WHERE NOT (status <=> 'closed');
Kapan sebaiknya menggunakan not equal?
Gunakan not equal saat query harus melewatkan baris yang memiliki satu nilai tertentu. Sebagian besar penggunaannya termasuk salah satu dari lima kasus ini.
Menyaring satu status atau kategori
Pesanan yang dibatalkan, invoice yang void, kategori yang tidak Anda jual: <> mengecualikan baris dengan nilai itu dan mempertahankan sisanya.
Melewatkan satu record tertentu
Bandingkan id untuk mengecualikan satu baris atau grup: artikel yang sedang dibaca saat Anda menampilkan artikel terkait, pengguna yang sedang login di daftar anggota lain, atau satu departemen di laporan perusahaan. Angka tidak perlu tanda kutip.
Mempersempit hasil dengan kondisi lain
Gabungkan <> dengan AND dan OR untuk mengecualikan suatu nilai sambil memfilter kolom lain, misalnya pesanan yang tidak dibatalkan dan melebihi jumlah tertentu. Untuk mengecualikan beberapa nilai dari kolom yang sama, gunakan NOT IN.
Menemukan baris dengan dua kolom yang berbeda
Not equal juga bisa dipakai antara dua kolom. Bandingkan nilai lama dengan yang baru, jumlah hasil hitung dengan angka di catatan, atau alamat pengiriman dengan alamat penagihan.
Mempertahankan baris yang nilainya kosong
Karena <> melewatkan NULL, tentukan apakah baris tanpa nilai perlu masuk ke hasil. Tambahkan OR column IS NULL untuk mempertahankannya, atau gunakan sintaks yang aman terhadap NULL di atas.
Contoh nyata not equal
Menjumlahkan invoice yang dihitung
Invoice yang void tidak boleh dihitung sebagai pendapatan:
-- Input: invoices
-- invoice_id | customer | status | amount
-- -----------+------------+--------+--------
-- 1001 | Acme Corp | paid | 1200.00
-- 1002 | Birch & Co | void | 450.00
-- 1003 | Acme Corp | open | 300.00
-- 1004 | Cobalt Ltd | paid | 875.50
SELECT SUM(amount) AS invoiced
FROM invoices
WHERE status <> 'void';
-- Output: 2375.50
Menampilkan artikel terkait, kecuali yang sedang dibaca
Seorang pembaca sedang membuka artikel 2. Tampilkan artikel lain dengan topik yang sama:
-- Input: articles
-- id | title | topic
-- ---+----------------------+-------
-- 1 | Indexing basics | SQL
-- 2 | Your first JOIN | SQL
-- 3 | Docker for beginners | DevOps
-- 4 | Window functions | SQL
SELECT id, title
FROM articles
WHERE topic = 'SQL'
AND id <> 2;
-- Output:
-- id | title
-- ---+-----------------
-- 1 | Indexing basics
-- 4 | Window functions
Tampilkan hanya produk yang bisa dijual
Kecualikan produk yang sudah dihentikan, produk tanpa harga, dan produk yang stoknya habis:
-- Input: products
-- product_name | category | price | stock_quantity
-- ---------------+--------------+-------+---------------
-- Desk Organizer | Office | 18.50 | 40
-- Fax Machine | Discontinued | 89.00 | 3
-- Gift Wrap | Seasonal | 0.00 | 120
-- Trail Backpack | Outdoors | 64.00 | 0
-- Water Bottle | Outdoors | 12.99 | 75
SELECT product_name, category, price
FROM products
WHERE category <> 'Discontinued'
AND price > 0
AND stock_quantity <> 0;
-- Output:
-- product_name | category | price
-- ---------------+----------+------
-- Desk Organizer | Office | 18.50
-- Water Bottle | Outdoors | 12.99
Menemukan field yang benar-benar berubah
Audit log mencatat setiap penyimpanan, termasuk yang tidak mengubah apa pun. Bandingkan kedua kolom untuk mempertahankan perubahan yang nyata saja:
-- Input: audit_log
-- log_id | field_name | old_value | new_value
-- -------+------------+-------------+------------
-- 1 | email | dan@old.com | dan@new.com
-- 2 | city | Austin | Austin
-- 3 | plan | free | pro
SELECT log_id, field_name, old_value, new_value
FROM audit_log
WHERE old_value <> new_value;
-- Output:
-- log_id | field_name | old_value | new_value
-- -------+------------+-------------+------------
-- 1 | email | dan@old.com | dan@new.com
-- 3 | plan | free | pro
Jika salah satu kolom bisa NULL, gunakan IS DISTINCT FROM (atau NOT (old_value <=> new_value) di MySQL); jika tidak, nilai yang diisi untuk pertama kali tidak akan dihitung sebagai perubahan.
Mengingatkan semua yang belum bilang ya
Tamu yang belum membalas punya rsvp bernilai NULL, dan merekalah yang paling butuh pengingat:
-- Input: invitations
-- guest | email | rsvp
-- ------------+------------------+------
-- Ines Moreau | ines@example.com | yes
-- Raj Patel | raj@example.com | no
-- Hana Sato | hana@example.com | NULL
-- Leo Grant | leo@example.com | maybe
SELECT guest, email, rsvp
FROM invitations
WHERE rsvp <> 'yes' OR rsvp IS NULL;
-- Output:
-- guest | email | rsvp
-- ----------+------------------+------
-- Raj Patel | raj@example.com | no
-- Hana Sato | hana@example.com | NULL
-- Leo Grant | leo@example.com | maybe
Bacaan lanjutan tentang not equal
Di blog ini:
- Panduan SQL COALESCE: ganti NULL dengan suatu nilai sebelum membandingkan
-
Panduan SQL LIKE:
NOT LIKEuntuk mengecualikan teks yang cocok dengan pola - Panduan statement SQL CASE: gunakan perbandingan untuk memilih nilai
- Having vs Where di SQL: di mana filter ditaruh saat Anda mengelompokkan baris
- Membandingkan dua nilai di PostgreSQL: operator perbandingan lainnya
Dokumentasi resmi:
- PostgreSQL: Operator perbandingan
- MySQL:
<>dan!= - SQLite: Operator
-
SQL Server:
<>,!=dan IS DISTINCT FROM
Beekeeper Studio Adalah GUI Database Gratis & Open Source
Tool query & editor SQL terbaik yang pernah saya pakai. Semua yang saya butuhkan untuk mengelola database ada di sini. - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studio cepat, intuitif, dan mudah digunakan. Beekeeper mendukung banyak sekali database, dan berjalan mulus di Windows, Mac, dan Linux.
Apa Kata Pengguna Tentang Beekeeper Studio
"Beekeeper Studio sepenuhnya menggantikan workflow SQL lama saya. Cepat, intuitif, dan membuat kerja dengan database kembali menyenangkan."
"Saya sudah mencoba banyak GUI database, tapi Beekeeper punya keseimbangan sempurna antara fitur dan kesederhanaan. Langsung berfungsi."