Опубликован: 11.12.2006 | Доступ: свободный | Студентов: 5820 / 381 | Оценка: 4.42 / 3.86 | Длительность: 57:15:00

Лекция 14: Извлечение данных при помощи Transact-SQL

Операции сравнения

В выражениях можно использовать операции сравнения (comparison operators), перечисленные в табл. 14.1.

Таблица 14.1. Операции сравнения
Операция Проверяемое условие
= Проверяется равенство двух выражений
<> Проверяется неравенство двух выражений
!= Проверяется неравенство двух выражений (то же самое, что и <> )
> Проверяется, что первое выражение больше второго
>= Проверяется, что первое выражение больше второго или равно ему
!> Проверяется, что первое выражение не больше второго
< Проверяется, что первое выражение меньше второго
<= Проверяется, что первое выражение меньше второго или равно ему
!< Проверяется, что первое выражение не меньше второго

В простом предложении WHERE может производиться сравнение двух выражений при помощи операции сравнения на равенство (=). Ниже приведен пример оператора SELECT, проверяющего значения в колонке lname для всех строк (а эти значения имеют тип данных char) и возвращающего TRUE, если это значение равно "Latimer" (в набор результатов будут включены строки, для которых возвращается значение TRUE ):

SELECT   		* 
FROM     		employee 
WHERE    		lname = "Latimer"
GO

Запрос, приведенный в этом примере, вернет одну строку. Имя Latimer должно быть задано в кавычках, потому что оно является текстовой строкой.

Примечание. По умолчанию, SQL Server допускает применение как символов одинарных кавычек ('...'), так и символов двойных кавычек ("..."), т.е. можно применять и 'Latimer', и "Latimer". В нашей книге в примерах во избежание путаницы применяются только символы двойных кавычек. Если вы хотите использовать в качестве имени объекта зарезервированное ключевое слово и использовать в качестве литералов (текстовых констант) только одиночные кавычки, то примените опцию SET QUOTED_IDENTIFIER. Установите для этой опции значение TRUE (по умолчанию установлено значение FALSE ).

В следующем запросе применяется операция неравенства ( <> ), на этот раз по отношению к колонке 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.

Значения, возвращаемые операциями AND, OR и NOT при различных значениях операндов

Рис. 14.3. Значения, возвращаемые операциями AND, OR и NOT при различных значениях операндов

В следующем запросе в предложении 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.

Таблица 14.2. Метасимволы T-SQL
Метасимвол Описание
% Символ процента соответствует строке из нескольких символов (в том числе, пустой строке и строке из одного символа)
_ Символ подчеркивания соответствует любому одному символу
[] Метасимвол диапазона соответствует любому одному символу из заданного диапазона или набора символов. Например, [m-p] или [mnop] соответствуют любому из символов m, n, o или p
[^] Метасимвол "не в диапазоне" соответствует любому одному символу, не входящему в диапазон или набор символов. Например, [^m-p] или [^mnop] соответствуют любому из символов, кроме символов m, n, o или p

Чтобы лучше понять применение ключевого слова LIKE и метасимволов, рассмотрим несколько примеров. Если нужно найти в таблице authors все фамилии, начинающиеся с буквы S, то можно воспользоваться таким запросом с метасимволом %:

SELECT  		au_lname 
FROM     		authors 
WHERE    		au_lname LIKE "S%"
GO

Набор результатов может быть, например, таким:

au_lname 
-----------
Smith 
Straight 
Stringer

В этом запросе "S%" означает, что нужно возвращать все строки с фамилиями, первой буквой которых будет S, а за ней может следовать произвольное количества букв.

Примечание. Примеры данного раздела предполагают, что вы применяете стандартный порядок сортировки – Dictionary Order, Case-Insensitive (лексикографический, нечувствительный к регистру). Если вы зададите другой порядок сортировки, то выдаваемые результаты могут измениться, однако принцип работы операции LIKE останется прежним.

Чтобы извлечь информацию об авторе, идентификатор которого начинается с числа 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 или символ ^ там, где это надо, то набор результатов будет противоположен ожидаемому. Если не поставить в нужном месте метасимвол %, то результат тоже будет неправильным. И не забывайте о том, что первые и завершающие пробелы тоже участвуют в сопоставлении шаблону.