В SQL, AND
операторът ви позволява да проверявате за множество условия при филтриране на вашите заявки.
AND
оператор комбинира два булеви израза и връща TRUE
когато и двата израза са TRUE
.
Изходна таблица
Следната таблица се използва за примерите на тази страница.
SELECT * FROM Pets;
Резултат:
+---------+-------------+-----------+-----------+------------+ | 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)
Пример
Ето един прост пример за демонстриране на AND
оператор.
SELECT * FROM Pets
WHERE PetName = 'Fluffy' AND DOB > '2020-11-01';
Резултат:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | +---------+-------------+-----------+-----------+------------+
Както се очакваше, той върна само онези редове, където и PetName
колоната беше Fluffy
и DOB
колоната е по-голяма от 2020-11-01
.
В този случай само един ред отговаря на този критерий и следователно е върнат само един ред.
Комбинирано с други оператори
Вашите критерии за филтриране могат да комбинират изрази, които използват други оператори в допълнение към AND
оператор.
Ето пример, който включва OR
оператор.
SELECT * FROM Pets
WHERE (PetName = 'Fluffy' OR PetName = 'Tweet')
AND DOB >= '2020-11-20';
Резултат:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 5 | 1 | 1 | Tweet | 2020-11-28 | +---------+-------------+-----------+-----------+------------+
Забележете, че заобиколих OR
условие със скоби. Направих това, за да уточня реда, в който трябва да се оценява всеки израз.,
По подразбиране AND
операторите се оценяват преди OR
оператори. SQL има дефиниран ред на приоритет на операторите в израз и това диктува, че AND
операторът се оценява преди OR
оператор.
Въпреки това, можете да използвате скоби, за да замените дефинирания приоритет на операторите в израз. Всичко в скоби се оценява, за да върне една стойност. Тази стойност може да се използва от всеки оператор извън тези скоби.
С други думи, можете да използвате скоби, за да посочите реда, в който искате всеки логически оператор да бъде оценен в израз.
За да демонстрирате този проблем, разгледайте резултатите, когато премахнем скобите.
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR PetName = 'Tweet'
AND DOB >= '2020-11-20';
Резултат:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | +---------+-------------+-----------+-----------+------------+
Сега получаваме различен резултат.
Това е така, защото заявката сега проверява PetName = 'Tweet' AND DOB >= '2020-11-20'
първо, след това проверява OR
израз PetName = 'Fluffy'
.
Сякаш бихме поставили скоби около AND
израз, като този:
SELECT * FROM Pets
WHERE PetName = 'Fluffy' OR (PetName = 'Tweet'
AND DOB >= '2020-11-20');
Въпреки това, за да объркаме нещата още повече, бихме могли да пренаредим заявката си, така че да не използваме скоби и въпреки това да получим същия резултат като първия ни пример със скоби.
Като това:
SELECT * FROM Pets
WHERE DOB >= '2020-11-20'
AND PetName = 'Fluffy' OR PetName = 'Tweet';
Резултат:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 5 | 1 | 1 | Tweet | 2020-11-28 | +---------+-------------+-----------+-----------+------------+
В този случай AND
експресията беше оценена първо, както се очакваше. Редът на изразите току-що се подреди така, че DOB >= '2020-11-20' AND PetName = 'Fluffy'
беше оценено първо, така че изключихме другия домашен любимец, наречен Fluffy, поради неговия DOB
попадат извън този диапазон. Едва след това беше OR
израз, оценен като алтернативно условие на нашето съществуващо AND
резултат.
Ето защо е силно препоръчително да използвате скоби, когато използвате множество оператори. Това гарантира, че заявката се оценява точно по начина, по който сте го възнамерявали да бъде.