- Простые SQL запросы — короткая справка и примеры
- Содержание
- Простые SQL запросы
- SQL запрос: получение указанных (нужных) полей из таблицы
- SQL запрос: вывод записей из таблицы исключая дубликаты
- SQL запрос: вывод записей из таблицы по заданному условию
- SQL запрос: вывод записей из таблицы с упорядочиванием
- SQL запрос: подсчет количества записей
- SQL запрос: вывод нужного диапазона записей
- SQL запросы с условиями
- SQL запрос: конструкция AND (И)
- SQL запрос: конструкция OR (ИЛИ)
- SQL запрос: конструкция AND NOT (И НЕ)
- SQL запрос: конструкция IN (В)
- SQL запрос: конструкция NOT IN (НЕ В)
- SQL запрос: конструкция IS NULL (пустые или НЕ пустые значения)
- SQL запрос: конструкция LIKE
- SQL запрос: конструкция BETWEEN
- Сложные SQL запросы
- SQL запрос: объединение нескольких запросов
- SQL запрос: подсчеты значений поля MAX, MIN, SUM, AVG, COUNT
- Вывод одного, максимального значения счетчика в таблице:
- Вывод одного, минимальный значения счетчика в таблице:
- Вывод суммы всех значений счетчиков в таблице:
- Вывод среднего значения счетчика в таблице:
- Вывод количества счетчиков в таблице:
- Вывод количества счетчиков в цехе №1, в таблице:
- SQL запрос: группировка записей
- SQL запрос: использование нескольких таблиц через алиас (alias)
- Вложенные подзапросы
- SQL запросы изменяющие данные
- SQL запрос: INSERT
- Вариант №1. Часто используется инструкция:
- Вариант №2. Удобнее использовать стиль:
- Основные недостатки:
- Основные преимущества:
- SQL запрос: UPDATE
- SQL запрос: DELETE
- SQL рекомендации
- Дополнительная информация по теме
- Как sql-запросом извлечь из базы данных информацию, которой там нет
- Условия отбора в операторе SELECT в запросах SQL на практике
- Vovan_ST
- Сравнение (=, о, , >=)
- Выборка одной строки
- Значения NULL
- Проверка на принадлежность диапазону (BETWEEN)
- Проверка наличия во множестве (IN)
- Проверка на соответствие шаблону (LIKE)
- Подстановочные знаки
- Управляющие символы *
- Проверка на равенство NULL (IS NULL)
- Составные условия отбора (AND, OR и NOT)
Простые SQL запросы — короткая справка и примеры
Содержание
Простые SQL запросы
Запросы написаны без экранирующих кавычек, так как у MySQL, MS SQL и PostGree они разные.
SQL запрос: получение указанных (нужных) полей из таблицы
Получаем список записей: ВСЕ страны и их население. Название нужных полей указываются через запятую.
* обозначает все поля. То есть, будут показы АБСОЛЮТНО ВСЕ поля данных.
SQL запрос: вывод записей из таблицы исключая дубликаты
Получаем список записей: страны, где находятся наши пользователи. Пользователей может быть много из одной страны. В этом случае это ваш запрос.
SQL запрос: вывод записей из таблицы по заданному условию
Получаем список записей: страны, где количество людей больше 100 000 000.
SQL запрос: вывод записей из таблицы с упорядочиванием
Получаем список записей: города в алфавитном порядке. В начале А, в конце Я.
Получаем список записей: города в обратном (DESC) порядке. В начале Я, в конце А.
SQL запрос: подсчет количества записей
Получаем число (количество) записей в таблице. В данном случае НЕТ списка записей.
SQL запрос: вывод нужного диапазона записей
Получаем 2 (вторую) и 3 (третью) запись из таблицы. Запрос полезен при создании навигации на WEB страницах.
SQL запросы с условиями
Вывод записей из таблицы по заданному условию с использованием логических операторов.
SQL запрос: конструкция AND (И)
Получаем список записей: города из России И имеют доступ к нефти. Когда используется оператор AND, то должны совпадать оба условия.
SQL запрос: конструкция OR (ИЛИ)
Получаем список записей: все города из России ИЛИ США. Когда используется оператор OR, то должно совпадать ХОТЯ БЫ одно условие.
SQL запрос: конструкция AND NOT (И НЕ)
Получаем список записей: все пользователи из России И сделавших НЕ МЕНЬШЕ 7 комментариев.
SQL запрос: конструкция IN (В)
Получаем список записей: все пользователи, которые проживают в (IN) (России, или Болгарии, или Китая)
SQL запрос: конструкция NOT IN (НЕ В)
Получаем список записей: все пользователи, которые проживают не в (NOT IN) (России или Китае).
SQL запрос: конструкция IS NULL (пустые или НЕ пустые значения)
Получаем список записей: все пользователи, где status не определен. NULL это отдельная тема и поэтому она проверяется отдельно.
Получаем список записей: все пользователи, где status определен (НЕ НОЛЬ).
SQL запрос: конструкция LIKE
Получаем список записей: пользователи, у которых фамилия начинается с комбинации «Иван». Знак % означает ЛЮБОЕ количество ЛЮБЫХ символов. Чтобы найти знак % требуется использовать экранирование «Иван\%».
SQL запрос: конструкция BETWEEN
Получаем список записей: пользователи, которые получает зарплату от 25000 до 50000 включительно.
Логических операторов ОЧЕНЬ много, поэтому детально изучите документацию по SQL серверу.
Сложные SQL запросы
SQL запрос: объединение нескольких запросов
Получаем список записей: пользователи, которые зарегистрированы в системе, а также те пользователи, которые зарегистрированы на форуме отдельно. Оператором UNION можно объединить несколько запросов. UNION действует как SELECT DISTINCT, то есть отбрасывает повторяющиеся значения. Чтобы получить абсолютно все записи, нужно использовать оператор UNION ALL.
SQL запрос: подсчеты значений поля MAX, MIN, SUM, AVG, COUNT
Вывод одного, максимального значения счетчика в таблице:
Вывод одного, минимальный значения счетчика в таблице:
Вывод суммы всех значений счетчиков в таблице:
Вывод среднего значения счетчика в таблице:
Вывод количества счетчиков в таблице:
Вывод количества счетчиков в цехе №1, в таблице:
Это самые популярные команды. Рекомендуется, где это возможно, использовать для подсчета именно SQL запросы такого рода, так как ни одна среда программирования не сравнится в скорости обработки данных, чем сам SQL сервер при обработке своих же данных.
SQL запрос: группировка записей
Получаем список записей: с названием континента и с суммой площадей всех их стран. То есть, если есть справочник стран, где у каждой страны записана ее площадь, то с помощью конструкции GROUP BY можно узнать размер каждого континента (на основе группировки по континентам).
SQL запрос: использование нескольких таблиц через алиас (alias)
Получаем список записей: заказы от покупателей, которые проживают только в Тюмени.
На самом деле, при правильном запроектированной базе данных данного вида запрос является самым частым, поэтому в MySQL был введен специальный оператор, который работает в разы быстрее, чем выше написанный код.
Рекомендуется использовать в запросах именно такой вид оформления SQL запросов.
Вложенные подзапросы
Получаем одну запись: информацию о пользователе с максимальным окладом.
Внимание! Вложенные подзапросы являются одним из самых узких мест в SQL серверах. Совместно со своей гибкостью и мощностью, они также существенно увеличивают нагрузку на сервер. Что приводит к катастрофическому замедлению работы других пользователей. Очень часты случаи рекурсивных вызовов при вложенных запросах. Поэтому настоятельно рекомендую НЕ использовать вложенные запросы, а разбивать их на более мелкие. Либо использовать вышеописанную комбинацию LEFT JOIN. Помимо этого данного вида запросы являются повышенным очагом нарушения безопасности. Если решили использовать вложенные подзапросы, то проектировать их нужно очень внимательно и первоначальные запуски сделать на копиях баз (тестовые базы).
SQL запросы изменяющие данные
SQL запрос: INSERT
Инструкция INSERT позволяют вставлять записи в таблицу. Простыми словами, создать строчку с данными в таблице.
Вариант №1. Часто используется инструкция:
В таблицу «table_name» будет вставлено 2 (два) пользователя сразу.
Вариант №2. Удобнее использовать стиль:
В этом есть свои преимущества и недостатки.
Основные недостатки:
- Множество мелких SQL запросов выполняются чуть медленнее, чем один большой SQL запрос, но при этом другие запросы будут стоять в очереди на обслуживание. То есть, если большой SQL запрос будет выполняться 30 минут, то в все это время остальные запросы будут курить бамбук и ждать своей очереди.
- Запрос получается массивнее, чем предыдущий вариант.
Основные преимущества:
- Во время мелких SQL запросов, другие SQL запросы не блокируются.
- Удобство в чтении.
- Гибкость. В этом варианте, можно не соблюдать структуру, а добавлять только необходимые данные.
- При формировании подобным образом архивов, можно легко скопировать одну строчку и запустить ее через командную строку (консоль), тем самым не восстанавливая АРХИВ целиком.
- Стиль записи схож с инструкцией UPDATE, что легче запоминается.
SQL запрос: UPDATE
В таблице «table_name» в записи с номером будет изменены значения полей user_login и user_surname на указанные значения.
SQL запрос: DELETE
В таблице table_name будет удалена запись с id номером 3.
SQL рекомендации
- Все названия полей рекомендуются писать маленькими буквами и если надо, разделять их через принудительный пробел «_» для совместимости с разными языками программирования, таких как Delphi, PHP, Perl, Python и Ruby.
- SQL команды писать БОЛЬШИМИ буквами для удобочитаемости. Помните всегда, что после вас могут читать код и другие люди, а скорее всего вы сами через N количество времени.
- Называть поля с начала существительное, а потом действие. Например: city_status, user_login, user_name.
- Стараться избегать слов резервных в разных языках которые могут вызывать проблемы в языках SQL, PHP или Perl, типа (name, count, link). Например: link можно использовать в MS SQL, но в MySQL зарезервировано.
Данный материал является короткой справкой для повседневной работы и не претендует на супер мега авторитетный источник, коим является первоисточник SQL запросов той или иной базы данных.
Дополнительная информация по теме
Как правильно формулировать поисковой запрос и все о перспективах развития поисковых систем и новых типов поисковых запросов
В статье рассматриваются популярные варианты для ночной работы в сети Интернет для подработки
Статья, о новых стандартах sim карт на телефонном рынке, который сейчас активной обсуждается и способен вытеснить обычные sim карты
Подробное описание истории и устройство процессоров компании AMD, с графическими схемами и сравнительными характеристиками
Источник
Как sql-запросом извлечь из базы данных информацию, которой там нет
Под таким хитрым заголовком скрывается достаточно несложная задача, но сначала небольшое вступление:
Приходят пользователи и просят: «Вот мы внесли данные в базу, а скажите нам, чего не хватает? Какие данные мы ещё не внесли в базу и их не хватает для полного счастья?»
Первая (и скажем честно, весьма глупая) реакция: «Как же я вам найду то, чего нет в базе данных?».
Но отбросим эмоции и применим логику. Ведь, как правило, требуются данные, формирование которых подчиняется некоему правилу — номера квитанций, справок и так далее… И я исхожу из того, что все эти номера и идентификаторы могут быть преобразованы в натуральную последовательность.
То есть задача будет сформулирована следующим образом: в базе данных хранится последовательность натуральных чисел, в которой есть пропуски, и необходимо вывести пропущенные числа для пользователя.
В такой формулировке задача уже выглядит достаточно простой. Более того — возникает желание реализовать эту задачу одним единственным sql-запросом.
Давайте создадим таблицу и заполним какими-нибудь данными.
Основная идея следующая: сравнить таблицу с самой собой же и для каждого значения ИКС найти минимальное ИГРЕК (которое всё же больше ИКСа), где (ИКС + 1) и (ИГРЕК — 1) будут нашими границами пропущенных диапазонов чисел. Добавив логичное условие, что, (ИКС + 1) должен быть не меньше (ИГРЕК — 1) получим следующие диапазоны: от 4 до 4, от 6 до 6, от 10 до 10 и от 13 до 15.
Какие есть нюансы:
1) Может быть пропущен первый элемент последовательности (в нашем случае это 1)
2) Неизвестен последний элемент последовательности (а вдруг это 22). Можно, конечно, запрашивать эту информацию у пользователя, но опыт подсказывает, что лучше этого избегать.
3) Диапазон «от 4 до 4» выглядит глючно, надо заменить просто на одно число
4) Результат всё-таки желательно получить значением одной строки, а не набором строк
Учитываем замечания и получаем вариант скрипта под MySQL:
и вариант под Oracle:
Результатом их выполнения является строка ‘1-2, 4, 6, 10, 13-15, 18. ‘
Во-первых, эта строка содержит то, что хотели пользователи.
Во-вторых, результат выглядит понятно для любого пользователя.
И в-главных, запрос выводит данные, которые действительно в базе данных не хранятся!
UPD1:
Большое спасибо всем, кто предложил варианты по улучшению скриптов, да и просто высказал интерес к этому вопросу.
Как это часто бывает, комментарии оказались интереснее и полезнее первоначальной статьи.
Действительно, стоило отметить, что нюанс номер 4 не реализуется стандартным синтаксисом SQL и для этой задачи необходимо привлекать дополнительный функционал, реализуемый на каждой отдельной СУБД по своему.
Ниже привожу скрипты, вытянутые мной из комментариев к статье.
Источник
Условия отбора в операторе SELECT в запросах SQL на практике
Vovan_ST
ИТ специалист со стажем. Автор статьи. Профиль
В SQL используется множество условий отбора, позволяющих эффективно и естественно создавать различные типы запросов. Ниже рассматриваются пять основных условий отбора (в стандарте ANSI/ISO они называются предикатами):
- Сравнение. Значение одного выражения сравнивается со значением другого выражения. Например, такое условие отбора используется для выбора всех офисов, находящихся в восточном регионе, или всех служащих, фактические объемы продаж которых превышают плановые.
- Проверка на принадлежность диапазону. Проверяется, попадает ли указанное значение в определенный диапазон значений. Например, такое условие отбора используется для нахождения служащих, фактические объемы продаж которых превышают $100000 , но меньше $500000 .
- Проверка наличия во множестве. Проверяется, совпадает ли значение выражения с одним из значений из заданного множества. Например, такое условие отбора используется для выбора офисов, расположенных в Нью- Йорке, Чикаго или Лос-Анджелесе.
- Проверка на соответствие шаблону. Проверяется, соответствует ли строковое значение, содержащееся в столбце, определенному шаблону. Например, такое условие отбора используется для выбора клиентов, имена которых начинаются с буквы » Е «.
- Проверка на равенство значениюNULL. Проверяется, содержится ли в столбце значение NULL . Например, такое условие отбора используется для нахождения всех служащих, которым еще не был назначен менеджер.
Сравнение (=, о, , >=)
Наиболее распространенным условием отбора в SQL является сравнение. При сравнении SQL вычисляет и сравнивает значения двух SQL-выражений для каждой строки данных. Выражения могут быть как очень простыми, например содержать одно имя столбца или константу, так и более сложными, например содержать арифметические операции. В SQL имеется шесть различных способов сравнения двух выражений, показанных на рис. 6.
Рис. 6. Синтаксическая диаграмма сравнения
Ниже приведены типичные примеры сравнения.
Найти имена всех служащих, принятых на работу до 2006 года.
Заметим, что не все SQL-продукты обрабатывают даты одинаково, поскольку разные производители были вынуждены поддерживать даты еще до того, как был создан стандарт SQL. Формат YYYY-MM-DD , показанный в предыдущем примере, работает в большинстве продуктов, но кое-где его следует изменить. В Oracle, например, вам надо либо заменить формат даты на принятый в Oracle по умолчанию ( ’01-JAN-88′ ), либо изменить формат по умолчанию для вашей сессии при помощи следующей команды:
Вывести список офисов, фактические объемы продаж в которых составили менее 80 процентов от плановых.
Вывести список офисов, менеджером которых не является служащий с идентификатором 108.
Как показано на рис. 6, в соответствии со спецификацией ANSI/ISO проверка на неравенство записывается как А <> B . В ряде реализаций SQL используются альтернативные системы записи, как, например, А != B (поддерживается в SQL Server, DB2, Oracle и MySQL). Иногда такая форма записи является одной из допустимых, а иногда — единственной.
Когда СУБД сравнивает значения двух выражений, могут быть получены три результата:
- если сравнение истинно, то результат проверки имеет значение TRUE ;
- если сравнение ложно, то результат проверки имеет значение FALSE ;
- если хотя бы одно из двух выражений имеет значение NULL , то результатом сравнения будет NULL .
Выборка одной строки
Чаще всего используется сравнение, в котором определяется, равно ли значение столбца некоторой константе. Если этот столбец представляет собой первичный ключ, то запрос возвращает всего одну строку, как в следующем примере.
Узнать имя и лимит кредита клиента с идентификатором 2107.
Этот тип запросов лежит в основе выборки из баз данных на основе форм вебстраниц. Пользователь вводит в форму идентификатор клиента, и программа использует его при создании и выполнении запроса. После этого она отображает извлеченные данные в форме. Обратите внимание на то, что инструкции SQL, предназначенные для выбора конкретного клиента по идентификатору, как в предыдущем примере, и для выбора всех клиентов, удовлетворяющих определенным параметрам (например, с лимитом кредита более $25000), имеют абсолютно одинаковый формат.
Значения NULL
Использование значений NULL в запросах может привести к »очевидным» предположениям, которые истинны только на первый взгляд, но на самом деле таковыми не являются. Например, можно предположить, что каждая строка из таблицы SALESREPS будет содержаться в результатах только одного из двух следующих запросов.
Вывести список служащих, превысивших плановый объем продаж.
Вывести список служащих, не выполнивших план.
Однако результаты этих запросов состоят из семи и двух строк соответственно, что дает в сумме девять строк, в то время как в таблице находится десять строк. Строка для Тома Снайдера (Tom Snyder) содержит значение NULL в столбце QUOTA , поскольку ему еще не был назначен плановый объем продаж. Эта строка не вошла ни в один запрос.
Как показывает приведенный пример, при определении условия отбора необходимо помнить об обработке значений NULL. В трехзначной логике, принятой в SQL, условие отбора может иметь значения TRUE , FALSE или NULL . А в результаты запроса попадают только те игроки, для которых условие отбора равно TRUE . Мы еще встретимся с NULL позже в этой статье.
Проверка на принадлежность диапазону (BETWEEN)
Следующей формой условия отбора является проверка на принадлежность диапазону значений (оператор BETWEEN . AND ), схематически изображенная на рис. 7. При этом проверяется, находится ли элемент данных между двумя заданными значениями. В условие отбора входят три выражения. Первое выражение определяет проверяемое значение; второе и третье выражения определяют нижнюю и верхнюю границы проверяемого диапазона. Типы данных трех выражений должны быть сравнимыми.
Рис. 7. Синтаксическая диаграмма проверки на принадлежность диапазону (between)
Следующий пример иллюстрирует типичную процедуру проверки на принадлежность диапазону.
Найти все заказы, сделанные в последнем квартале 2007 года.
При проверке на принадлежность диапазону верхняя и нижняя границы считаются частью диапазона, поэтому в результаты запроса вошли заказы, сделанные 1 октября и 31 декабря. Далее приведен другой пример проверки на принадлежность диапазону.
Найти заказы, стоимости которых попадают в различные диапазоны.
Инвертированная версия проверки на принадлежность диапазону ( NOT between ) позволяет выбрать значения, которые лежат за пределами диапазона, как в следующем примере.
Вывести список служащих, фактические объемы продаж которых не попадают в диапазон от 80 до 720 процентов плана.
Проверяемое выражение, задаваемое в операторе BETWEEN , может быть любым допустимым выражением SQL, однако на практике оно обычно представляет собой имя столбца.
В стандарте ANSI/ISO определены относительно сложные правила обработки значений NULL в проверке BETWEEN .
- Если проверяемое выражение имеет значение NULL либо оба выражения, определяющие диапазон, равны NULL , то проверка BETWEEN возвращает NULL .
- Если выражение, определяющее нижнюю границу диапазона, имеет значение NULL , то проверка between возвращает false, когда проверяемое значение больше верхней границы диапазона, и NULL — в противном случае.
- Если выражение, определяющее верхнюю границу диапазона, имеет значение NULL , то проверка between возвращает false, когда проверяемое значение меньше нижней границы диапазона, и NULL — в противном случае.
Однако прежде чем полагаться на эти правила, неплохо было бы поэкспериментировать со своей СУБД.
Необходимо отметить, что проверка на принадлежность диапазону не расширяет возможности SQL, поскольку ее можно выразить в виде двух сравнений. Проверка
полностью эквивалентна сравнению
Тем не менее проверка BETWEEN является более простым способом выразить условие отбора в терминах диапазона значений.
Проверка наличия во множестве (IN)
Еще одним распространенным условием отбора является проверка на наличие во множестве (in), схематически изображенная на рис. 8. В этом случае выполняется проверка, соответствует ли значение какому-либо элементу заданного списка. Ниже приведен ряд запросов с использованием проверки наличия во множестве.
Рис. 8. Синтаксическая диаграмма проверки наличия во множестве (IN)
Вывести список служащих, которые работают в Нью-Йорке, Атланте или Денвере.
Найти все заказы, сделанные в пятницы в январе 2008 года.
Найти все заказы, полученные четырьмя конкретными служащими.
С помощью проверки NOT IN можно проверить, что элемент данных не является членом заданного множества. Проверяемое выражение в операторе IN может быть любым допустимым SQL-выражением, однако обычно оно представляет собой короткое имя столбца, как в предыдущих примерах. Если результатом проверяемого выражения является значение null, то проверка in также возвращает NULL . Все элементы в списке заданных значений должны иметь один и тот же тип данных, который должен быть сравним с типом данных проверяемого выражения.
Как и проверка BETWEEN , проверка IN не добавляет в возможности SQL ничего нового, поскольку условие
полностью эквивалентно условию
Однако проверка IN предлагает гораздо более эффективный способ выражения условия отбора, особенно если множество содержит большое число элементов.
В стандарте ANSI/ISO не определено максимальное количество элементов множества, и в большинстве СУБД явный верхний предел не задан. По соображениям переносимости, лучше избегать множеств, содержащих один элемент.
Их следует заменять простым сравнением:
Проверка на соответствие шаблону (LIKE)
Для выборки строк, в которых содержимое некоторого текстового столбца совпадает с заданным текстом, можно использовать простое сравнение. Например, следующий запрос извлекает строку из таблицы CUSTOMERS по имени.
Показать лимит кредита для Smithson Corp.
Однако очень легко можно забыть, какое именно название носит интересующая нас компания: «Smith», «Smithson» или «Smithsonian». Проверка на соответствие шаблону позволяет выбрать из базы данных строки на основе частичного соответствия имени клиента.
Проверка на соответствие шаблону (оператор LIKE ), схематически изображенная на рис. 9, позволяет определить, соответствует ли значение данных в столбце некоторому шаблону. Шаблон представляет собой строку, в которую может входить один или несколько подстановочных символов. Эти символы интерпретируются особым образом.
Рис. 9. Синтаксическая диаграмма проверки на соответствие шаблону (LIKE)
Подстановочные знаки
Подстановочный знак % совпадает с любой последовательностью из нуля или более символов. Ниже приведена измененная версия предыдущего запроса, в которой используется шаблон, содержащий знак процента.
Оператор like указывает SQL, что необходимо сравнивать содержимое столбца NAME с шаблоном «Smith% Corp.». Этому шаблону соответствуют все перечисленные ниже имена.
А вот эти имена данному шаблону не соответствуют.
Подстановочный знак _ (символ подчеркивания) совпадает с любым отдельным символом. Например, если вы уверены, что название компании либо «Smithson», либо «Smithsen», то можете воспользоваться следующим запросом.
В таком случае шаблону будет соответствовать любое из представленных ниже имен.
Smithson Corp.
Smithsen Corp.
Smithsun Corp.
А вот ни одно из следующих ему соответствовать не будет.
Подстановочные знаки можно помещать в любое место строки шаблона, и в одной строке может содержаться несколько подстановочных знаков. Следующий запрос допускает как написание «Smithson» и «Smithsen», так и любое другое окончание названия компании, включая «Corp.», «Inc.» или какое-то другое.
С помощью формы NOT LIKE можно находить строки, которые не соответствуют шаблону. Проверку LIKE можно применять только к столбцам, имеющим строковый тип данных. Если в столбце содержится значение NULL , то результатом проверки like будет null .
Вероятно, вы уже встречались с проверкой на соответствие шаблону в операционных системах, имеющих интерфейс командной строки (таких, как Unix). Обычно в этих системах звездочка ( * ) используется для тех же целей, что и символ процента ( % ) в SQL, а вопросительный знак ( ? ) соответствует символу подчеркивания ( _ ) в SQL, но в целом возможности работы с шаблонами строк в них такие же.
Управляющие символы *
При проверке строк на соответствие шаблону может оказаться, что подстановочные знаки входят в строку символов в качестве литералов. Например, нельзя проверить, содержится ли знак процента в строке, просто включив его в шаблон, поскольку SQL будет считать этот знак подстановочным. Как правило, это не вызывает серьезных проблем, поскольку подстановочные знаки довольно редко встречаются в именах, названиях товаров и других текстовых данных, которые обычно хранятся в базе данных.
В стандарте ANSI/ISO определен способ проверки наличия в строке литералов, использующихся в качестве подстановочных знаков. Для этого применяются управляющие символы. Когда в шаблоне встречается такой символ, то символ, следующий непосредственно за ним, считается не подстановочным знаком, а литералом. Непосредственно за управляющим символом может следовать либо один из двух подстановочных символов, либо сам управляющий символ, поскольку он также приобретает в шаблоне особое значение.
Символ пропуска определяется в виде строки, состоящей из одного символа, и предложения ESCAPE (рис. 9). Ниже приведен пример использования знака доллара ( $ ) в качестве управляющего символа.
Найти товары, коды которых начинаются с четырех букв «A%ВС».
Первый символ процента в шаблоне, следующий за управляющим символом, считается литералом, второй — подстановочным символом.
Управляющие символы — распространенная практика в приложениях проверки на соответствие шаблону; именно поэтому они были включены и в стандарт ANSI/ISO. Однако они не входили в ранние реализации SQL и поэтому не очень распространены. Для обеспечения переносимости приложений следует избегать использования предложения ESCAPE .
Проверка на равенство NULL (IS NULL)
Значения NULL обеспечивают возможность трехзначной логики в условиях отбора. Для любой заданной строки результат применения условия отбора может быть TRUE , FALSE или NULL (в случае, когда в одном из столбцов содержится значение null ). Иногда необходимо явно проверять значения столбцов на равенство NULL и непосредственно обрабатывать их. Для этого в SQL имеется специальная проверка IS NULL , синтаксическая диаграмма которой изображена на рис. 10.
Рис. 10. Синтаксическая диаграмма проверки на равенство null (is null)
В следующем запросе проверка на равенство NULL используется для нахождения в учебной базе данных служащего, который еще не был закреплен за офисом.
Найти служащего, который еще не закреплен за офисом.
Инвертированная форма проверки на равенство NULL ( IS NOT NULL ) позволяет отыскать строки, которые не содержат значений null .
Вывести список служащих, которые уже закреплены за офисами.
В отличие от условий отбора, описанных выше, проверка на равенство NULL не может возвратить значение NULL в качестве результата. Она всегда возвращает TRUE ИЛИ FALSE .
Может показаться странным, что нельзя проверить значение на равенство NULL с помощью операции сравнения, например:
Ключевое слово NULL здесь нельзя использовать, поскольку на самом деле это не настоящее значение; это просто свидетельство того, что значение неизвестно. Даже если бы сравнение
было возможно, правила обработки значений NULL в сравнениях привели бы к тому, что оно вело бы себя не так, как ожидается. Если бы СУБД обнаружила строку, в которой столбец REP_OFFICE содержит значение null, выполнилась бы следующая проверка.
Что будет результатом этого сравнения: TRUE или FALSE ? Так как значения по обе стороны знака равенства неизвестны, то, в соответствии с правилами логики SQL, условие отбора должно вернуть значение NULL . Поскольку условие отбора возвращает результат, отличный от true , строка исключается из таблицы результатов запроса — это противоположно тому, к чему вы стремились! Из-за правил обработки значений null в SQL необходимо использовать проверку IS NULL .
Составные условия отбора (AND, OR и NOT)
Простые условия отбора, описанные в предыдущих разделах, после применения к некоторой строке возвращают значения TRUE , FALSE или NULL . С помощью правил логики эти простые условия можно объединять в более сложные, как изображено на рис. 11. Обратите внимание на то, что условия отбора, объединяемые с помощью операторов AND , OR и NOT , сами могут быть составными.
Рис. 11. Синтаксическая диаграмма предложения WHERE
Оператор OR используется для объединения двух условий отбора, из которых или одно, или другое (или оба) должно быть истинным.
Найти служащих, у которых фактический объем продаж меньше планового или меньше $300000.
Для объединения двух условий отбора, оба из которых должны быть истинными, следует использовать оператор AND .
Найти служащих, у которых фактический объем продаж меньше планового и меньше $300000.
И наконец, можно использовать оператор NOT, чтобы выбрать строки, для которых условие отбора ложно.
Найти служащих, у которых фактический объем продаж меньше планового, но не меньше $150000.
С помощью логических операторов AND , OR , NOT и круглых скобок можно создавать очень сложные условия отбора, как в следующем примере.
Найти всех служащих, которые: (а) работают в Денвере, Нью-Йорке или Чикаго; или (б) не имеют менеджера и были приняты на работу после июня 2006 года; или (в) у которых продажи превысили плановый объем, но не превысили $600000.
Лично для меня остается загадкой, зачем может понадобиться такой список имен, однако приведенный пример является иллюстрацией довольно сложного запроса.
Как и в случае с простыми условиями отбора, значения NULL влияют на интерпретацию составных условий отбора, вследствие чего результаты последних становятся не столь очевидными. В частности, результатом операции NULL OR TRUE является значение TRUE , а не NULL , как можно было ожидать. Табл. 1-3 являются таблицами истинности для операторов AND , OR и NOT соответственно в случае тернарной логики (со значениями NULL ).
Таблица 1. Таблица истинности оператора and
Источник