sql >> Databasteknik >  >> RDS >> Database

SQL NOT Operator för nybörjare

I SQL, NOT operatorn negerar en boolesk indata (den vänder värdet på valfritt booleskt uttryck). Därför returnerar den TRUE när uttrycket är FALSE .

Källtabell

Följande tabell används för exemplen på den här sidan.

SELECT * FROM Pets;

Resultat:

+---------+-------------+-----------+-----------+------------+
| PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
|---------+-------------+-----------+-----------+------------|
| 1       | 2           | 3         | Fluffy    | 2020-11-20 |
| 2       | 3           | 3         | Fetch     | 2019-08-16 |
| 3       | 2           | 2         | Scratch   | 2018-10-01 |
| 4       | 3           | 3         | Wag       | 2020-03-15 |
| 5       | 1           | 1         | Tweet     | 2020-11-28 |
| 6       | 3           | 4         | Fluffy    | 2020-09-17 |
| 7       | 3           | 2         | Bark      | NULL       |
| 8       | 2           | 4         | Meow      | NULL       |
+---------+-------------+-----------+-----------+------------+
(8 rows affected)

Exempel 1

Här är ett enkelt exempel för att demonstrera NOT operatör.

SELECT * FROM Pets 
WHERE PetName NOT LIKE 'F%';

Resultat:

+---------+-------------+-----------+-----------+------------+
| PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
|---------+-------------+-----------+-----------+------------|
| 3       | 2           | 2         | Scratch   | 2018-10-01 |
| 4       | 3           | 3         | Wag       | 2020-03-15 |
| 5       | 1           | 1         | Tweet     | 2020-11-28 |
| 7       | 3           | 2         | Bark      | NULL       |
| 8       | 2           | 4         | Meow      | NULL       |
+---------+-------------+-----------+-----------+------------+

I det här fallet använde vi NOT operatorn för att förneka resultatet av LIKE operatör. Vår fråga returnerar alla husdjur som inte börjar med bokstaven F.

Exempel 2 – Användning av INTE med jämförelseoperatörer

Om du använder NOT för att förneka en jämförelseoperator, måste du ändra din syntax något från den som användes i föregående exempel.

Till exempel, om du vill använda den för att negera lika-operatorn (= ), använd följande syntax:

SELECT * FROM Pets 
WHERE NOT PetName = 'Fluffy';

Resultat:

+---------+-------------+-----------+-----------+------------+
| PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
|---------+-------------+-----------+-----------+------------|
| 2       | 3           | 3         | Fetch     | 2019-08-16 |
| 3       | 2           | 2         | Scratch   | 2018-10-01 |
| 4       | 3           | 3         | Wag       | 2020-03-15 |
| 5       | 1           | 1         | Tweet     | 2020-11-28 |
| 7       | 3           | 2         | Bark      | NULL       |
| 8       | 2           | 4         | Meow      | NULL       |
+---------+-------------+-----------+-----------+------------+

Detta returnerar alla husdjur vars namn inte är Fluffy.

I det här exemplet sätter vi NOT operatorn framför kolumnnamnet. Om vi ​​inte hade gjort det skulle vi ha fått ett felmeddelande som är ungefär så här:

SELECT * FROM Pets 
WHERE PetName NOT = 'Fluffy';

Resultat:

Msg 102, Level 15, State 1, Line 2
Incorrect syntax near '='.

Vi kunde också ha uppnått samma resultat genom att använda operatorn inte lika med (antingen <> eller != beroende på ditt DBMS).

Till exempel detta:

SELECT * FROM Pets 
WHERE PetName <> 'Fluffy';

Eller det här:

SELECT * FROM Pets 
WHERE PetName != 'Fluffy';

Exempel 3 – Samma syntax med logiska operatorer

Som det visar sig kan vi också använda den syntaxen när vi använder logiska operatorer, såsom LIKE operatorn som vi använde i det första exemplet.

Därför skulle vi kunna skriva om det första exemplet till detta:

SELECT * FROM Pets 
WHERE NOT PetName LIKE 'F%';

Resultat:

+---------+-------------+-----------+-----------+------------+
| PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
|---------+-------------+-----------+-----------+------------|
| 3       | 2           | 2         | Scratch   | 2018-10-01 |
| 4       | 3           | 3         | Wag       | 2020-03-15 |
| 5       | 1           | 1         | Tweet     | 2020-11-28 |
| 7       | 3           | 2         | Bark      | NULL       |
| 8       | 2           | 4         | Meow      | NULL       |
+---------+-------------+-----------+-----------+------------+

Om du inte är säker på vad skillnaden är flyttade vi NOT operatör från efter PetName kolumn, till före den.

Här är de två påståendena tillsammans:

SELECT * FROM Pets 
WHERE PetName NOT LIKE 'F%';

SELECT * FROM Pets 
WHERE NOT PetName LIKE 'F%';

Exempel 4 – Negera flera villkor

NOT operatören förnekar bara ett enda villkor. Om du har flera villkor som du behöver förneka, använd en separat NOT operatör för varje villkor,

SELECT * FROM Pets 
WHERE NOT PetName = 'Fluffy'
AND NOT PetName = 'Wag';

Resultat:

+---------+-------------+-----------+-----------+------------+
| PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
|---------+-------------+-----------+-----------+------------|
| 2       | 3           | 3         | Fetch     | 2019-08-16 |
| 3       | 2           | 2         | Scratch   | 2018-10-01 |
| 5       | 1           | 1         | Tweet     | 2020-11-28 |
| 7       | 3           | 2         | Bark      | NULL       |
| 8       | 2           | 4         | Meow      | NULL       |
+---------+-------------+-----------+-----------+------------+

Exempel 5 – Företräde

När du använder sammansatta villkor, där du har flera operatorer, är NOT operatorn utvärderas före eventuella logiska operatorer, men efter någon. jämförelseoperatorer,

När två operatorer i ett uttryck har samma prioritetsnivå, utvärderas de från vänster till höger baserat på deras position i uttrycket. Du kan dock använda parenteser för att ange i vilken ordning du vill att varje villkor ska utvärderas.

Här är ett exempel.

SELECT * FROM Pets 
WHERE 
    NOT PetName = 'Fluffy'
    OR NOT PetName = 'Wag'
    AND NOT DOB > '2020-01-01';

Resultat:

+---------+-------------+-----------+-----------+------------+
| PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
|---------+-------------+-----------+-----------+------------|
| 2       | 3           | 3         | Fetch     | 2019-08-16 |
| 3       | 2           | 2         | Scratch   | 2018-10-01 |
| 4       | 3           | 3         | Wag       | 2020-03-15 |
| 5       | 1           | 1         | Tweet     | 2020-11-28 |
| 7       | 3           | 2         | Bark      | NULL       |
| 8       | 2           | 4         | Meow      | NULL       |
+---------+-------------+-----------+-----------+------------+

Vi använde inga parenteser här, och alla villkor upphävdes med NOT operatorn och så AND operatorn hade företräde framför OR operatör.

Vi kan dock använda parenteser för att specificera att OR villkoret bör utvärderas före AND skick.

SELECT * FROM Pets 
WHERE 
    (NOT PetName = 'Fluffy'
    OR NOT PetName = 'Wag')
    AND NOT DOB > '2020-01-01';

Resultat:

+---------+-------------+-----------+-----------+------------+
| PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
|---------+-------------+-----------+-----------+------------|
| 2       | 3           | 3         | Fetch     | 2019-08-16 |
| 3       | 2           | 2         | Scratch   | 2018-10-01 |
+---------+-------------+-----------+-----------+------------+

I det här fallet får vi ett annat resultat.

Exempel 6 – Negera MELLAN operatören

Här är ett annat exempel, den här gången med NOT operatorn för att negera resultatet av BETWEEN operatör.

SELECT * FROM Pets 
WHERE DOB NOT BETWEEN '2018-10-01' AND '2020-09-17';

Resultat:

+---------+-------------+-----------+-----------+------------+
| PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
|---------+-------------+-----------+-----------+------------|
| 1       | 2           | 3         | Fluffy    | 2020-11-20 |
| 5       | 1           | 1         | Tweet     | 2020-11-28 |
+---------+-------------+-----------+-----------+------------+

I det här exemplet returnerade vi alla rader där DOB kolumnen är inte mellan 2018-10-01 och 2020-09-17 .

I det här fallet matchade två rader det kriteriet, och därför returnerades två rader.

Detta är det motsatta resultatet av följande fråga:

SELECT * FROM Pets 
WHERE DOB BETWEEN '2018-10-01' AND '2020-09-17';

Resultat:

+---------+-------------+-----------+-----------+------------+
| PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
|---------+-------------+-----------+-----------+------------|
| 2       | 3           | 3         | Fetch     | 2019-08-16 |
| 3       | 2           | 2         | Scratch   | 2018-10-01 |
| 4       | 3           | 3         | Wag       | 2020-03-15 |
| 6       | 3           | 4         | Fluffy    | 2020-09-17 |
+---------+-------------+-----------+-----------+------------+

I det här exemplet returnerade vi alla rader där DOB kolumn är mellan 2018-10-01 och 2020-09-17 .

I det här fallet matchade fyra rader det kriteriet, och därför returnerades fyra rader.


  1. Hur man installerar Haproxy och Keepalved

  2. Om SQLite

  3. Så här fixar du "Partitionsschemat '...' har ingen nästa använda filgrupp" i SQL Server

  4. Hur man returnerar en lista över datatyper i SQL Server (T-SQL)