SQL операторы сравнения
Операторы сравнения используются в предложении WHERE, чтобы определить, какие записи выбрать. Вот список операторов сравнения, которые вы можете использовать в SQL:
| Операторы сравнения | Описание |
|---|---|
| = | Равно |
| <> | Не равно |
| != | Не равно |
| > | Больше чем |
| >= | Больше или равно |
| % и _ | |
| EXISTS | Условие выполнено, если подзапрос возвращает хотя бы одну строку |
Пример — оператор равенства
В SQL вы можете использовать оператор = для проверки на равенство в запросе.
В этом примере у нас есть таблица с suppliers со следующими данными:
| supplier_id | supplier_name | city | state |
|---|---|---|---|
| 100 | Yandex | Moscow | Moscow |
| 200 | Lansing | Michigan | |
| 300 | Oracle | Redwood City | California |
| 400 | Bing | Redmond | Washington |
| 500 | Yahoo | Sunnyvale | Washington |
| 600 | DuckDuckGo | Paoli | Pennsylvania |
| 700 | Qwant | Paris | Ile de France |
| 800 | Menlo Park | California | |
| 900 | Electronic Arts | San Francisco | California |
Введите следующий SQL оператор:
Transact-SQL
FROM suppliers
WHERE supplier_name = ‘Yandex’ ;
| supplier_id | supplier_name | city | state |
|---|---|---|---|
| 100 | Yandex | Moscow | Moscow |
Будет выбрана 1 запись. Вот результаты, которые вы должны получить:
В этом примере приведенный выше оператор SELECT возвращает все строки из таблицы suppliers , где supplier_name равно Yandex.
Пример — оператор неравенства
В SQL есть два способа проверить неравенство в запросе. Вы можете использовать оператор <> или != . Оба вернут одинаковые результаты.
Давайте использовать ту же таблицу suppliers , что и в предыдущем примере.
| supplier_id | supplier_name | city | state |
|---|---|---|---|
| 100 | Yandex | Moscow | Moscow |
| 200 | Lansing | Michigan | |
| 300 | Oracle | Redwood City | California |
| 400 | Bing | Redmond | Washington |
| 500 | Yahoo | Sunnyvale | Washington |
| 600 | DuckDuckGo | Paoli | Pennsylvania |
| 700 | Qwant | Paris | Ile de France |
| 800 | Menlo Park | California | |
| 900 | Electronic Arts | San Francisco | California |
Выполните следующий SQL оператор, чтобы проверить неравенство, используя оператор <> :
Transact-SQL
FROM suppliers
WHERE supplier_name < >‘Yandex’ ;
Или введите следующий SQL оператор, чтобы использовать оператор != :
Transact-SQL
FROM suppliers
WHERE supplier_name != ‘Yandex’ ;
Будет выбрано 8 записей. Вот результаты, которые вы должны получить с помощью одного из операторов SQL:
| supplier_id | supplier_name | city | state |
|---|---|---|---|
| 200 | Lansing | Michigan | |
| 300 | Oracle | Redwood City | California |
| 400 | Bing | Redmond | Washington |
| 500 | Yahoo | Sunnyvale | Washington |
| 600 | DuckDuckGo | Paoli | Pennsylvania |
| 700 | Qwant | Paris | Ile de France |
| 800 | Menlo Park | California | |
| 900 | Electronic Arts | San Francisco | California |
В этом примере оба оператора SELECT будут возвращать все строки из таблицы suppliers , где supplier_name не равно Yandex.
Пример — оператор больше чем
Вы можете использовать оператор > в SQL для проверки выражения больше чем.
В этом примере у нас есть таблица customers со следующими данными:
В этом примере у нас есть таблица customers со следующими данными:
| customer_id | first_name | last_name | favorite_website |
|---|---|---|---|
| 4000 | Justin | Bieber | google.com |
| 5000 | Selena | Gomez | bing.com |
| 6000 | Mila | Kunis | yahoo.com |
| 7000 | Tom | Cruise | oracle.com |
| 8000 | Johnny | Depp | NULL |
| 9000 | Russell | Crowe | google.com |
Введите следующий SQL оператор:
Как в sql не равно
Набор операторов сравнения включает обычные операторы, перечисленные в Таблице 9.1.
Таблица 9.1. Операторы сравнения
| Оператор | Описание |
|---|---|
| тип_данных < тип_данных → boolean | Меньше |
| тип_данных > тип_данных → boolean | Больше |
| тип_данных тип_данных → boolean | Меньше или равно |
| тип_данных >= тип_данных → boolean | Больше или равно |
| тип_данных = тип_данных → boolean | Равно |
| тип_данных <> тип_данных → boolean | Не равно |
| тип_данных != тип_данных → boolean | Не равно |
Примечание
В стандарте SQL для условия « не равно » принята запись <> . Синонимичная ей запись != преобразуется в <> на самой ранней стадии разбора запроса. Как следствие, реализовать операторы != и <> так, чтобы они работали по-разному, невозможно.
Эти операторы сравнения имеются для всех встроенных типов данных, значения которых сортируются естественным образом, включая числовые, строковые типы, а также типы даты/времени. Кроме того, сравниваться могут массивы, составные типы и диапазоны, если типы данных их компонентов являются сравниваемыми.
Обычно можно сравнивать также значения связанных типов данных; например, возможно сравнение integer > bigint . Некоторые подобные операции реализуются непосредственно « межтиповыми » операторами сравнения, но если такого оператора нет, анализатор запроса попытается привести частные типы к более общим и применить подходящий для них оператор сравнения.
Существует также несколько предикатов сравнения; они приведены в Таблице 9.2. Они работают подобно операторам, но имеют особый синтаксис, установленный стандартом SQL.
Таблица 9.2. Предикаты сравнения
тип_данных BETWEEN тип_данных AND тип_данных → boolean
Между (включая границы интервала).
2 BETWEEN 1 AND 3 → t
тип_данных NOT BETWEEN тип_данных AND тип_данных → boolean
Не между (обратное к BETWEEN ).
тип_данных BETWEEN SYMMETRIC тип_данных AND тип_данных → boolean
Между, после сортировки граничных значений.
тип_данных NOT BETWEEN SYMMETRIC тип_данных AND тип_данных → boolean
Не между, после сортировки граничных значений.
тип_данных IS DISTINCT FROM тип_данных → boolean
Не равно, при этом NULL воспринимается как обычное значение.
1 IS DISTINCT FROM NULL → t (а не NULL )
тип_данных IS NOT DISTINCT FROM тип_данных → boolean
Равно, при этом NULL воспринимается как обычное значение.
1 IS NOT DISTINCT FROM NULL → f (а не NULL )
тип_данных IS NULL → boolean
Проверяет, является ли значение эквивалентным NULL.
тип_данных IS NOT NULL → boolean
Проверяет, отличается ли значение от NULL.
тип_данных ISNULL → boolean
тип_данных NOTNULL → boolean
boolean IS TRUE → boolean
Проверяет, является ли результат логического выражения значением true.
true IS TRUE → t
boolean IS NOT TRUE → boolean
Проверяет, является ли результат логического выражения значением false или неизвестным.
true IS NOT TRUE → f
boolean IS FALSE → boolean
Проверяет, является ли результат логического выражения значением false.
true IS FALSE → f
boolean IS NOT FALSE → boolean
Проверяет, является ли результат логического выражения значением true или неизвестным.
true IS NOT FALSE → t
boolean IS UNKNOWN → boolean
Проверяет, является ли результат логического выражения неизвестным значением.
true IS UNKNOWN → f
boolean IS NOT UNKNOWN → boolean
Проверяет, является ли результат логического выражения значением true или false.
true IS NOT UNKNOWN → t
Предикат BETWEEN упрощает проверки интервала:
aBETWEENxANDy
a>=xANDay
Заметьте, что BETWEEN считает, что границы интервала включаются в интервал. Предикат BETWEEN SYMMETRIC аналогичен BETWEEN , за исключением того, что аргумент слева от AND не обязательно должен быть меньше или равен аргументу справа. Если это не так, аргументы автоматически меняются местами, так что всегда подразумевается непустой интервал.
Различные варианты BETWEEN реализуются посредством обычных операторов сравнения, и поэтому они будут работать с любыми типами данных, которые можно сравнивать.
Примечание
Использование AND в конструкции BETWEEN создаёт неоднозначность с использованием AND в качестве логического оператора. Для её устранения в качестве второго аргумента предложения BETWEEN принимается только ограниченный набор типов выражений. Если вам нужно записать более сложное подвыражение в BETWEEN , заключите это подвыражение в скобки.
Обычные операторы сравнения выдают NULL (что означает « неопределённость » ), а не true или false, когда любое из сравниваемых значений NULL. Например, 7 = NULL выдаёт NULL, так же, как и 7 <> NULL . Когда это поведение нежелательно, можно использовать предикаты IS [ NOT ] DISTINCT FROM :
aIS DISTINCT FROMbaIS NOT DISTINCT FROMb
Для значений не NULL условие IS DISTINCT FROM работает так же, как оператор <> . Однако если оба сравниваемых значения NULL, результат будет false, и только если одно из значений NULL, возвращается true. Аналогично, условие IS NOT DISTINCT FROM равносильно = для значений не NULL, но возвращает true, если оба сравниваемых значения NULL, и false в противном случае. Таким образом, эти предикаты по сути работают с NULL, как с обычным значением, а не с « неопределённостью » .
Для проверки, содержит ли значение NULL или нет, используются предикаты:
выражениеIS NULLвыражениеIS NOT NULL
или равнозначные (но нестандартные) предикаты:
выражениеISNULLвыражениеNOTNULL
Заметьте, что проверка выражение = NULL не будет работать, так как NULL считается не « равным » NULL . (Значение NULL представляет неопределённость, и равны ли две неопределённости, тоже не определено.)
Подсказка
Некоторые приложения могут ожидать, что выражение = NULL вернёт true, если результатом выражения является NULL. Такие приложения настоятельно рекомендуется исправить и привести в соответствие со стандартом SQL. Однако в случаях, когда это невозможно, это поведение можно изменить с помощью параметра конфигурации transform_null_equals. Когда этот параметр включён, PostgreSQL преобразует условие x = NULL в x IS NULL .
Если выражение возвращает табличную строку, тогда IS NULL будет истинным, когда само выражение — NULL или все поля строки — NULL, а IS NOT NULL будет истинным, когда само выражение не NULL, и все поля строки так же не NULL. Вследствие такого определения, IS NULL и IS NOT NULL не всегда будут возвращать взаимодополняющие результаты для таких выражений; в частности такие выражения со строками, одни поля которых NULL, а другие не NULL, будут ложными одновременно. В некоторых случаях имеет смысл написать строка IS DISTINCT FROM NULL или строка IS NOT DISTINCT FROM NULL , чтобы просто проверить, равно ли NULL всё значение строки, без каких-либо дополнительных проверок полей строки.
Логические значения можно также проверить с помощью предикатов
логическое_выражениеIS TRUEлогическое_выражениеIS NOT TRUEлогическое_выражениеIS FALSEлогическое_выражениеIS NOT FALSEлогическое_выражениеIS UNKNOWNлогическое_выражениеIS NOT UNKNOWN
Они всегда возвращают true или false и никогда NULL, даже если какой-любо операнд — NULL. Они интерпретируют значение NULL как « неопределённость » . Заметьте, что IS UNKNOWN и IS NOT UNKNOWN по сути равнозначны IS NULL и IS NOT NULL , соответственно, за исключением того, что выражение может быть только булевого типа.
Также имеется несколько связанных со сравнениями функций; они перечислены в Таблице 9.3.
Таблица 9.3. Функции сравнения
num_nonnulls ( VARIADIC «any» ) → integer
Возвращает число аргументов, отличных от NULL.
num_nulls ( VARIADIC «any» ) → integer
Возвращает число аргументов NULL.
NULL в SQL: Что это такое и почему его знание необходимо каждому разработчику
NULL — это специальное значение, которое используется в SQL для обозначения отсутствия данных. Оно отличается от пустой строки или нулевого значения, так как NULL означает отсутствие какого-либо значения в ячейке таблицы.
История появления NULL в SQL довольно интересна и длинна. В начале 1970-х годов Д. Камерер (D. Chamberlin) и Р. Бойд (R. Boyce) предложили использовать реляционную модель для полной замены иерархических и сетевых моделей данных, которые были актуальны в то время. Полная замена предполагала возможность хранения значений NULL в таблицах структуры базы данных.
Первоначально, NULL был создан как интегральный элемент реляционной модели данных. Это означало, что NULL мог быть использован в качестве значения для любого типа данных (целого числа, строки и т.д.) или даже целой строки (например, таких значений как «неизвестно» или «нет данных»).
Когда была разработана SQL, NULL был реализован как специальное значение или маркер, который указывает на отсутствие значения в столбце. Таким образом, в SQL NULL означает отсутствие значения или неопределенное значение.
Однако, NULL создал некоторые проблемы при работе с данными в SQL. Например, если вы выполняете операцию на столбце, содержащем NULL значение, результат операции также будет NULL. Это означает, что использование NULL может приводить к нежелательным результатам, таким как непредсказуемое поведение.
Однако, важно понимать, что NULL не обязательно означает отсутствие информации или отсутствие значения в столбце. NULL может быть использован для разных целей, таких как указание на неопределенный результат для вычислений или как маркер для отметки отсутствия значения в таблице.
Рассмотрим несколько SQL операций с NULL:
- Как назначить значение NULL в SQL?
Значение NULL можно явно указать при создании таблицы или добавления записей в таблицу. Например, при создании таблицы можно указать, что один из столбцов не обязательно должен иметь значение, используя ключевое слово NULL. - Как проверить NULL в SQL?
Для того чтобы проверить значение NULL в SQL, используется оператор IS NULL. Этот оператор возвращает true, если значение столбца равно NULL. - NULL и требования целостности данных
NULL может нарушить требования целостности данных, которые гарантируют, что данные в таблице являются валидными и согласованными. Например, требование необходимости заполнения поля значением может быть нарушено, если значение NULL допустимо. - Ограничение NOT NULL
Ограничение NOT NULL позволяет определить, что значение в столбце не может быть NULL. Это означает, что при добавлении записи в таблицу обязательно должно быть заполнено значение для данного столбца. - ISNULL
Функция ISNULL возвращает первый аргумент, если он не равен NULL, и второй аргумент, если первый аргумент равен NULL. ISNULL наиболее часто используется для замены значений NULL на конкретные значения. - COALESCE
Функция COALESCE возвращает первый аргумент, который не равняется NULL. COALESCE может быть полезна, когда вам нужно выбрать первое значение из двух или нескольких, которые могут быть пустыми. - NULLIF
Функция NULLIF возвращает NULL, если два аргумента равны. Если аргументы не равны, она возвращает первый аргумент. Эта функция может быть полезна для условного выполнения некоторых операций в зависимости от того, равны ли значения.
Почему знание NULL важно для SQL-разработчиков?
Понимание того, что такое NULL и как он работает, важно для SQL-разработчиков, так как они должны убедиться, что данные в таблице корректны и не содержат NULL, если это не предусмотрено требованиями для соответствующего столбца таблицы. Также знание правильной работы с NULL в SQL позволяет избежать неожиданного поведения запросов и операторов, которые могут привести к ошибкам или неверным результатам. Кроме того, понимание того, как обрабатывать значения NULL, может улучшить эффективность запросов, так как правильное использование функций для работы с NULL может сократить количество кода и убрать дублирование.
NULL в базе данных может привести к ошибкам, например:
- Сравнение значений. Если в таблице присутствуют значения NULL, то при выполнении операции сравнения, например, WHERE column_name = NULL, результатом будет False. Вместо этого нужно использовать оператор IS NULL.
- Вычисления. Если при выполнении арифметических операций включены значения NULL, то результат такой операции тоже будет NULL. Например, 5 + NULL = NULL.
- Сортировка. При сортировке значений в столбце, которые содержат NULL, может произойти непредсказуемый результат в зависимости от реализации сортировки в базе.
- Внешние ключи. Если в таблице соединения используются внешние ключи, то значение NULL может привести к нарушению связной целостности.
- Агрегирующие функции. При использовании агрегирующих функций в запросах, значения NULL могут не быть учтены в результате.
- Вывод на экран. Если значение NULL выводится на экран пользователя, это может вызвать возможное недопонимание и ухудшение пользовательского опыта.
Все эти проблемы могут привести к ошибкам при обработке данных и привести к неправильным результатам. Необходимо быть осторожным при работе с NULL значениями в базе данных и учитывать их взаимодействие при проектировании и разработке баз данных.
Пример неудачного использования NULL
Допустим, у нас есть таблица, в которой хранится информация о заказах в интернет-магазине. Среди полей есть поля, отражающие дату создания заказа (orderdate) и дату его доставки (deliverydate).
Однажды в этой таблице обнаружилась ошибка: у нескольких заказов deliverydate было не заполнено, т.е. им было присвоено значение NULL. Разработчики не заметили этого и продолжили работу с данными.
Однако при анализе статистики продаж на одном из графиков заказы отображались в зависимости от даты доставки. Из-за того, что несколько заказов не имели значения в поле deliverydate, они не отображались на графике вовсе, что привело к искажению реальных данных и ошибочным выводам о продажах на определенные даты.
Эта ошибка привела к тому, что команда интернет-магазина долго работала с неточными данными, и необходимо было потратить много времени на исправление ошибки и калибровку аналитических инструментов. Все эти проблемы могли быть исправлены, если бы разработчики были внимательными и не допустили присвоения значения NULL в поле, которое требует обязательного заполнения.
В итоге, знание NULL очень важно для SQL-разработчиков, так как неправильное использование NULL может привести к ошибкам в запросах и значительно затруднить дальнейшую обработку данных. Однако, правильное использование NULL может упростить запросы и дать возможность корректно хранить и обрабатывать данные. Поэтому, при работе с базами данных, SQL-разработчикам необходимо быть внимательными и осознанными в использовании NULL.
Бонус
Три вопроса с собеседований, где вас проверяют на знание NULL в SQL:
- Как проверить, есть ли NULL значение в определенном столбце таблицы в SQL? Ответ: Необходимо использовать оператор «IS NULL» или «IS NOT NULL». Например, чтобы проверить, есть ли NULL значение в столбце «name» таблицы «users», нужно выполнить следующий запрос: SELECT FROM users WHERE name IS NULL;
- Как можно заменить NULL значения на определенное значение в SQL? Ответ: Для замены NULL значений можно использовать оператор «COALESCE». Например, чтобы заменить NULL значения в столбце «price» таблицы «products» на значение 0, нужно выполнить следующий запрос: SELECT COALESCE(price, 0) FROM products;
- Как можно проверить, что два столбца имеют одинаковые значения, включая NULL, в SQL? Ответ: Для этого нужно использовать оператор «IS NOT DISTINCT FROM». Он сравнивает значения двух столбцов, включая NULL значения. Например, чтобы проверить, что значения столбцов «name» и «address» в таблице «users» совпадают, нужно выполнить следующий запрос: SELECT FROM users WHERE name IS NOT DISTINCT FROM address;
Основы SQL для выражений запроса, применяемых в ArcGIS
Structured Query Language (SQL) — это стандартный компьютерный язык, содержащий набор определенного синтаксиса и выражений, используемых для доступа и управления данными в базах данных и в других технологиях обработки данных.
Американский национальный институт стандартов (ANSI) определяет стандарт для SQL. Большинство СУБД используют этот стандарт и расширяют его, благодаря чему синтаксис SQL в разных СУБД немного отличается друг от друга.
Выражения запроса в ArcGIS соответствуют стандартным выражениям SQL. Синтаксис SQL, который вы используете в выражении, зависит от источника данных. Каждый источник данных имеет свой собственный вариант SQL, они называются диалектами SQL, к ним относятся:
- Файловые данные, включая файловые базы геоданных, шейп-файлы, виды таблиц в памяти, текстовые файлы, такие как таблицы .dbf , .csv , .txt , .xlsx и сервисы объектов, которые используют стандартизованные запросы, используют диалект ArcGIS SQL, который поддерживает подмножество возможностей SQL.
- Мобильные базы геоданных, ST_geometry SQLite , GeoPackage и Excel используют диалект SQL SQLite .
- Базы данных или многопользовательские базы геоданных используют синтаксис SQL базовой СУБД, например , Oracle , SQL Server , PostgreSQL , SAP HANA и, IBM Db2 , где каждая база данных использует свой собственный немного другой диалект SQL.
При использовании диалоговых окон ArcGIS для построения выражения SQL используется автозаполнение, чтобы помочь вам применить правильный синтаксис для запрашиваемого источника данных. По мере ввода появляется запрос, показывающий имена полей, значения, ключевые слова и операторы, поддерживаемые вашим источником данных.
Подсказка:
- Если данные в вашем выражении SQL поступают из нескольких источников данных, произойдет следующее:
- Если источниками данных являются как файловые источники, так и СУБД, будет использоваться синтаксис ArcGIS SQL.
- Если источником данных являются данные на основе файлов, будет использоваться синтаксис ArcGIS SQL.
- Если источником данных является база данных или многопользовательская база геоданных, ArcGIS передаст выражение SQL в СУБД для разрешения, и вам нужно будет проконсультироваться с документацией для вашей системы управления базой данных, чтобы узнать о синтаксисе конкретного выражения и поддерживаемых типах данных.
- Выбрать по атрибутам с помощью инструмента геообработки Выбрать в слое по атрибуту .
- Вкладка Определяющий запрос в диалоговом окне Свойства слоя .
- Вкладка Фильтры отображения на панели Символы .
- Создать запрос с помощью панели Создать новые запросы .
- Экспортируйте таблицы с помощью инструмента геообработки Экспорт таблицы .
- Экспортируйте объекты с помощью инструмента геообработки Экспорт объектов .
- Используйте инструмент геообработки Вычислить поле , чтобы создать выражение для выполнения простых или сложных вычислений значений поля.
- Используйте Выборку для запроса данных для дальнейшего анализа.
- Используйте инструмент геообработки Создать таблицу запроса , чтобы создать Вид слоя или таблицы.
- Используйте инструмент геообработки Создать векторный слой , чтобы создать такой слой.
- Создайте вид в базе данных или базе геоданных с помощью инструмента геообработки Создать вид базы данных .
- Используйте инструмент геообработки Присоединить , чтобы добавить несколько входных наборов данных в целевой набор данных.
- Используйте ProSDK Core.Data.QueryDef.
Синтаксис выражения SQL
Выражение SQL содержит комбинацию одного или нескольких значений, операторов и функций SQL, которые можно использовать для запроса или выбора подмножества объектов и записей таблиц в ArcGIS.
Все запросы SQL выражаются с помощью ключевого слова SELECT.
SELECT * FROM формирует первую часть выражения SQL и автоматически предоставляется вам в большинстве диалоговых окон ArcGIS. Например, когда вы составляете запрос, записывая синтаксис SQL, оператор SELECT используется для выбора полей из слоя или таблицы и предоставляется вам.
Следующая часть выражения SQL, которая приходит после SELECT * FROM — это предложение WHERE. Предложение WHERE используется для получения записей, соответствующих определенным критериям, и является частью выражения, которое вы должны построить.
Подсказка:
Звездочка (*) в выражении SQL используется для запроса всех столбцов.
Вот базовая форма предложения WHERE SQL-выражения:

Например, STATE_NAME = ‘Florida’ . Это выражение содержит одно предложение и выбирает все объекты, содержащие слово ‘Florida’ в поле STATE_NAME .
Для составных выражений используется следующая форма:

Например, STATE_NAME = ‘Florida’ OR (STATE_NAME = ‘South Carolina’ AND POP2010 > 15000) . Это составное выражение состоит из нескольких предложений, связанных логическим оператором И или ИЛИ, и выбирает все объекты, содержащие Florida в поле STATE_NAME , и все объекты, которые содержат как South Carolina в поле STATE_NAME , так и имеют значение больше 15000 в поле с именем POP2010 .
Подсказка:
По желанию, круглые скобки () могут использоваться для определения порядка операций в составных выражениях.
Поскольку вы выбираете столбцы в целом, то не можете ограничить оператор SELECT возвратом только некоторых столбцов в соответствующей таблице, поскольку синтаксис SELECT * жестко запрограммирован. По этой причине ключевые слова, такие как DISTINCT, ORDER BY и GROUP BY, нельзя использовать в выражении SQL в ArcGIS, за исключением случаев использования подзапросов. Чтобы узнать больше, посмотрите раздел Подзапросы ниже.
В следующих разделах описаны элементы общих выражений SQL-запросов, используемых в ArcGIS.
Часто используемые запросы: поиск строк
Строковые значения в выражениях всегда заключаются в одинарные кавычки, например:
STATE_NAME = 'California'
Строки в выражениях чувствительны к регистру, кроме случаев работы в базах геоданных в Microsoft SQL Server . Чтобы выполнять не чувствительный к регистру поиск в других источниках данных, можно использовать функцию SQL для преобразования всех значений в один регистр. Для источников данных на основе файлов, таких как файловые базы геоданных или шейп-файлы, для задания регистра выборки можно использовать функции UPPER или LOWER. Например, при помощи следующего выражения выбирается штат, имя которого написано как ‘Rhode Island’ или ‘RHODE ISLAND’:
UPPER(STATE_NAME) = 'RHODE ISLAND'
Если строка содержит одинарную кавычку, вам в первую очередь требуется использовать другую одинарную кавычку как символ управляющей последовательности, например:
NAME = 'Alfie''s Trough'
При помощи оператора LIKE (вместо оператора = ) строится поиск частей строк. Например, данное выражение выбирает Mississippi и Missouri среди названий штатов США:
STATE_NAME LIKE 'Miss%'
Символ процента (%) означает, что на этом месте может быть что угодно – один символ или сотня, или ни одного. В качестве альтернативы, для поиска с помощью подстановочного знака, представляющего один символ, используйте знак подчеркивания (_). Следующий пример показывает выражение для выбора имен Catherine Smith и Katherine Smith:
OWNER_NAME LIKE '_atherine Smith'
Можно также использовать операторы больше (>), меньше (<), больше или равно (>=), меньше или равно (<=), не равно (<>) и BETWEEN, чтобы выбирать строковые значения на основании их сортировки. Например, этот запрос выбирает все города в покрытии, названия которых начинаются с букв от М до Z:
CITY_NAME >= 'M'
Строковые функции могут использоваться для форматирования строк. Например функция LEFT возвращает определенное количество символов начиная с левого края строки. Данный запрос возвращает все штаты, начинающиеся на букву A:
LEFT(STATE_NAME,1) = 'A'
Список поддерживаемых функций вы найдете в документации по своей СУБД.
Часто используемые выражения: поиск значений NULL
Вы можете использовать ключевое слово NULL, чтобы отбирать объекты и записи, содержащие пустые поля. Перед ключевым словом NULL всегда стоит IS или IS NOT. Например, чтобы найти города, для которых не была введена численность населения по данным переписи 1996 года, можно использовать следующее выражение:
POPULATION IS NULL
Или, чтобы найти все города, для которых указана численность населения, используйте:
POPULATION96 IS NOT NULL
Часто используемые выражения: поиск чисел
Точка (.) всегда используется в качестве десятичного разделителя, независимо от региональных настроек. В выражениях в качестве разделителя десятичных знаков нельзя использовать запятую.
Вы можете запрашивать цифровые значения, используя операторы равно (=), не равно (<>), больше (>), меньше (<), больше или равно (>=) и меньше или равно (<=), а также BETWEEN (между), например:
POPULATION >= 5000
Числовые функции можно использовать для форматирования чисел. Например функция ROUND округляет до заданного количества десятичных знаков данные в файловой базе геоданных:
ROUND(SQKM,0) = 500
Список поддерживаемых числовых функций см. в документации по СУБД.
Даты и время
Общие правила и часто используемые выражения
В таких источниках данных, как база геоданных, даты хранятся в полях даты–времени. Однако в шейп-файлах это не тек. Поэтому большинство из примеров синтаксиса запроса, представленных ниже, содержит ссылки на время. В некоторых случаях часть запроса, касающаяся времени, может быть без всякого вреда пропущена, когда известно, что поле содержит только даты; в других случаях её необходимо указывать, или запрос вернет синтаксическую ошибку.
Поиск полей с датой требует внимания к синтаксису, необходимому для источника данных. Если вы создаете запрос в Конструкторе запросов в режиме Условие, правильный синтаксис будет сгенерирован автоматически. Ниже приведен пример запроса, который возвращает все записи после 1 января 2011, включительно, из файловой базы геоданных:
INCIDENT_DATE >= date '2011-01-01 00:00:00'
Примечание:
Даты хранятся в исходной базе данных относительно 30 декабря 1899 года, 00:00:00. Это действительно для всех источников данных, перечисленных здесь.
Цель этого подраздела – помочь вам в построении запросов по датам, но не по значениям времени. Когда со значением даты хранится не нулевое значение (например, январь 12, 1999, 04:00:00), то запрос только по дате не возвратит данную запись, поскольку если вы задаете в запросе только дату для поля в формате дата–время, недостающие поля времени заполняются нулями, и будут выбраны только те записи, в которых указано время 12:00:00 утра.
Таблица атрибутов отображает дату и время в удобном для пользователя формате, согласно вашим региональным установкам, а не в формате исходной базы данных. Это подходит для большинства случаев, но имеются и некоторые недостатки:
- Строка, отображаемая в SQL-запросе, может иметь только небольшое сходство со значением, показанным в таблице, особенно когда в нее входит время. Например время, введенное как 00:00:15, отображается в атрибутивной таблице как 12:00:15 AM с региональными настройками США, а сопоставимый синтаксис запроса Datefield = ‘1899-12-30 00:00:15’.
- Атрибутивная таблица не имеет сведений об исходных данных, пока вы не сохраните изменения. Она сначала попытается отформатировать значения для соответствия её собственному формату, затем, поверх сохраненных изменений, она попытается подогнать получившиеся результаты для соответствия базе данных. По этой причине, вы можете вводить время в шейп-файл, но обнаружите, что оно удаляется при сохранении ваших изменений. Поле будет содержать значение ‘1899-12-30’, которое будет отображаться как 12:00:00 AM или эквивалентно, в зависимости от ваших региональных настроек.
Синтаксис даты-времени для многопользовательских баз геоданных
Oracle
Datefield = date 'yyyy-mm-dd'
Имейте в виду, что записи, где время не равно нулю, возвращены не будут.
Альтернативный формат при запросах к датам в Oracle следующий:
Datefield = TO_DATE('yyyy-mm-dd hh:mm:ss','YYYY-MM-DD HH24:MI:SS')Второй параметр ‘YYYY-MM-DD HH24:MI:SS’ описывает используемый при запросах формат. Актуальный запрос выглядит так:
Datefield = TO_DATE('2003-01-08 14:35:00','YYYY-MM-DD HH24:MI:SS')Вы можете использовать более короткую версию:
TO_DATE('2003-11-18','YYYY-MM-DD')И снова записи, где время не равно нулю, не будут возвращены.
SQL Server
Datefield = 'yyyy-mm-dd hh:mm:ss'
Часть запроса hh:mm:ss может быть опущена, когда в записях не установлено время.
Ниже приведен альтернативный формат:
Datefield = 'mm/dd/yyyy'
IBM Db2
Datefield = TO_DATE('yyyy-mm-dd hh:mm:ss','YYYY-MM-DD HH24:MI:SS')Часть запроса hh:mm:ss не может быть опущена, даже если время равно 00:00:00.
PostgreSQL
Datefield = TIMESTAMP 'YYYY-MM-DD HH24:MI:SS' Datefield = TIMESTAMP 'YYYY-MM-DD'
Вы должны указать полностью временную метку при использовании запросов типа «равно», в или не будет возвращено никаких записей. Вы можете успешно делать запросы со следующими выражениями, если запрашиваемая таблица содержит записи дат с точными временными метками (2007-05-29 00:00:00 или 2007-05-29 12:14:25):
select * from table where date = '2007-05-29 00:00:00';
select * from table where date = '2007-05-29 12:14:25';
При использовании других операторов, таких как больше, меньше, больше или равно, или меньше или равно, вам не нужно указывать время, но это можно сделать для повышения точности. Оба эти выражения работают:
select * from table where date < '2007-05-29';
select * from table where date < '2007-05-29 12:14:25';
Файловые базы геоданных, шейп-файлы, покрытия и прочие файловые источники данных
Datefield = date 'yyyy-mm-dd'
Файловые базы геоданных поддерживают использование времени в поле даты, поэтому его можно добавить в выражение:
Datefield = date 'yyyy-mm-dd hh:mm:ss'
Шейп-файлы и покрытия не поддерживают использование времени в поле даты.
Примечание:
SQL, используемый в файловой базе геоданных, базируется на стандарте SQL-92.
Известные ограничения
Построение запросов к датам, находящимся в левой части (первой таблице) соединения, работает только для файловых источников данных, таких как файловые базы геоданных, шейп-файлы и таблицы DBF. Но возможен обходной путь при работе с другими, не файловыми, источниками, такими как многопользовательские данные, как описано ниже.
Запрос к датам левой части соединения будет выполнен успешно, если использовать ограниченную версию SQL, разработанную для файловых источников данных. Если вы не используете такой источник данных, можете перевести выражение для использования этого формата. Это можно сделать, убедившись, что выражение запроса включает поля из более чем одной присоединенной таблицы. Например, если соединены класс пространственных объектов и таблица (FC1 и Table1), и они поступают из многопользовательской базы геоданных, следующее выражение не будет выполнено или не вернет данные:
FC1.date = date #01/12/2001# FC1.date = date '01/12/2001'
Чтобы запрос был выполнен успешно, можно создать вот такой запрос:
FC1.date = date '01/12/2001' and Table1.OBJECTID > 0
Так как запрос включает поля из обеих таблиц, будет использована ограниченная версия SQL. В этом выражении Table1.OBJECTID всегда > 0 для записей, которые сопоставлены в процессе создания соединения, поэтому это выражение всегда верно для всех строк, содержащих сопоставления соединения.
Чтобы быть уверенным, что каждая запись с FC1.date = date '01/12/2001' выбрана, используйте следующий запрос:
FC1.date = date '01/12/2001' and (Table1.OBJECTID IS NOT NULL OR Table1.OBJECTID IS NULL)
Такой запрос будет выбирать все записи с FC1.date = date '01/12/2001', независимо от того, есть ли сопоставление при соединении для каждой отдельной записи.
Комбинированные выражения
Составные запросы могут комбинироваться путем соединения выражений операторами AND (И) и OR (ИЛИ). Вот пример запроса для выборки всех домов с общей площадью более 1500 квадратных футов и гаражом более чем на три машины:
AREA > 1500 AND GARAGE > 3
Когда вы используете оператор OR (ИЛИ), по крайней мере одно из двух разделенных оператором выражений, должно быть верно для выбираемой записи, например:
RAINFALL < 20 OR SLOPE >35
Используйте оператор NOT (НЕ) в начале выражения, чтобы найти объекты или записи, не соответствующие условию выражения, например:
NOT STATE_NAME = 'Colorado'
Оператор NOT можно комбинировать с AND и OR. Вот пример запроса, который выбирает все штаты Новой Англии за исключением штата Maine:
SUB_REGION = 'New England' AND NOT STATE_NAME = 'Maine'
Вычисления
Вычисления можно включить в запросы с помощью математических операторов +, –, * и /. Можно использовать вычисление между полем и числом, например:
AREA >= PERIMETER * 100
Вычисления также могут производиться между полями. Например чтобы найти районы с плотностью населения меньшим или равным 25 человек на 1 квадратную милю, можно использовать вот такой запрос:
POP1990 / AREA
Приоритет выражения в скобках
Выражения выполняются в последовательности, определяемой стандартными правилами. Например, заключённая в круглые скобки часть выражения выполняется раньше, чем часть выражения за скобками.
HOUSEHOLDS > MALES * (POP90_SQMI + AREA)
Вы можете добавить скобки в режиме Редактирование SQL вручную, или использовать команды Группировать и Разгруппировать в режиме Условие, чтобы добавить или удалить их.
Подзапросы
Подзапрос – это запрос, вложенный в другой запрос и поддерживаемый только в базах геоданных. Подзапросы могут использоваться в SQL-выражении для применения предикативных или агрегирующих функций, или для сравнения данных со значениями, хранящимися в другой таблице и т.п. Это может быть сделано с помощью ключевых слов IN или ANY. Например этот запрос выбирает только те страны, которых нет в таблице indep_countries:
COUNTRY_NAME NOT IN (SELECT COUNTRY_NAME FROM indep_countries)
Примечание:
Шейп-файлы и прочие файловые источники данных, не относящиеся к базам геоданных, не поддерживают подзапросы. Подзапросы, выполняемые на версионных многопользовательских классах объектов и таблицах, не возвращают объекты, которые хранятся в дельта-таблицах. Файловые базы геоданных имеют ограниченную поддержку подзапросов, описанных в данном разделе, в то время, как многопользовательские базы геоданных поддерживают их полностью. Информацию обо всех возможностях подзапросов к многопользовательским базам геоданных смотрите в документации по своей СУБД.
Этот запрос возвращает объекты, где GDP2006 больше, чем GDP2005 любых объектов, содержащихся в countries (странах):
GDP2006 > (SELECT MAX(GDP2005) FROM countries)
Поддержка подзапросов в файловых базах геоданных ограничена следующим:
-
Скалярные подзапросы с операторами сравнения. Скалярный подзапрос возвращает одно значение, например:
GDP2006 > (SELECT MAX(GDP2005) FROM countries)
EXISTS (SELECT * FROM indep_countries WHERE COUNTRY_NAME = 'Mexico')
Операторы
Ниже приведен полный список операторов, поддерживаемых файловыми базами геоданных, шейп-файлами, покрытиями и прочими файловыми источниками данных. Они также поддерживаются в многопользовательских базах геоданных, хотя для этих источников данных может требоваться иной синтаксис. Кроме нижеперечисленных операторов, многопользовательские базы геоданных поддерживают дополнительные возможности. Более подробную информацию см. в документации по своей СУБД.
Арифметические операторы
Для сложения, вычитания, умножения и деления числовых значений можно использовать арифметические операторы.
Арифметический оператор умножения
Арифметический оператор деления
Арифметический оператор сложения
Арифметический оператор вычитания
Операторы сравнения
Операторы сравнения используются для сравнения одного выражения с другим.
Меньше. Может использоваться со строками (сравнение основывается на алфавитном порядке) и для числовых вычислений, а также дат.
Меньше или равно. Может использоваться со строками (сравнение основывается на алфавитном порядке) и для числовых вычислений, а также дат.
Не равно. Может использоваться со строками (сравнение основывается на алфавитном порядке) и для числовых вычислений, а также дат.
Больше. Может использоваться со строками (сравнение основывается на алфавитном порядке) и для числовых вычислений, а также дат.
Больше или равно. Может использоваться со строками (сравнение основывается на алфавитном порядке) и для числовых вычислений, а также дат.
[NOT] BETWEEN x AND y
Выбирает записи, если они содержат значение больше или равное x, но меньше или равное y. Если в начале указано NOT, выбирает запись, содержащую значение вне указанного диапазона. Например это выражение выбирает все записи со значениями, которые больше или равны 1 и меньше или равны 10:
OBJECTID BETWEEN 1 AND 10
Вот эквивалент этого выражения:
OBJECTID >= 1 AND OBJECTID
Однако, выражение с оператором BETWEEN обрабатывается быстрее, если у вас поле проиндексировано.
Возвращает TRUE (истинно), если подзапрос возвращает хотя бы одну запись; в противном случае возвращает FALSE (ложно). Например, данное выражение вернет TRUE, если поле OJBECTID содержит значение 50:
EXISTS (SELECT * FROM parcels WHERE OBJECTID = 50)
EXISTS поддерживается только в файловых и многопользовательских базах геоданных.
Выбирает запись, если она содержит одну из нескольких строк или значений в поле. Если впереди стоит NOT, выбирает запись, где нет таких строк или значений. Например, это выражение будет искать четыре названия штатов:
STATE_NAME IN ('Alabama', 'Alaska', 'California', 'Florida')Выбирает запись, если там в определенном поле есть нулевое значение. Если перед NULL стоит NOT, выбирает запись, где в определенном поле есть какое-то значение.
x [NOT] LIKE y [ESCAPE 'escape-character']
Используйте оператор LIKE (вместо оператора = ) с групповыми символами, если хотите построить запрос по части строки. Символ процента (%) означает, что на этом месте может быть что угодно – один символ или сотня, или ни одного. В качестве альтернативы, для поиска с помощью группового подстановочного знака, представляющего один символ, используйте знак подчеркивания (_). Если вам нужен доступ к несимвольным данным, используйте функцию CAST. Например, этот запрос возвращает числа, начинающиеся на 8, из целочисленного поля SCORE_INT:
CAST (SCORE_INT AS VARCHAR(10)) LIKE '8%'
Для включения символа (%) или (_) в вашу строку поиска, используйте ключевое слово ESCAPE для указания другого символа вместо escape, который в свою очередь обозначает настоящий знак процента или подчёркивания. Например данное выражение возвращает все строки, содержащие 10%, такие как 10% DISCOUNT или A10%:
AMOUNT LIKE '%10$%%' ESCAPE '$'
Логические операторы
Соединяет два условия и выбирает запись, в которой оба условия являются истинными. Например, выполнение следующего запроса выберет все дома с площадью более 1 500 квадратных футов и гаражом на две и более машины:
AREA > 1500 AND GARAGE > 2
Соединяет два условия и выбирает запись, где истинно хотя бы одно условие. Например выполнение следующего запроса выберет все дома с площадью более 1,500 квадратных футов или гаражом на две и более машины:
AREA > 1500 OR GARAGE > 2
Выбирает записи, не соответствующие указанному выражению. Например это выражение выберет все штаты, кроме Калифорнии (California):
NOT STATE_NAME = 'California'
Операторы строковой операции
Возвращает символьную строку, являющуюся результатом конкатенации двух или более строковых выражений.
FIRST_NAME || MIDDLE_NAME || LAST_NAME
Функции
Ниже приведен полный список функций, поддерживаемых файловыми базами геоданных, шейп-файлами, покрытиями и прочими файловыми источниками данных. Функции также поддерживаются в многопользовательских базах геоданных, хотя в этих источниках данных может использоваться иной синтаксис или имена функций. Кроме нижеперечисленных функций, многопользовательские базы геоданных поддерживают дополнительные возможности. Более подробную информацию см. в документации по своей СУБД.
Функции дат
Возвращает текущую дату.
EXTRACT (extract_field FROM extract_source)
Возвращает фрагмент extract_field из extract_source . Аргумент extract_source является выражением даты–времени. Аргументом extract_field может быть одно из следующих ключевых слов: YEAR, MONTH, DAY, HOUR, MINUTE или SECOND.
Возвращает текущую дату.
Строковые функции
Аргументы, обозначаемые как string_exp , могут быть названием столбца, строковой константой или результатом другой скалярной функции, где исходные данные могут быть представлены в виде символов.
Аргументы, обозначаемые character_exp , являются строками символов переменной длины.
Аргументы, указанные как start или length могут быть числовыми постоянными или результатами других скалярных функций, где исходные данные представлены числовым типом.
Строковые функции, перечисленные здесь, базируются на 1; то есть, первым символом в строке является символ 1.
Возвращает длину строкового выражения в символах.
Возвращает строку, идентичную string_exp , в которой все символы верхнего регистра изменены на символы нижнего регистра.
POSITION (character_exp IN character_exp)
Возвращает место первого символьного выражения во втором символьном выражении. Результат – число с точностью, определяемой реализацией и коэффициентом кратности 0.
SUBSTRING (string_exp FROM start FOR length)
Возвращает символьную строку, извлекаемую из string_exp , начинающуюся с символа, положение которого определяется символами start и length .
TRIM ( BOTH | LEADING | TRAILING trim_character FROM string_exp)
Возвращает string_exp с удаленным trim_character с начала, с конца или с обоих концов строки.
Возвращает строку, идентичную string_exp , в которой все символы нижнего регистра изменены на символы верхнего регистра.
Числовые функции
Все числовые функции возвращают числовые значения.
Аргументы, обозначенные как numeric_exp , float_exp или integer_exp , могут быть именем столбца, результатом другой скалярной функции или числовой константой, где исходные данные могут быть представлены числовым типом.
Возвращает абсолютное значение numeric_exp .
Возвращает угол в радианах, равный арккосинусу float_exp .
Возвращает угол в радианах, равный арксинусу float_exp .
Возвращает угол в радианах, равный арктангенсу float_exp .
Возвращает наименьшее целочисленное значение, большее или равное numeric_exp .
Возвращает косинус float_exp в котором float_exp —угол, выраженный в радианах.
Возвращает наибольшее целое значение, меньшее или равное numeric_exp .
Возвращает натуральный логарифм float_exp .
Возвращает логарифм по основанию 10 float_exp .
MOD (integer_exp1, integer_exp2)
Возвращает результат деления integer_exp1 на integer_exp2 .
POWER (numeric_exp, integer_exp)
Возвращает значение numeric_exp в степени integer_exp .
ROUND (numeric_exp, integer_exp)
Возвращает numeric_exp , округленное до integer_exp знаков справа от десятичной точки. Если integer_exp отрицательное, numeric_exp округляется до | integer_exp | знаков слева от десятичной запятой.
Возвращает указатель знака numeric_exp . Если numeric_exp меньше нуля, возвращается -1. Если numeric_exp равно нулю, возвращается 0. Если numeric_exp больше нуля, возвращается 1.
Возвращает синус float_exp , где float_exp — угол, выраженный в радианах.
Возвращает тангенс float_exp , где float_exp — угол, выраженный в радианах.
TRUNCATE (numeric_exp, integer_exp)
Возвращает numeric_exp , округленное до integer_exp знаков справа от десятичной запятой. Если integer_exp отрицательное, numeric_exp округляется до | integer_exp | знаков слева от десятичной запятой.
Функция CAST
Функция CAST() преобразует значение или выражение из одного типа данных в другой указанный тип данных. Синтаксис выглядит так:
- Где expression - обязательный параметр, который может быть буквальным значением или допустимым выражением любого типа (например, имя столбца, переменная), который будет преобразован.
- Где data_type - обязательный параметр, а используемое ключевое слово - это результирующий тип данных, к которому будет приведено выражение. В таблице ниже представлен список ключевых слов, используемых для допустимых типов данных.
- Где length - необязательный параметр, указывающий длину результирующего типа данных.
Например, в некоторых сценариях может потребоваться строковая операция, но запрос не будет работать, если данные хранятся в поле числового типа. Однако с помощью функции CAST () вы можете преобразовать числовое поле в строку для операции SQL. Этот код преобразует числовое поле SQLNUM в текстовое поле, которое затем можно использовать в текстовой операции.
CAST(SQLNUM AS CHARACTER(12))
В следующей таблице содержатся ключевые слова, используемые для преобразования типов данных, которые могут быть указаны в верхнем или нижнем регистре.
Float (с плавающей точкой одинарной точности)
- REAL
- FLOAT [p] по умолчанию 7, что эквивалентно REAL. p > 7 эквивалентно DOUBLE PRECISION
Double (с плавающей точкой двойной точности)
- DOUBLE PRECISION
- NUMERIC (p[,s])
- DECIMAL (p[,s])
- CHAR(n)
- nvarchar(2048)
- CHARACTER(n)
Примечание:
- p - Точность
- s - Масштаб
- n - определяет длину строки в символах
- ( ) - Обязательный параметр
- [ ] - Дополнительный параметр
- Пример 1: CAST(AREA AS INTEGER) Приведение AREA, которое является типом данных Float, к INTEGER возвращает целое число и усекает любое значение результата после десятичного.
- Пример 2: CAST(Rent AS FLOAT) + Utilities > 2000.45 Приведение Rent, которое является типом данных CHARACTER, к типу данных FLOAT, а Utilities также является типом данных FLOAT.
Связанные разделы
- Написание запроса в конструкторе запросов
- Построение и изменение запросов
- Управление порядком операций в запросе SQL
В этом разделе
- Синтаксис выражения SQL
- Часто используемые запросы: поиск строк
- Часто используемые выражения: поиск значений NULL
- Часто используемые выражения: поиск чисел
- Даты и время
- Комбинированные выражения
- Вычисления
- Приоритет выражения в скобках
- Подзапросы
- Операторы
- Функции
