Понимание 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 определяет набор значений в которое данное значение может или не может быть включено. В соответствии с нашей учебной базой данных на которой вы обучаетесь по настоящее временя, если вы хотите найти всех продавцов, которые размещены в 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 );
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
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 |