|
Программирование >> Руководство по sql
включаться в список выбора. Если это имеет место и в вашей системе, то при попытке выполнить следующий запрос вы получите сообщение об ошибке, так как столбец 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
После выполнения предложения WHERE для группировки и вычислений остается только две строки. Естественно, что в результате получается две группы, по одной книге в каждой. Предложение же HAVING применяется ко всему запросу, а не к отдельным строкам. Поэтому результаты второго запроса несколько отличаются. В запросе, использующем предложение HAVING, сначала выполняется группировка и вычисляются значения агрегирующих функций. На первом щаге находятся группы.
Затем к полученным фуппам применяются условия предложения 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, которые также представлены нулевым значением? Ответы на эти вопросы неизвестны. Единственное, что можно сказать - это может быть . Другими словами, нулевые значения приводят нас к фехзначной логике, в которой помимо значений истина и ложь имеется и фетье значение - может быть .
Доставка цветов Погар Цветочная лавка АЖУР. |
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |