Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lect4.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
173.06 Кб
Скачать

Квалифицированный выбор при использовании предложений

Таблицы имеют тенденцию становиться очень большими, поскольку с течением времени, все большее и большее количество строк в нее добавляется. Поскольку обычно из них только определенные строки интересуют вас в данное время, SQL дает возможность вам устанавливать критерии чтобы определить какие строки будут выбраны для вывода.

WHERE - предложение команды SELECT, которое позволяет вам устанавливать предикаты, условие которых может быть или верным или неверным для любой строки таблицы. Команда извлекает только те строки из таблицы для которой такое утверждение верно. Например, предположим вы хотите видеть имена и комиссионные всех продавцов в Лондоне. Вы можете ввести такую команду:

SELECT sname, city

FROM Salespeople;

WHERE city = "LONDON";

Давайте попробуем пример с числовым полем в предложении WHERE. Поле rating таблицы Заказчиков предназначено, чтобы разделять заказчиков на группы, основанные на некоторых критериях, которые могут быть получены в итоге через этот номер. Возможно это - форма оценки кредита или оценки основанной на томе предыдущих приобретений. Такие числовые коды могут быть полезны в реляционных базах данных как способ подведения итогов сложной информации. Мы можем выбрать всех заказчиков с рейтингом 100, следующим образом:

SELECT *

FROM Customers

WHERE rating = 100;

Одиночные кавычки не используются здесь потому, что оценка - это числовое поле.

ИСПОЛЬЗОВАНИЕ РЕЛЯЦИОННЫХ И БУЛЕВЫХ ОПЕРАТОРОВ

ДЛЯ СОЗДАНИЯ БОЛЕЕ СЛОЖНЫХ ПРЕДИКАТОВ

========= РЕЛЯЦИОННЫЕ ОПЕРАТОРЫ =======

= Равный к

> Больше чем

< Меньше чем

>= Больше чем или равно

<= Меньше чем или равно

<> Не равно (предпочтительная запись)

!= Не равно

!> Не больше

!< Не меньше

( ) Изменение приоритета операции

Эти операторы имеют стандартные значения для числовых значений. Для значения символа, их определение зависит от формата преобразования. В ASCII символы - по значению меньше чем все другие символы, которым они предшествуют в алфавитном порядке, все символы верхнего регистра - меньше чем все символы нижнего регистра, поэтому "Z" < "a", а все номера - меньше чем все символы, поэтому "1" < "Z".

Предположим, что вы хотите увидеть всех заказчиков с оценкой (rating) выше 200. Так как 200 - это скалярное значение, как и значение в столбце оценки, для их сравнения вы можете использовать реляционный оператор.

SELECT *

FROM Customers

WHERE rating > 200;

Конечно, если бы мы захотели увидеть еще и заказчиков с оценкой равной 200, мы стали бы использовать предикат rating > = 200

========= БУЛЕВЫ ОПЕРАТОРЫ ===========

Основные Булевы операторы также распознаются в SQL. Выражения Буля - являются или верными или неверными, подобно предикатам. Булевы операторы связывают одно или более верных/неверных значений и производят единственное верное/или/неверное значение. Стандартными операторами Буля распознаваемыми в SQL являются: AND, OR, и NOT.

Существуют другие, более сложные, операторы Буля (типа "исключенный или " ), но они могут быть сформированы из этих трех простых операторов - AND, OR, NOT.

Связывая предикаты с операторами Буля, вы можете значительно увеличить их возможности. Предположим вы хотите видеть всех заказчиков в LONDON, которые имеют оценку(рейтинг) выше 200:

SELECT *

FROM Customers

WHERE city = " LONDON '

AND rating > 200;

Если вы же используете OR вы получите всех заказчиков которые находились в LONDON или(OR) которые имели оценку выше 200.

NOT может использоваться для инвертирования значений. Имеется пример запроса с NOT:

SELECT *

FROM Customers

WHERE city = " San Jose'

OR NOT rating > 200;

Обратите внимание что оператор NOT должен предшествовать Булеву оператору, чье значение должно измениться, и не должен помещаться перед реляционным оператором. Например, неправильным вводом оценки предиката будет: rating NOT > 200 Он выдаст другую отметку.

А как SQL оценит следующее?

SELECT *

FROM Customers

WHERE NOT city = " San Jose'

OR rating > 200;

NOT применяется здесь только к выражению city = 'London', или к выражению rating > 200 тоже? Как и написано, правильный ответ будет прежним. SQL может применять NOT с выражением Буля только сразу после него. Вы можете получить другой результат при команде:

SELECT *

FROM Customers

WHERE NOT( city = " San Jose'

OR rating > 200 );

Здесь SQL понимает круглые скобки как означающие, что все внутри них будет оцениваться первым и обрабатываться как единое выражение с помощью всего что снаружи них ( это является стандартной интерпретацией в математике ). Другими словами, SQL берет каждую строку и определяет, соответствует ли истине равенство city = " London ” или равенство rating>200. Если любое условие верно, выражение Буля внутри круглых скобок верно. Однако, если выражение Буля внутри круглых скобок верно, предикат как единое целое неверен, потому что NOT преобразует верно в неверно и наоборот.

Имеется намеренно сложный пример. Посмотрим, сможете ли вы проследить его логику:

SELECT *

FROM Orders

WHERE NOT ((odate = 10/03/2005 AND snum >1002)

OR amt > 2000.00);

Имеется подробное объяснение того, как пример выше был вычислен. Наиболее глубоко вложенные выражения Буля в предикате - это odate=10/03/2005(В1) и snum>1002(В2) являются объединенными с помощью AND, формируя одно выражение Буля, которое будет оценено как верное для всех строк, в которых встретились оба эти условия. Это составное Булево выражение объединяется с выражением (amt) > 2000.00 с помощью OR, формируя третье выражение(В3), которое является верным для данной строки, если или B1 или B2 - верны для этой строки. B3 полностью содержится в круглых скобках которым предшествует NOT, формируя последнее выражение (B4), которое является условием предиката. Таким образом, B4, предикат запроса, - будет верен всякий раз, когда B3 неправилен. B3 неправилен всегда, когда B1 и B2 - оба неверны. B1 неправилен для строки если дата заказа строки не 10/03/1990, или если значение snum не большее чем 1002. B2 неправилен для всех строк, значения суммы приобретений которых не превышает 2000.00. Любая строка со значением выше 2000.00 сделает B2 - верным; в результате B3 будет верен, а B4 нет. Следовательно, все эти строки будут удалены из вывода. Из оставшихся, строки которые на 3 Октября имеют snum > 1002 (такие как строки для onum 3001 на 3 Октября со snum = 1007 ), делают B1 верным, с помощью верного B3 и неверного предиката запроса. Они будут также удалены из вывода. Вывод показан для строк которые оставлены.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]