Программирование >>  Руководство по sql 

1 ... 42 43 44 [ 45 ] 46 47 48 ... 105


Трехзначная логика по своей природе часто вызывает определенные затруднения. Предположим, что не слишком опытный пользователь получил список всех названий книг, затраты на которые превысили $5000 (8 книг). Затем он поинтересовался книгами, затраты на которые составили меньше $5000, и получил в результате 5 названий. Наконец, он нашел три книги, расходы на которые составили ровно $5000. После этого пользователь может сделать вывод, что в таблице содержится шестнадцать книг, забьш при этом, что в результатах этих запросов не учитывались строки с нулевыми значениями затрат.

Существуют и другие источники неприятностей. При сортировке книг по затратам, в зависимости от настроек системы, все строки с нулевыми затратами будут сфуппированы либо в начале, либо в конце отчета. Это может ввести пользователя в заблуждение, так как, увидев эти строки рядом друг с другом в отсортированном списке с одинаковым значением затрат (NULL), он может посчитать их равными.

С другой стороны, при использовании ключевого слова DISTINCT в результате остается только одно нулевое значение. Это косвенно свидетельствует о том, что нулевые значения считаются равными друг другу!

Таким образом, при выполнении запроса всегда нужно помнить, что в таблице могут существовать нулевые значения. Предположим, например, что вы хотите уведомить всех авторов, суммарный годовой гонорар которых составил меньше $600, о том, что они могут не указывать эту сумму в своей налоговой декларации. Чтобы ваше уведомление получили и авторы, данные о гонорарах которых в таблице отсутствуют, вы должны найти их с помощью специального оператора типа IS NULL.

Нули и вычисления

Реальные сложности, связанные с нулевыми значениями, проявляются при выполнении с ними различного рода вычислений.

Ясно, что при выполнении арифметических операций Аад неизвестными значениями результат также будет неизвестен. Например, можно удвоить значения затрат по всем книгам, но затраты по книге Net Etiquette все равно останутся равными NULL.

А что если нужно найти среднее значение затрат? Соответствующий запрос имеет следующий вид:

SQL:

select avg(advance) from titles

Результат:

5962.5

A теперь проверим результаты, полученные SQL. Для этого сначала найдем сумму всех расходов, а затем общее количество книг:

SQL:

select sum(advance) from titles

Результат:

95400 SQL:

select count(*) from titles



Результат:

Вы можете вполне доверять своему калькулятору. В результате деления 95400 на 18 получается совсем не то значение, которое было получено при вычислении средних расходов в операторе SQL. Причина такого расхождения связана с тем, что SQL при подсчете среднего значения не учитывает два нулевых значения. Однако при этом нули учитываются в функции COUNT(*).

Ситуация весьма скользкая. Вы поинтересовались величиной средних расходов и вроде бы получили точный результат. Однако он в принципе не может быть точным, так как основывается на неполных и неточных данных.

SQL сделал все, что мог. Однако в подобных ситуациях все его попытки выглядят довольно жалкими.

Нули и группы

Во многих диалектах SQL при выполнении предложения GROUP BY все нулевые значения помещаются в одну фуппу.

Значения по умолчанию в качестве альтернативы нулевым

значениям

Одной из альтернатив нулевым значениям являются значения по умолчанию, которые автоматически вводятся системой управления базой данных в случае, если пользователь не ввел конкретное значение. Эти значения по умолчанию можно определять в команде CREATE TABLE.

Одно из преимуществ значений по умолчанию перед нулевыми значениями состоит в том, что они обеспечивают вместо неопределенности конкретные значения в столбцах. Подходящим значением по умолчанию для столбца type может быть значение неизвестно , для столбца date - текущая дата.

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

Для удобства в некоторых системах управления базами данных вместо нулей можно использовать другие значения. Это делается с помощью специального приложения или с использованием расширения SQL. Например, в следующем примере выводятся типы книг, имеющиеся в базе данных, и соответствующее им количество строк:

SQL:

select type, count(*) from titles group by type

Результат:

ype

NULL 1

business 4

mod cook 2

popular comp 3

psychology 5

trad cook 3

Один из типов не определен. С помощью функции Transact-SQL, под названием ISNULLO, этому типу можно задать другое название:



SQL (вариант)

select isnull(type, What?), count(*) from titles group by type

Результат:

typ e

What? 1

business 4

mod cook 2

popular comp 3 psychology 5 trad cook 3

Функция ISNULLO имеет два аргумента - имя столбца и значение, используемое вместо всех найденных в этом столбце нулей. Естественно, реальные значения в базе данных при этом не изменяются.

Ниже приведен запрос, с помощью которого выводятся значения titlejd, advance и price для книг, расходы на которые либо составили меньще $6000, либо неизвестны:

SQL:

select title id, advance, price from titles

where advance < $6000 or advance is null order by price

Результат:

title id

advance

price

PC9999

NULL

NULL

MC3026

NULL

NULL

PS7777

4000

7.99

PS2091

2275

10.95

TC4203

4000

11.95

BUllll

5000

11.95

BU7832

5000

19.99

MC2222

19.99

PS3333

2000

19.99

BU1032

5000

19.99

В двух строках значения расходов и цены неизвестны (NULL). Чтобы заменить нули на другие значения, попробуйте выполнить следующий запрос:

SQL (вариант):

select title id, isnull(advance, 4000), isnull(price,35.00) from titles

where advance < $6000 or advance is null order by price

Результат:

title id advance price

lC999 9~ 4000 зГ.Оо

MC3026 4000 35.00



1 ... 42 43 44 [ 45 ] 46 47 48 ... 105

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика