Материал: Graber_Martin_-_SQL_dlya_prostykh_smertnykh_-_2014

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Глава 5. Использование специальных операторов в "условиях"

rrsu-EC ;---•~~-~~-SQL l:.xecutron Log~-~~--~ __ i

'FROM Customers

 

 

,,,,.."_ MiifЩM

WfHRfsrшmIN(HHJ1

HHJI

1004)

 

 

MЭll!l,,M ми;;;;,1

 

 

 

 

 

 

 

 

 

2001

Hoffman

London

100

1001

 

2006

Clemens

London

100

1001

 

2008

Cisneros

San

Jose

300

1007

 

 

-··

 

 

2007

Pereira

Rome

 

100

1004

1

1

Рис. 5.3. SELECT с использованием IN с числовыми значениями

rs;-L~CT * ~--------SOL Exccutron 109°~-~~- ~

~ ~ ~ 1]

llFROM

Salespeople

11

WH[RE

comm

BElWElN 10 AND 12.

,

 

MilJIШM

е1р1ш

э.1111.11

 

 

 

 

 

1001

 

0. 12

 

 

 

1004

 

0. 11

 

 

 

1003

 

0.10

 

 

 

 

 

 

 

Рис. 5.4. SELECT с использованием BETWEEN

ем и значение11, но просто значение л1ежду ("BETWEEN") значением и значение~~. Это замечание справедливо и для оператора LIKE.) Следующий запрос позволит из­ влечь из таблицы Sa\espeople всех продавцов (salespeople), комиссионные которых имеют величину в диапазоне .10 и .12 (выходные данные представлены на рис. 5.4):

SELECT •

FROM Salespeople

42

Оператор BETWEEN

WHERE comm BEТWEEN .10 AND .12;

Оператор BETWEEN является включающим, т.е. граничные значения (в данном примере это .1 О и .12) делают предикат истинным. SQL непосредственно не подцер­ живает исключающий BETWEEN. Необходимо сформулировать граничные значения так, чтобы включающая интерпретация была справедлива, либо сделать примерно

следующую запись:

SELECT *

FROM Salespeople

WHERE (comm BEТWEEN . 10, AND . 12) AND NOT comm IN ( .10, .12);

Выходные данные для этого запроса представлены на рис. 5.5.

Пусть эта запись и неуклюжа, но она показывает, как новые операторы можно ком­

бинировать с булевыми операторами для получения более сложных предикатов. Зна­ чит, IN и BETWEEN используются, как и операторы сравнения, для сопоставления значений, одно из которых является множеством (для IN) или диапазоном (для

BETWEEN).

Аналогично всем операторам сравнения, BETWEEN действует на символьных по­ лях, представленных в двоичном (ASCII) эквиваленте, т.е. для выборки можно вос­ пользоваться алфавитным порядком. Следующий запрос выбирает всех покупателей имена которых попадают в заданный алфавитный диапазон:

SELECT •

FROM Customers

WHERE cname BEТWEEN ·д· AND 'G';

Выходные данные для этого запроса представлены на рис. 5.6.

,1

----

~-

-~SOl lxecLJt1on log~--~- -

,

,

Sf ll С f •

 

 

 

'

1

 

 

 

 

 

 

 

 

1 liO"l

0,,1! •~ре "Р 1 ,,

 

 

 

 

 

Wlll <1

(имn 11' TWI

ГN

1С дNI, 1,)

1

 

д NlJ NO 1 r ornni 1 r,

(

10

1 , )

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

11/Jl/J4 Мotika

 

 

 

 

 

---Browse : t.i.<-"

 

 

."i*i!il"*

 

"""

 

 

Рис. 5.5. Выполнение исключающего BETWEEN

43

Глава 5. Использование спеt(иальных операторов в "условиях"

Рис. 5.6. Использование BETWEEN с выборкой в алфавитном порядке

Grass и Giovanni опущены несмотря на то, что BETWEEN является включающим, так как он сравнивает строки неравной длины. Строка 'G' короче строки 'Giovanni', по­ этому BETWEEN дополняет 'G' пробелами. Пробелы предшествуют символам латин­ ского алфавита (в большинстве реализаций), поэтому Giovanni оказался невыбранным. Аналогично и для Grass. Помните об этом при использовании BETWEEN с алфавитными диапазонами. Для включения в результат выполнения за­ проса сведений о покупателях, фамилии которых начинаются на 'G', нужно указать

следующую букву алфавита ('Н') или приписать символ 'z' (несколько символов 'z',

если это необходимо) после второго граничного значения.

Оператор LIКE

LIKE применим только к полям типа CHAR или VARCHAR, поскольку он исполь­

зуется для поиска подстрок. Другими словами, он осуществляет просмотр строки для

выяснения: входит ли заданная подстрока в указанное поле. С этой же целью исполь­ зуются шаблоны - специальные символы, которые могут обозначать все, что угодно. Существует два типа шаблонов, используемых с LIКE:

•Символ "подчеркивание" (_) заменяет один любой символ. Например, образцу 'Ь_t' соответствуют 'Ьаt' или 'Ьit', но не соответствует 'Ьrat'.

44

О11ератор LIKE

•Символ "процент" (%) заменяет последовательность символов произвольной длины, в том числе и нулевой. Например, образцу '%p%t' соответствуют 'put',

'posit', 'opt', но не 'spite'.

Можно найти покупателей, фамилии которых начинаются на 'G' (выходные дан­ ные, соответствующие этому запросу, представлены на рис. 5.7):

Рис. 5. 7. SELECT с использованием LIКE с символом %

SELECT *

FROM Customers

WHERE cname LIKE •GX.;

LIКE может оказаться полезным при осуществлении поиска имени или другого значения, полное написание которого неизвестно. Предположим, не совсем понятно, как правильно записывается фамилия одного из продавцов (sa\espeop\e): Реа\ или Рее\. Можно использовать ту часть, которая известна, и символы шаблона для нахождения

всех возможных вариантов (выходные данные для этого запроса представлены на рис.

5.8):

SELECT *

FROM Salespeople

WHERE sname LIKE •р- _в. ;

Каждый символ подчеркивания в шаблоне представляет единственный символ, по­ этому, например, имя Prettel не вошло бы в состав выходных данных. Символ шаблона

(%) в конце строки необходим в тех реализациях SQL, в которых длина поля sname пре­ восходит количество букв в имени Рее\ (здесь это очевидно, потому что другие значения превышают четыре символа). В таком случае значение поля sпame реально хранится как

45

Глава 5. Использование специальных операторов в "условиях"

и----

~~-~- -SQL lxeCIJclOП Log-~---

~­

llSEL[CT

•

 

FROM Salespeople

1

1 \IHERE

sname LIK[ 'Р 1%'.

 

1•i81ff11M g;ыш

Рис. 5.8. SELECT с использованием LIКE с_ (символом подчеркивания)

Рее!, за ним следует ряд пробелов. Следовательно, символ '1' не является последним в строке. Символ(%) в шаблоне заменяет все пробелы. Все вышеперечисленное не отно­ сится к полю sname типа VARCHAR.

Чтобы найти в строке символ подчеркивания или процента, в предикате LIKE лю­ бой символ можно определить как Еsсаре-символ. Он используется в предикате непо­

средственно перед символом процента или подчеркивания и означает, что следующий

за ним символ интерпретируется именно как обычный символ, а не как символ шабло­ на. Например, поиск символа подчеркивания в столбце sname можно задать следую­ щим образом:

SELECT •

FROM Salespeople

WHERE sname LIKE 'Х/_Х' ESCAPE'/.;

Для тех данных, которые хранятся в таблице в текущий момент времени, выходных

данных нет, поскольку в именах продавцов нет подчеркиваний. Предложение ESCAPE

определяет '/' как Еsсаре-символ, который используется в LIКЕ-строке, за ним следуют символ процента, символ подчеркивания или сам символ'/', т.е. тот символ, поиск которо­ го будет осуществляться в столбце и который уже не интерпретируется как символ шаб­ лона. Еsсаре-символ может быть единственным символом и применяться только к

единственному символу, который следует за ним. В приведенном примере начальный и

конечный символы процента являются символами шаблона, только символ подчеркива­ ния представляет собой символ как таковой.

Еsсаре-символ может использоваться и в своем собственном значении. Другими словами, если нужно найти в столбце Еsсаре-символ, то его необходимо ввести дваж­ ды. Первый раз он действует как обычный Еsсаре-символ и означает: "следующий

46

Источник: https://studfile.net/preview/16418473/