Лекция 14: Извлечение данных при помощи Transact-SQL
Операции сравнения
В выражениях можно использовать операции сравнения (comparison operators), перечисленные в табл. 14.1.
Операция | Проверяемое условие |
---|---|
= | Проверяется равенство двух выражений |
<> | Проверяется неравенство двух выражений |
!= | Проверяется неравенство двух выражений (то же самое, что и <> ) |
> | Проверяется, что первое выражение больше второго |
>= | Проверяется, что первое выражение больше второго или равно ему |
!> | Проверяется, что первое выражение не больше второго |
< | Проверяется, что первое выражение меньше второго |
<= | Проверяется, что первое выражение меньше второго или равно ему |
!< | Проверяется, что первое выражение не меньше второго |
В простом предложении WHERE может производиться сравнение двух выражений при помощи операции сравнения на равенство (=). Ниже приведен пример оператора SELECT, проверяющего значения в колонке lname для всех строк (а эти значения имеют тип данных char) и возвращающего TRUE, если это значение равно "Latimer" (в набор результатов будут включены строки, для которых возвращается значение TRUE ):
SELECT * FROM employee WHERE lname = "Latimer" GO
Запрос, приведенный в этом примере, вернет одну строку. Имя Latimer должно быть задано в кавычках, потому что оно является текстовой строкой.
В следующем запросе применяется операция неравенства ( <> ), на этот раз по отношению к колонке job_id, имеющей тип данных integer:
SELECT job_desc FROM jobs WHERE job_id <> 1 GO
Этот запрос выдает текст с описанием должностных обязанностей из строк таблицы jobs, имеющих значения job_id, не равные 1. Будет выдано 13 строк. Если в строке содержится значение NULL, то оно считается не равным ни 1, ни какому- либо другому значению, поэтому будут выведены и строки null-значениями.
Логические операции
Логические операции (logical operators) AND и OR проверяют два выражения и, в зависимости от их значений, возвращают булево значение TRUE, FALSE или UNKNOWN. Операция NOT выдает булево значение, противоположное значению выражения, следующего за ним. Значения, возвращаемые операциями AND, OR и NOT, показаны в таблицах на рис. 14.3. Таблицами для операций AND и OR надо пользоваться так: найдите результат первого выражения в левой колонке, найдите результат второго выражения в верхней строке, а затем посмотрите результат логической операции в ячейке на пересечении соответствующих строки и колонки. Таблица для операции NOT – совсем понятная. Результат может получить значение UNKNOWN, если среди операндов имеется значение NULL.
В следующем запросе в предложении WHERE имеются два выражения, соединенных логической операцией AND:
SELECT job_desc, min_lvl, max_lvl FROM jobs WHERE min_lvl >= 100 AND max_lvl <= 225 GO
Как видно из таблицы (рис. 14.3), операция AND возвращает значение TRUE, когда оба условия возвращают TRUE. Этот запрос вернет четыре строки.
В следующем запросе операция OR применяется для поиска издателей из Вашингтона (федеральный округ Колумбия) и из Массачусетса. Будут возвращены строки, для которых значение TRUE явилось результатом хотя бы одного из условий.
SELECT p.pub_name, p.state, t.title FROM publishers p, titles t WHERE p.state = "DC" OR p.state = "MA" AND t.pub_id = p.pub_id GO
Этот запрос вернет 23 строки.
Операция NOT возвращает просто отрицание булева значения выражения, следующего за ним. Например, чтобы получить список всех названий книг, у которых авторские отчисления составляют не менее 20%, можно применить операцию NOT:
SELECT t.title, r.royalty FROM titles t, roysched r WHERE t.title_id = r.title_id AND NOT r.royalty < 20 GO
Этот запрос выдаст 18 названий книг, у которых авторские отчисления составляют 20% или более.
Другие ключевые слова
Кроме операций, описанных в предыдущих разделах, в условиях поиска можно применять еще много других ключевых слов T-SQL. В этом разделе мы расскажем о наиболее часто применяемых ключевых словах и приведем примеры их использования.
LIKE. Ключевое слово LIKE применяется для поиска по соответствию шаблону. Соответствие шаблону (pattern matching) проверяется для двух операндов условия поиска – сопоставляемого выражения (match expression) и шаблона (pattern), задающего условие поиска. При этом используется такой синтаксис:
<сопоставляемое_выражение> LIKE <шаблон>
Если сопоставляемое выражение соответствует шаблону, то возвращается булево значение TRUE, а если нет, то возвращается FALSE. Сопоставляемое выражение должно иметь тип данных character string, в противном случае SQL Server преобразует его в данные, имеющие тип character string, если это возможно.
Шаблоны являются строковыми выражениями (string expressions), т.е. строками, состоящими из символов (characters) и метасимволов (wildcard characters). Метасимволы – это символы, имеющие особый смысл при использовании внутри строковых выражений. Метасимволы, которые можно применять в шаблонах, перечислены в табл. 14.2.
Чтобы лучше понять применение ключевого слова LIKE и метасимволов, рассмотрим несколько примеров. Если нужно найти в таблице authors все фамилии, начинающиеся с буквы S, то можно воспользоваться таким запросом с метасимволом %:
SELECT au_lname FROM authors WHERE au_lname LIKE "S%" GO
Набор результатов может быть, например, таким:
au_lname ----------- Smith Straight Stringer
В этом запросе "S%" означает, что нужно возвращать все строки с фамилиями, первой буквой которых будет S, а за ней может следовать произвольное количества букв.
Чтобы извлечь информацию об авторе, идентификатор которого начинается с числа 724, и, зная, что все идентификаторы авторов имеют формат как у номеров социального страхования (три цифры, тире, затем две цифры, затем еще тире, и затем четыре цифры), вы можете воспользоваться метасимволом "_", вот так:
SELECT * FROM authors WHERE au_id LIKE "724-__-____" GO
В набор результатов попадут две строки со следующими значениями au_id: 724-08-9931 и 724-80-9391.
А теперь давайте рассмотрим пример применения метасимвола []. Чтобы получить фамилии авторов, начинающиеся на букву от A до M, можно воспользоваться метасимволом [] в сочетании с метасимволом %, вот так:
SELECT au_lname FROM authors WHERE au_lname LIKE "[A-M]%" GO
Набор результатов будет содержать 14 строк с фамилиями, начинающимися на букву от A до M (или 13 строк, если пользоваться порядком сортировки, чувствительным к регистру букв).
Если в этом запросе поменять метасимвол [] на [^], то будут выданы строки, содержащие фамилии, начинающиеся на буквы вне диапазона от A до M:
SELECT au_lname FROM authors WHERE au_lname LIKE "[^A-M]%" GO
Такой запрос вернет 9 строк.
Если вы применяете сортировку, чувствительную к регистру букв и желаете найти все имена в некотором диапазоне букв, независимо от их регистра, то можно применить запрос, который проверит и строчные, и прописные буквы, вот так:
SELECT au_lname FROM authors WHERE au_lname LIKE "[A-M]%" OR au_lname LIKE "[a-m]%" GO
Имя "del Castillo" попадет в набор результатов, и это будет отличать этот запрос от запроса, чувствительного к регистру, находящего только ПРОПИСНЫЕ буквы от A до M.
Перед ключевым словом LIKE можно помещать операцию NOT. NOT LIKE выдает строки, не соответствующие заданному условию. Например, чтобы найти названия книг, не начинающиеся со слова The, можно воспользоваться таким запросом:
SELECT title FROM titles WHERE title NOT LIKE "The %" GO
Этот запрос вернет 15 строк.
Пользуясь ключевым словом LIKE, вы можете дать волю своей фантазии. Однако будьте осторожны и проверяйте, что ваши запросы работают именно так, как задумано. Если не поставить NOT или символ ^ там, где это надо, то набор результатов будет противоположен ожидаемому. Если не поставить в нужном месте метасимвол %, то результат тоже будет неправильным. И не забывайте о том, что первые и завершающие пробелы тоже участвуют в сопоставлении шаблону.