Чтение онлайн

ЖАНРЫ

Понимание SQL

Грубер Мартин

Шрифт:

* Что может быть выведено в результате следующего запроса?

SELECT *

FROM Orders

WHERE (amt < 1000 OR

NOT (odate=10/03/1990

AND cnum > 2003 ));

* Что может быть выведено в результате следующего запроса?

SELECT *

FROM Orders

WHERE NOT ((odate=10/03/1990 OR snum > 1006)

AND amt >=1500 );

* Как можно проще переписать такой запрос?

SELECT snum, sname, city, comm

FROM Salespeople

WHERE (comm > + .12 OR

comm < .14 );

Глава 5. ИСПОЛЬЗОВАНИЕ СПЕЦИАЛЬНЫХ ОПЕРАТОРОВ В УСЛОВИЯХ

В

ДОПОЛНЕНИИ К РЕЛЯЦИОННЫМ И БУЛЕВСКИМ операторам обсуждаемым в Главе 4, SQL использует специальные операторы IN, BETWEEN, LIKE, и IS NULL. В этой главе, вы узнаете как их использовать и как реляционные операторы позволяют создавать более сложные и мощные предикаты. Обсуждение оператора IS NULL будет включать отсутствие данных и значение NULL, которое указывает на то: что данные отсутствуют. Вы также узнаете о разновидностях использования оператора NOT применяющегося с этими операторами.

ОПЕРАТОР IN

Оператор IN определяет набор значений в которое данное значение может или не может быть включено. В соответствии с нашей учебной базой данных на которой вы обучаетесь по настоящее временя, если вы хотите найти всех продавцов, которые размещены в Barcelona или в London, вы должны использовать следующий запрос (вывод показывается в Таблице5.1 ):

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 );

SQL Execution Log

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 Нахождение продавцов в Барселоне и Лондоне

SQL Execution Log

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

SQL Execution Log

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

Оператор 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 ) заставляет предикат быть верным.

SQL Execution Log

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 ).

Поделиться с друзьями: