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

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


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

SQL (вариант):

select pub id, sum(advance), avg(price)

from titles

group by pub id

having sum(advance) > $15000

and avg(price) < $20

and pub id > 0800

and price >= $5 order by pub id

Причина этих различий заключается в том, что предложение WHERE отсеивает строки до группировки, а предложение HAVING - после.

Ниже приводится пара более простых запросов, с помощью которых можно прочувствовать различия между этими двумя предложениями. (Второй запрос не будет работать в системах, требующих присутствия элементов предложения HAVING в списке выбора.)

SQL:

select pub id, type, count(advance) from titles

where advance > $10000 group by pub id, type

Результат:

pub id type

0736 business 1

0877 mod cook 1

SQL:

select pub id, type, count(advance)

from titles

group by pub id, type

having advance > 10000

Результат:

pub id type

0736 business 1

0877 mod cook 2

В первом запросе (при использовании предложения WHERE) создаются две группы, по одной книге в каждой. Во втором примере (при использовании предложения HAVING) также создаются две группы, но в одну из них помещается две книги. Почему?

Ответ состоит в том, что при выполнении предложения WHERE в первом запросе просматриваются все строки и для последующей группировки отбираются только строки со значением расходов больше $10000 (в следующей таблице эти строки отмечены звездочками).

Pub id type advance

1389 popular comp 8000

1389 business 5000



0736

psychology

4000

0736

psychology

2000

1389

business

5000

0877

mod cook

0877

trad cook

8000

0877

trad cook

4000

1389

popular comp

7000

0877

NULL

NULL

0736

business

10125***

0736

psychology

2275

0736

psychology

6000

0877

mod cook

15000***

0877

trad cook

7000

1389

business

5000

0736

psychology

7000

1389

popular comp

NULL

После выполнения предложения WHERE для группировки и вычислений остается только две строки. Естественно, что в результате получается две группы, по одной книге в каждой.

Предложение же HAVING применяется ко всему запросу, а не к отдельным строкам. Поэтому результаты второго запроса несколько отличаются. В запросе, использующем предложение HAVING, сначала выполняется группировка и вычисляются значения агрегирующих функций. На первом щаге находятся группы.

pub id

type

07зб

business

0736

psychology

0877

NULL

0877

mod cook

0877

trad cook

1389

business

1389

popular comp

Затем к полученным фуппам применяются условия предложения HAVING: какие группы содержат одну или несколько строк со значение затрат больще $10000? Этому условию удовлетворяют две фуппы (0736 - одна книга по бизнесу и 0877 - две книги по приготовлению пищи).

Тогда как предложение WHERE отсеивает сфоки перед фуппировкой данных, предложение HAVING сначала фуппирует, а затем удаляет строки, не удовлетворяющие заданным в нем условиям.

Еще раз обратите внимание на то, что если ваща система Офаничивает элементы предложения HAVING только элементами, перечисленными в списке выбора, то второй запрос выполняться не будет, так как столбец advance не включен в список выбора.

ЕЩЕ О НУЛЕВЫХ ЗНАЧЕНИЯХ

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



Сначала заметим, как это не покажется странным, что даже специалисты считают нули источником головной боли. К. Дж. Дейт, например, долгие годы боролся с ними. В своей статье ( Null Values in Database Managment , Relational Database: Selected Writings, 1986) он аргументировал, что нулевые значения должны быть навсегда устранены из баз данных. Дейт писал, что как правило, вопросы, связанные с использованием нулевых значений, понимаются поверхностно, и любые попытки реализации нулевых значений в прикладных системах являются явно преждевременными .

На практике могут существовать различные типы неполной информации. Некоторые данные могут вообще быть неизвестны, например записи типа дата рождения неизвестна или будет объявлено позднее .

Иногда данные, неизвестные в настоящее время, могут стать известными в последствии, как, например, в столбцах price и advance в нащей базе данных. Другие данные могут пропускаться из-за своей неприменимости. В современных системах управления базами данных нулевые значения используются для представления как неприменимых, так и неизвестных значений.

В ряде случаев точное значение неизвестно, однако определенная информация о нем имеется. Например, точная дата рождения может быть неизвестна, но при этом известно, что она находится в промежутке между 1860 и 1880 годом. Такой тип неизвестной информации называется раз.тичаемыми нулями (distinguished nulls) - их точные значения неизвестны, но о них имеются некоторые сведения.

Различаемые нули поддерживаются в ряде компьютерных профамм, например в статистических пакетах. Однако в системах управления базами данных их использование весьма проблематично. В настоящее время нам неизвестна ни одна подобная система.

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

Нули и проектирование баз данных

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

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

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

Сравнение нулевых значений

Как отмечалось в главе 3, поскольку нули представляют неизвестные значения, их нельзя сравнить с другими значения, даже нулевыми. (При этом также нельзя определенно сказать, что величина, представленная значением NULL, не равна какому-либо конкретному значению.)

Например, расходы по книге под названием Net Etiquette представлены значением NULL. Означает ли это, что они составляют больше $5000? Или меньше $5000? Кроме того, они больше или меньше расходов по книге The Psychology of Computer Cooking, которые также представлены нулевым значением?

Ответы на эти вопросы неизвестны. Единственное, что можно сказать - это может быть . Другими словами, нулевые значения приводят нас к фехзначной логике, в которой помимо значений истина и ложь имеется и фетье значение - может быть .



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

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