Sql вывести которые не содержат

Содержание
  1. Простые SQL запросы — короткая справка и примеры
  2. Содержание
  3. Простые SQL запросы
  4. SQL запрос: получение указанных (нужных) полей из таблицы
  5. SQL запрос: вывод записей из таблицы исключая дубликаты
  6. SQL запрос: вывод записей из таблицы по заданному условию
  7. SQL запрос: вывод записей из таблицы с упорядочиванием
  8. SQL запрос: подсчет количества записей
  9. SQL запрос: вывод нужного диапазона записей
  10. SQL запросы с условиями
  11. SQL запрос: конструкция AND (И)
  12. SQL запрос: конструкция OR (ИЛИ)
  13. SQL запрос: конструкция AND NOT (И НЕ)
  14. SQL запрос: конструкция IN (В)
  15. SQL запрос: конструкция NOT IN (НЕ В)
  16. SQL запрос: конструкция IS NULL (пустые или НЕ пустые значения)
  17. SQL запрос: конструкция LIKE
  18. SQL запрос: конструкция BETWEEN
  19. Сложные SQL запросы
  20. SQL запрос: объединение нескольких запросов
  21. SQL запрос: подсчеты значений поля MAX, MIN, SUM, AVG, COUNT
  22. Вывод одного, максимального значения счетчика в таблице:
  23. Вывод одного, минимальный значения счетчика в таблице:
  24. Вывод суммы всех значений счетчиков в таблице:
  25. Вывод среднего значения счетчика в таблице:
  26. Вывод количества счетчиков в таблице:
  27. Вывод количества счетчиков в цехе №1, в таблице:
  28. SQL запрос: группировка записей
  29. SQL запрос: использование нескольких таблиц через алиас (alias)
  30. Вложенные подзапросы
  31. SQL запросы изменяющие данные
  32. SQL запрос: INSERT
  33. Вариант №1. Часто используется инструкция:
  34. Вариант №2. Удобнее использовать стиль:
  35. Основные недостатки:
  36. Основные преимущества:
  37. SQL запрос: UPDATE
  38. SQL запрос: DELETE
  39. SQL рекомендации
  40. Дополнительная информация по теме
  41. Как sql-запросом извлечь из базы данных информацию, которой там нет
  42. Условия отбора в операторе SELECT в запросах SQL на практике
  43. Vovan_ST
  44. Сравнение (=, о, , >=)
  45. Выборка одной строки
  46. Значения NULL
  47. Проверка на принадлежность диапазону (BETWEEN)
  48. Проверка наличия во множестве (IN)
  49. Проверка на соответствие шаблону (LIKE)
  50. Подстановочные знаки
  51. Управляющие символы *
  52. Проверка на равенство NULL (IS NULL)
  53. Составные условия отбора (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 рекомендации

  1. Все названия полей рекомендуются писать маленькими буквами и если надо, разделять их через принудительный пробел «_» для совместимости с разными языками программирования, таких как Delphi, PHP, Perl, Python и Ruby.
  2. SQL команды писать БОЛЬШИМИ буквами для удобочитаемости. Помните всегда, что после вас могут читать код и другие люди, а скорее всего вы сами через N количество времени.
  3. Называть поля с начала существительное, а потом действие. Например: city_status, user_login, user_name.
  4. Стараться избегать слов резервных в разных языках которые могут вызывать проблемы в языках 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

Источник

Оцените статью