Kondisi SQL WHERE tidak sama dengan?

95

Apakah mungkin untuk meniadakan klausa where?

misalnya

DELETE * FROM table WHERE id != 2;
Frank Vilea
sumber
4
FYI, id != NULLtidak tidak bekerja seperti yang Anda harapkan.
Joshua Pinter

Jawaban:

161

Anda bisa melakukan seperti ini

DELETE FROM table WHERE id NOT IN ( 2 )

ATAU

DELETE FROM table WHERE id <>  2 

Seperti yang dicatat oleh @Frank Schmitt, Anda mungkin ingin berhati-hati dengan nilai NULL juga. Jika Anda ingin menghapus semua yang tidak 2(termasuk NULL), tambahkan OR id IS NULLklausa WHERE.

Praveen Lobo
sumber
Saya mencoba perintah ini beberapa kali .. tetapi sepertinya tidak berhasil sampai saya menyadari bahwa DELETE di MySQL tidak menggunakan * ..
Frank Vilea
Ini dia, mengedit jawaban untuk menghapus * Terima kasih telah menunjukkan.
Praveen Lobo
5
Hanya komentar umum untuk orang-orang yang bertanya-tanya mengapa mereka != NULLtidak berfungsi: "Anda tidak dapat menggunakan operator perbandingan aritmatika seperti =, <, atau <> untuk menguji NULL." ( dari dokumentasi MySQL ). Jadi itu artinya Anda harus menggunakan IS NOT NULL .
Byson
31

Pertanyaan Anda sudah dijawab oleh poster lain, saya hanya ingin menunjukkannya

 delete from table where id <> 2

(atau variannya, bukan id = 2 dll) tidak akan menghapus baris di mana id adalah NULL.

Jika Anda juga ingin menghapus baris dengan id = NULL:

delete from table where id <> 2 or id is NULL
Frank Schmitt
sumber
12
delete from table where id <> 2



edit: untuk memperbaiki sintaks MySQL

Fosco
sumber
12

Anda dapat melakukan hal berikut:

DELETE * FROM table WHERE NOT(id = 2);
Pesulap
sumber
1
Berfungsi dengan baik jika nilainya bukan numerik WHERE NOT (id = 'two');
Kareem
9

Gunakan <>untuk meniadakan klausa where.

Brandon
sumber
7

Lihat kembali logika formal dan aljabar. Ekspresi seperti

A & B & (D | E)

dapat dinegasikan dengan beberapa cara:

  • Cara yang jelas:

    !( A & B & ( D | E ) )
    
  • Hal di atas juga dapat disajikan kembali, Anda hanya perlu mengingat beberapa properti ekspresi logis:

    • !( A & B )setara dengan (!A | !B).
    • !( A | B )setara dengan (!A & !B).
    • !( !A ) setara dengan (A).

    Distribusikan NOT (!) Di seluruh ekspresi yang diterapkan, membalikkan operator dan menghilangkan negatif ganda saat Anda melanjutkan:

        !A | !B | ( !D & !E )
    

Jadi, secara umum, klausa mana saja dapat dinegasikan menurut aturan di atas. Penolakan ini

select *
from foo
where      test-1
  and      test-2
  and (    test-3
        OR test-4
      )

adalah

select *
from foo
where NOT(          test-1
           and      test-2
           and (    test-3
                 OR test-4
               )
         )

atau

select *
from foo
where        not test-1
  OR         not test-2
  OR   (     not test-3
         and not test-4
       )

Mana yang lebih baik? Itu pertanyaan yang sangat sensitif konteks. Hanya Anda yang bisa memutuskan itu.

Namun, ketahuilah bahwa penggunaan TIDAK dapat memengaruhi apa yang dapat atau tidak dapat dilakukan oleh pengoptimal. Anda mungkin mendapatkan paket kueri yang kurang optimal.

Nicholas Carey
sumber
6

WHERE id <> 2 seharusnya bekerja dengan baik ... Itukah yang Anda kejar?

JNK
sumber
4

Iya. Jika ingatanku, itu seharusnya berhasil. Kami, Anda dapat menggunakan:

DELETE FROM table WHERE id <> 2
dkruythoff
sumber
3

Solusi terbaik adalah menggunakan

DELETE FROM table WHERE id NOT IN ( 2 )
trusha
sumber
0

Saya baru saja memecahkan masalah ini. Jika Anda menggunakan <> atau tidak dalam variabel, yaitu null, maka akan menghasilkan false. Jadi alih-alih <> 1, Anda harus memeriksanya seperti ini:

 AND (isdelete is NULL or isdelete = 0)
pengguna2956206
sumber