Глава 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