Điều kiện SQL WHERE không bằng?


Câu trả lời:


158

Bạn có thể làm như thế này

DELETE FROM table WHERE id NOT IN ( 2 )

HOẶC LÀ

DELETE FROM table WHERE id <>  2 

Như @Frank Schmitt đã lưu ý, bạn cũng có thể muốn cẩn thận về các giá trị NULL. Nếu bạn muốn xóa mọi thứ không có 2(bao gồm cả NULL) thì hãy thêm OR id IS NULLvào mệnh đề WHERE.


Tôi cố gắng lệnh này một vài lần .. nhưng nó dường như không làm việc cho đến khi tôi nhận ra rằng DELETE trong MySQL không sử dụng * ..
Frank Vilea

Ở đó bạn đã chỉnh sửa câu trả lời để loại bỏ * Cảm ơn bạn đã chỉ ra.
Praveen Lobo

5
Chỉ là một nhận xét chung cho những người ở đây tự hỏi tại sao chúng != NULLkhông hoạt động: "Bạn không thể sử dụng các toán tử so sánh số học như =, <hoặc <> để kiểm tra NULL." ( từ tài liệu MySQL ). Vì vậy, có nghĩa là bạn phải sử dụng IS NOT NULL .
Byson

31

Câu hỏi của bạn đã được trả lời bởi các áp phích khác, tôi chỉ muốn chỉ ra rằng

 delete from table where id <> 2

(hoặc các biến thể của chúng, không phải id = 2, v.v.) sẽ không xóa các hàng có id là NULL.

Nếu bạn cũng muốn xóa các hàng có id = NULL:

delete from table where id <> 2 or id is NULL

12
delete from table where id <> 2



chỉnh sửa: để sửa cú pháp cho MySQL


11

Bạn có thể làm như sau:

DELETE * FROM table WHERE NOT(id = 2);

1
Hoạt động tốt nếu giá trị không phải là số WHERE NOT (id = 'two');
Kareem


7

Nhìn lại logic hình thức và đại số. Một biểu hiện như

A & B & (D | E)

có thể bị phủ định theo một số cách:

  • Cách rõ ràng:

    !( A & B & ( D | E ) )
  • Phần trên cũng có thể được trình bày lại, bạn chỉ cần nhớ một số thuộc tính của biểu thức logic:

    • !( A & B )là tương đương với (!A | !B).
    • !( A | B )là tương đương với (!A & !B).
    • !( !A ) là tương đương của (A).

    Phân phối NOT (!) Trên toàn bộ biểu thức mà nó áp dụng, đảo ngược các toán tử và loại bỏ các phủ định kép khi bạn tiếp tục:

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

Vì vậy, nói chung, bất kỳ mệnh đề where có thể bị phủ định theo các quy tắc trên. Sự phủ định của điều này

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

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

hoặc là

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

Cái nào tốt hơn? Đó là một câu hỏi rất nhạy cảm với ngữ cảnh. Chỉ bạn mới có thể quyết định điều đó.

Tuy nhiên, hãy lưu ý rằng việc sử dụng NOT có thể ảnh hưởng đến những gì trình tối ưu hóa có thể hoặc không thể làm. Bạn có thể nhận được một kế hoạch truy vấn ít hơn tối ưu.


6

WHERE id <> 2 nên làm việc tốt ... Đó là những gì bạn đang theo đuổi?


4

Đúng. Nếu bộ nhớ phục vụ tôi, điều đó sẽ hoạt động. Của chúng tôi bạn có thể sử dụng:

DELETE FROM table WHERE id <> 2

3

Giải pháp tốt nhất là sử dụng

DELETE FROM table WHERE id NOT IN ( 2 )

0

Tôi chỉ đang giải quyết vấn đề này. Nếu bạn sử dụng <> hoặc không có trong một biến, giá trị này là null, nó sẽ dẫn đến sai. Vì vậy, thay vì <> 1, bạn phải kiểm tra nó như sau:

 AND (isdelete is NULL or isdelete = 0)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.