
- •Информационное обеспечение систем управления Построение запросов при работе с базой данных (Учебное пособие)
- •Тестовая база данных
- •Выборка данных. Команда select
- •Синтаксис оператора select
- •Простые варианты поиска данных
- •Упорядочение результата запроса. Предложение order by
- •Использование ключевого слова distinct
- •Предложение where
- •Синтаксис предложения where
- •Использование операторов сравнения
- •Использование варианта between
- •Проверка на присутствие в списке значений (вариант in)
- •Проверка на пустое значение
- •Поиск в строковых столбцах
- •Вариант like
- •Использование логических операций в условиях поиска
- •Порядок выполнения логических операций
- •Преобразование данных при выборке
- •Обобщение Данных с помощью Агрегатных Функций
- •Использование distinct с count
- •Предложение group by
- •Предложение having
- •Соединение таблиц
- •Внутренние соединения (связывание по равенству)
- •Внешние соединения
- •Левое внешнее соединение
- •Правое внешнее соединение
- •Полное внешнее соединение
- •Более сложные примеры соединений
- •Рефлексивное соединение, или самосоединение
- •Использование подзапросов в операторах sql
- •Выбор одного
- •Использование в подзапросе агрегатных функций
- •Связанные подзапросы
- •Использование оператора exists
- •Использование варианта in с подзапросами
- •Использование not exists
- •Объединение запросов
- •Команда union
- •Добавление данных. Команда insert
- •Добавление отдельной строки
- •Добавление группы строк
- •Обновление уже имеющихся данных. Команда update
- •Удаление данных из таблиц. Команда delete
- •Генераторы и их использование
- •Создание генераторов
- •Использование генераторов
- •Увеличение значения генератора
- •Получение значения генератора в приложение
- •Триггер
Проверка на присутствие в списке значений (вариант in)
В варианте IN вы можете задать список, среди элементов которого должно (или не должно) находиться значение указанного столбца:
<значение> [NOT] IN ({<значение> [, <значение>] ... | <список выбора>})
В этом варианте можно задать как явно представленный список литералов или выражений, так и указать оператор SELECT, который возвращает произвольное количество значений ровно одного столбца.
Найдем из нашего списка всех Юль, Юлиев и Юлиан:xvii
SELECT PR_NAME2 AS "Имя",
PR_NAME3 AS "Отчество",
PR_NAME AS "Фамилия",
PR_BIRTHDAY AS "Дата рождения"
FROM PERSON
WHERE PR_NAME2 IN ('Юлий','Юлия','Юлиана')
Листинг 11. Список Юль, Юлиев и Юлиан
Имя |
Отчество |
Фамилия |
Дата рождения |
Юлий |
Альбертович |
Алексеев |
19.09.1974 |
Юлия |
Геннадьевна |
Проскурякова |
29.09.1974 |
Юлия |
Игоревна |
Шатрова |
03.04.1958 |
Юлия |
Владимировна |
Янышева |
|
Юлия |
Дмитриевна |
Гаевская |
07.01.1959 |
Юлиана |
Валерьевна |
Коршунова |
02.03.1950 |
Юлия |
Валерьевна |
Кудинова |
29.05.1981 |
Юлия |
Владимировна |
Лаврова |
08.10.1949 |
Юлия |
Анатольевна |
Луковникова |
06.12.1979 |
Юлия |
Владимировна |
Мясникова |
01.09.1961 |
Юлия |
Витальевна |
Оборина |
02.10.1984 |
Тот же самый результат можно было бы получить введя запрос с операторами сравнения:xviii
SELECT PR_NAME2 AS "Имя",
PR_NAME3 AS "Отчество",
PR_NAME AS "Фамилия",
PR_BIRTHDAY AS "Дата рождения"
FROM PERSON
WHERE PR_NAME2 = 'Юлий' OR
PR_NAME2 = 'Юлия' OR
PR_NAME2 = 'Юлиана'
Проверка на пустое значение
Если столбцы ваших таблиц, входящих в условие поиска могут иметь пустое значение, то вам следует проявлять бдительность, задавая проверку их значений на NULL. Всегда следует перед выполнением "нормальных" проверок уточнить, не является ли значение пустым. Мы можем использовать два варианта:
<значение> IS NULL
и
<значение> IS NOT NULL
Еще раз повторю, это действительно может стать источником больших ошибок — перед обычной, нормальной, проверкой проверяйте значения на NULL.
Поиск в строковых столбцах
Для строковых значений используются варианты LIKE, CONTAINING и STARTING WITH. Напомню синтаксис:
...
| <значение> [NOT] LIKE <значение>
| <значение> [NOT] CONTAINING <значение>
| <значение> [NOT] STARTING [WITH] <значение>
...
Вариант like
В варианте LIKE строковое значение должно содержать указанные символы.
В этом варианте можно использовать шаблонные символы: процент (%) означает любое, в том числе и нулевое количество любых символов, знак подчеркивания (_) означает ровно один любой символ. LIKE является чувствительным к регистру, т. е. различает строчные и прописные буквы. На самом деле это неприятное ограничение можно очень легко и безболезненно обойти, применяя для имени столбца, используемого в выражении, функцию UPPER, которая возвращает все буквенные данные в верхнем регистре в любом, допустимом для набора используемых символов, алфавите.
Выберем строки из таблицы PERSON, введя условие, по которому фамилия должна заканчиваться на "ОВ". Для этого перед буквами "ОВ" используем шаблонный символ %.xix
SELECT PR_NAME2 AS "Имя",
PR_NAME3 AS "Отчество",
PR_NAME AS "Фамилия"
FROM PERSON
WHERE PR_NAME LIKE '%ов'
Листинг 12. Выборка людей в варианте LIKE '%в'
Имя |
Отчество |
Фамилия |
Максим |
Владимирович |
Бычков |
Олег |
Владимирович |
Лядов |
Евгений |
Андреевнич |
Болотов |
Олег |
Сергеевич |
Феофилактов |
Явар |
Гейдар |
Джафаров |
Александр |
Михайлович |
Жданов |
Алексей |
Викторович |
Лобанов |
Сергей |
Анатольевич |
Лубов |
Алексей |
Олегович |
Львов |
Станислав |
Витальевич |
Приданников |
Сергей |
Анатольевич |
Ременников |
Эдуард |
Владимирович |
Седов |
Олег |
Николаевич |
Фролов |
Александр |
Александрович |
Чудинов |
Николай |
Викторович |
Шатров |
Руслан |
Рафаилович |
Амерзянов |
Константин |
Игоревич |
Баталов |
Сергей |
Валерьевич |
Бутаков |
Василий |
Александрович |
Глазов |
Дмитрий |
Федорович |
Глумов |
Михаил |
Валерьевич |
Ермаков |
Максим |
Владимирович |
Захаров |
Илья |
Борисович |
Карманов |
Владимир |
Николаевич |
Карпов |
Вячеслав |
Валерьевич |
Красногоров |
Станислав |
Евгеньевич |
Кузнецов |
Олег |
Александрович |
Куликов |
Максим |
Николаевич |
Кучеров |
Владимир |
Николаевич |
Лобанов |
Дмитрий |
Алексеевич |
Назаров |
Дмитрий |
Аресентьевич |
Наумов |
Эдуард |
Булатович |
Нигаметзянов |
Алексей |
Викторович |
Спешков |
Петр |
Сергеевич |
Теплоухов |
Расширим условие поиска, выполним:xx
SELECT PR_NAME2 AS "Имя",
PR_NAME3 AS "Отчество",
PR_NAME AS "Фамилия"
FROM PERSON
WHERE UPPER(PR_NAME) LIKE '%ов%'
Мы добавили еще знак процента в условие: LIKE '%ов%'. То есть не только до, но и после символов "ов" может располагаться любое, в том числе и нулевое, количество любых символов. Теперь мы также получаем и женские фамилии.
Поскольку вариант LIKE является чувствительным к регистру, у вас, казалось бы, должны быть сложности при поиске данных, если вы не следовали моим мудрым советам и не вводили подобные строки в верхнем регистре. На самом деле ничего особенно страшного не произойдет. Даже если данные у вас введены вперемежку и прописными, и строчными буквами, вы можете использовать функцию UPPER, которая переведет все буквы строки в верхний регистр. Повторю — это относится только к символам алфавита, поддерживаемого вашим набором символов для этого столбца. Предыдущий запрос можно записать следующим образом: xxi
SELECT PR_NAME2 AS "Имя",
PR_NAME3 AS "Отчество",
PR_NAME AS "Фамилия"
FROM PERSON
WHERE UPPER(PR_NAME) LIKE '%ов%'
Теперь покажем как воспользоваться знаком подчеркивания (_) . Найдем всех людей у которых “ов” начинается со второго символа:xxii
SELECT PR_NAME2 AS "Имя",
PR_NAME3 AS "Отчество",
PR_NAME AS "Фамилия"
FROM PERSON
WHERE UPPER(PR_NAME) LIKE ‘_ов%'
В результате получим
Листинг 13. Список людей, у которых в фамилии после первого символа следует 'ов' (выборка в варианте LIKE '_ов%')
Имя |
Отчество |
Фамилия |
Вера |
Валерьевна |
Новикова |
Марина |
Рафаиловна |
Новикова |
Ольга |
Викторовна |
Новосёлова |