SQL – поиск данных

Продолжаем знакомиться с SQL и в этом разделе нам предстоит узнать еще несколько операторов, с помощью которых можно улучшить поиск необходимой информации. Сегодня это будут операторы IN, BETWEEN, IS NULL. А также, мы познакомимся с шаблонами.

Начнем с оператора IN. В принципе, можно создавать запросы и без него, но он упрощает SQL код и делает его более наглядным. Сразу же рассмотрим пример:

SELECT * 
FROM tbPeoples
WHERE vcName = 'Андрей'
 OR vcName = 'ИВАН'
 OR vcName = 'ВАСЯ'
 OR vcName = 'ШВАРЦ'

В этом запросе мы выбираем все записи, в которых имя равно Андрей, или Иван, или Вася или Шварц. Этот запрос вполне работающий, но представьте, что так надо перечислить 20 или более имен. В этом случае запрос раздуется как земной шар.

Проблему решает оператор IN, который позволяет задать список значений, с которыми нужно производить сравнение. Список задается в скобках через запятую. Вот как этот же запрос будет выглядеть с оператором IN:

SELECT * 
FROM tbPeoples
WHERE vcName in ('Андрей', 'ИВАН', 'ВАСЯ', 'ШВАРЦ') 

Такой запрос писать намного проще, и он занимает меньше места. Если внимательно осмотреть два предыдущих запроса, то можно и без моих объяснений понять, что делает оператор IN. В данном случае он выведет все записи, в которых поле имени имеет одно из значений, перечисленных через запятую в скобках. В скобках после оператора IN мы перечисляем через запятую допустимые значения, с которыми необходимо производить сравнение.

Если используется числовое поле, то кавычки надо убрать. Например, следующий запрос выбирает все записи, в которых поле "idPosition" равно одному из следующих значений 1,2,3,4,5:

SELECT * 
FROM tbPeoples
WHERE idPosition in (1, 2, 3, 4, 5)

Вместе с оператором IN и со всеми последующими операторами вы можете смело использовать булевы операторы, например, в следующем запросе мы запрашиваем все строки, кроме перечисленых в операторе IN:

SELECT * 
FROM tbPeoples
WHERE idPosition NOT IN (1, 2, 3, 4, 5)

Этот запрос выбирает все записи, где поле "idPosition" НЕ РАВНО 1, 2, 3, 4, 5. Вот тут уже без булева оператора NOT не обойтись. С его помощью мы изменяем результат сравнения на противоположный.

Числа в скобках могут быть в любом порядке, но я не зря выбрал число, идущие последовательно. Просто хочется плавно перейти к следующему примеру – использование оператора BETWEEN. Смысл этого оператора в том, что он позволяет выбрать все записи, в которых указанное поле содержит значения в определенном диапазоне. Например, вам нужно выбрать все строки, в которых idPosition >=1 и меньше, либо равно 5. Это можно сделать следующим запросом, используя операторы сравнения:

SELECT * 
FROM tbPeoples
WHERE idPosition >= 1 AND idPosition <= 5

Но с помощью BETWEEN все делается намного красивее и элегантнее:

SELECT * 
FROM tbPeoples
WHERE idPosition BETWEEN 1 AND 5

Как видите, оператор BETWEEN также нужен только для удобства и вы можете спокойно обойтись без него. Как вы уже поняли, этот оператор задает диапазон чисел. Вы должны помнить, что конечные точки включаются в результат запроса.

Теперь посмотрим, как можно выбрать данные вне указанного диапазона без использования оператора BETWEEN. Для этого можно использовать один из следующих запросов:

SELECT * 
FROM tbPeoples
WHERE NOT (idPosition >= 1 AND idPosition <= 5)

Или

SELECT * 
FROM tbPeoples
WHERE idPosition < 1 OR idPosition > 5

Какой из вариантов использовать – зависит от личных предпочтений. Но та же задача с помощью BETWEEN решается более элегантно. Для этого необходимо написать NOT BETWEEN, как показано в следующем примере:

SELECT * 
FROM tbPeoples
WHERE idPosition NOT BETWEEN 1 AND 5

Этот оператор можно использовать и со строковыми полями. Например, нужно выбрать все строки, в которых имя начинается с буквы А до В:

SELECT * 
FROM tbPeoples
WHERE vcName BETWEEN 'А' AND 'В'

В результат этого запроса войдут такие имена как Андрей и Борис. Василий в результат не попадет, потому что это имя больше, чем просто буква В.

Переходим к оператору IS, а если быть точнее, то IS NULL и IS NOT NULL потому что IS отдельно не используется. С помощью этого оператора можно проверить значение на нулевое или не нулевое значение. Вспоминаем, что нулевое значение не равно 0 или "" (пустой строке). Нулевое значение NULL это не заполненное поле, где вообще нет никакого значения.

Этот оператор действительно может быть важным. Допустим, что вам нужно выбрать все записи, в которых поле Отчество не заполнено. Это поле может быть не заполнено, и иногда может потребоваться узнать, у каких записей оно содержит нулевое значение:

SELECT * 
FROM tbPeoples
WHERE vcSurName IS NULL

Когда мы заполняли базу данных значениями, то не рассчитали ее на этот оператор, поэтому все поля заполнены и в результат не попадет ни одной строки. С другой стороны, то что в результате мы не получили ни одной строки, говорит о том, что данные вполне корректны и поле отчество у всех записей заполнено.

Чтобы найти все не нулевые значения, используется оператор IS NOT NULL, Например, следующий запрос отображает все записи, в которых заполнено поле для хранения отчества 'vcSurName':

SELECT * 
FROM tbPeoples
WHERE vcSurName is NOT NULL

Благодаря оператору NOT, мы наоборот запрашиваем те строки, в которых поле фамилии не содержит нулевое значение.

Предыдущая глава

2.4. SQL - Булевы операторы

О блоге

Программист, автор нескольких книг серии глазами хакера и просто блогер. Интересуюсь безопасностью, хотя хакером себя не считаю

Обратная связь

Без проблем вступаю в неразборчивые разговоры по e-mail. Стараюсь отвечать на письма всех читателей вне зависимости от страны проживания, вероисповедания, на русском или английском языке.

Пишите мне