SELECT *
FROM Salespeople
WHERE city='Barcelona'
OR city='London';
Имеется и более простой способ получить ту же информацию:
SELECT *
FROM Salespeople
WHERE city IN ('Barcelona', 'London' );
Вывод для этого запроса показывается в Таблице 5.2.
Как вы можете видеть, IN определяет набор значений с помощью имен членов набора заключеных в круглые скобки и отделенных запятыми. Он затем проверяет различные значения указанного поля пытаясь найти совпадение со значениями из набора. Если это случается, то предикат верен. Когда наборсодержит значения номеров а не символов, одиночные кавычки опускаются. Давайте найдем всех заказчиков относящихся к продавцам имеющих значения snum=1001, 1007, и 1004. Вывод для следующего запроса показан в Таблице 5.3:
SELECT *
FROM Customers
WHERE cnum IN (1001, 1007, 1004 );
SELECT * FROM Salespeople WHERE city=
'Barcelona' OR city='London';
|
snum |
sname |
city |
comm |
|
1001 |
Peel |
London |
0.12 |
|
1004 |
Motika |
London |
0.11 |
|
1007 |
Rifkin |
Barcelona |
0.15 |
Таблица 5.1 Нахождение продавцов в Барселоне и Лондоне
SELECT * FROM Salespeople WHERE city IN
('Barcelona', 'London');
|
snum |
sname |
city |
comm |
|
1001 |
Peel |
London |
0.12 |
|
1004 |
Motika |
London |
0.11 |
|
1007 |
Rifkin |
Barcelona |
0.15 |
Таблица 5.2 SELECT использует IN
SELECT * FROM Customers WHERE snum IN (1001, 1007, 1004 );
|
snum |
cname |
city |
rating |
snum |
|
2001 |
Hoffman |
London |
100 |
1001 |
|
2006 |
Clemens |
London |
100 |
1001 |
|
2008 |
Cisneros |
San Jose |
300 |
1007 |
|
2007 |
Pereira |
Rome |
100 |
1004 |
Таблица 5.3: SELECT использует IN с номерами
Оператор BETWEEN похож на оператор IN. В отличии от определения по номерам из набора, как это делает IN, BETWEEN определяет диапазон, значения которого должны уменьшаться что делает предикат верным. Вы должны ввести ключевое слово BETWEEN с начальным значением, ключевое AND и конечное значение. В отличие от IN, BETWEEN чувствителен к порядку, и первое значение в предложении должно быть первым по алфавитному или числовому порядку. (Обратите Внимание что, в отличие от Английского языка, SQL не говорит что "значение находится (между)BETWEEN значением и значением|, а просто "значение BETWEEN значение значение|.
Это применимо и к оператору LIKE). Следующий пример будет извлекать из таблицы Продавцов всех продавцов с комиссионными между .10 и .12 (вывод показывается в Таблице 5.4):
SELECT *
FROM Salespeople
WHERE comm BETWEEN .10 AND .12;
Для включенного оператора BETWEEN, значение совпадающее с любым из двух значений границы (в этом случае, .10 и .12 ) заставляет предикат быть верным.
SELECT * FROM Salespeople WHERE comm BETWEEN .10 AND .12;
|
snum |
sname |
city |
comm |
|
1001 |
Peel |
London |
0.12 |
|
1004 |
Motika |
London |
0.11 |
|
1003 |
Axelrod |
New York |
0.10 |
Таблица 5.4: SELECT использует BETWEEN
SQL не делает непосредственной поддержки невключения BETWEEN. Вы должны или определить ваши граничные значения так, чтобы включающая интерпретация была приемлема, или сделать что-нибудь типа этого:
SELECT *
FROM Salespeople
WHERE (comm BETWEEN .10, AND .12 )
AND NOT comm IN (.10, .12 );
Вывод для этого запроса показывается в Таблица 5.5. По общему признанию, это немного неуклюже, но зато показывает как эти новые операторы могут комбинироваться с операторами Буля чтобы производить более сложные предикаты. В основном, вы используете IN и BETWEEN также как вы использовали реляционные операторы чтобы сравнивать значения, которые берутся либо из набора (для IN ) либо из диапазона (для BETWEEN ).
Также, подобно реляционным операторам, BETWEEN может работать с символьными полями в терминах эквивалентов ASCII. Это означает что вы можете использовать BETWEEN чтобы выбирать ряд значений из упорядоченных по алфавиту значений.
SELECT * FROM Salespeople WHERE
( comm BETWEEN .10 AND .12 AND NOT comm IN (.10 .12);
|
snum |
sname |
city |
comm |
|
1004 |
Motika |
London |
0.11 |
Таблица 5.5: Сделать BETWEEN - невключенным
Этот запрос выбирает всех заказчиков чьи имена попали в определенный алфавитный диапазон:
SELECT *
FROM Customers
WHERE cname BETWEEN 'A' AND 'G';
Вывод для этого запроса показывается в Таблице 5.6.
Обратите Внимание что Grass и Giovanni отсутствуют, даже при включенном BETWEEN. Это происходит из-за того что BETWEEN сравнивает строк неравной длины. Строка 'G' более короткая чем строка Giovanni, поэтому BETWEEN выводит 'G' с пробелами. Пробелы предшествуют символам в алфавитном порядке (в большинстве реализаций ), поэтому Giovanni не выбирается. То же самое происходит с Grass. Важно помнить это когда вы используете BETWEEN для извлечения значений из алфавитных диапазонов.
Обычно вы указываете диапазон с помощью символа начала диапазона и символа конца( вместо которого можно просто поставить z ).
SELECT * FROM Customers WHERE cname BETWEEN 'A' AND 'G';
|
cnum |
cname |
city |
rating |
snum |
|
2006 |
Clemens |
London |
100 |
1001 |
|
2008 |
Cisneros |