|
Программирование >> Преобразование значений null
Возможно, вы еще не осмыслили четко парадокс Рассела, но задайте себе вопрос: может ли обсуждаемое множество быть членом самого себя? Предположим, что x = y, и еще раз посмотрим на приведенное выше множество. Теперь множество можно определить как у является членом у в том и только в том случае, если у не член у: {y 6 y ( y 8 y )} Попросту говоря, в парадоксе Рассела рассуждается о множестве, одновременно являющемся и не являющемся членом самого себя, что есть противоречие. Интуитивно можно прийти к выводу, что это вообще не является проблемой. В самом деле, как может множество быть членом самого себя? Множество книг ведь не является книгой. Так почему этот парадокс существует, и какую проблему он может представлять? Проблема возникает, если рассматривать более абстрактные приложения теории множеств. Например, парадокс Рассела можно продемонстрировать на практике на примере множества всех множеств. Если допустить существование такого понятия, тогда, по его собственному определению, оно должно быть членом самого себя (в конце концов, оно же является множеством всех множеств). Тогда что будет, если применить условие P(x) к множеству всех множеств? Парадокс Рассела утверждает, что множество всех множеств является членом самого себя тогда и только тогда, когда оно не является членом самого себя, - очевидное противоречие. Если вы заинтересовались, Эрнст Цермело (Ernst Zermelo) разработал аксиому Схема выделения (ее иногда называют просто аксиомой выделения или аксиомой подмножеств), чтобы элегантно обойти парадокс Рассела в аксиоматической теории множеств. Значение COUNT никогда не равно нулю Запросы и полученные результаты предыдущих разделов подтверждают и последнюю аксиому о том, что агрегатная функция COUNT никогда не возвратит нуль при использовании в запросе с оператором GROUP BY к непустой таблице. В том, что для группы не может быть возвращен нулевой счетчик, не должно быть ничего удивительного. Мы уже доказали, что группа не может быть создана из пустой таблицы, таким образом, в группе должна быть, по крайней мере, одна строка. Если существует хотя бы одна строка, счетчик всегда будет, как минимум, равен 1. Помните, мы говорим только о совместном использовании функции COUNT с GROUP BY. Запрос к пустой таблице с COUNT без GROUP BY, конечно же, возвратит нуль. Парадоксы Для автора научного труда не может быть ничего хуже, чем крушение одной из основ его теории после того, когда работа уже заверше-на В такое положение меня поставило письмо мр. Бертрана Рассела, которое я получил, когда печать этой книги уже близилась к завершению . Это слова Готтлоба Фреге в ответ на открытие Бертраном Расселом противоречия аксиоме абстракции Фреге в теории множеств. Парадоксы часто порождают сценарии, которые, казалось бы, противоречат признанным теориям или идеям. Во многих случаях эти противоречия можно выявить и обойти , или они распространяются на такое небольшое число контрольных примеров, что могут быть благополучно проигнорированы. Наверное, вы уже догадались, что смысл всей этой дискуссии о парадоксах в том, что в нашем определении SQL-группы также есть парадокс, и этот парадокс нельзя оставить без внимания. Хотя в данный момент мы рассматриваем группы, в конечном счете, обсуждение касается запросов SQL. В операторе GROUP BY запроса могут располагаться разнообразнейшие значения: константы, выражения или, чаще всего, столбцы таблицы. Но мы расплачиваемся за эту гибкость, поскольку NULL является корректным значением в SQL. Значения NULL создают проблемы, так как игнорируются агрегатными функциями. Исходя из этого, что возвратит агрегатная функция COUNT, используемая в запросе с GROUP BY, если таблица состоит из одной строки со значением NULL? Согласно нашему определению при использовании GROUP BY и агрегатной функции COUNT должно быть получено значение >= 1. Но тогда что происходит, если присутствуют значения, игнорируемые такими функциями, как COUNT, и что это означает для нашего определения ГРУППЫ? Рассмотрим следующий пример, раскрывающий парадокс группы NULL (функция COALESCE используется для удобства чтения): select * from fruits NAME Oranges Oranges Oranges Apple Peach insert into fruits values (null) insert into fruits values (null) insert into fruits values (null) insert into fruits values (null) insert into fruits values (null) select coalesce(name,NULL) as name from fruits NAME Oranges Oranges Oranges Apple Peach NULL NULL NULL NULL NULL select coalesce(name,NULL) as name, count(name) as cnt from fruits group by name NAME CNT Apple 1 NULL 0 Oranges 3 Peach 1 Казалось бы, присутствие значений NULL в нашей таблице приводит к противоречию с данным нами определением SQL-группы. К счастью, это противоречие не является поводом для беспокойства, потому что парадокс касается скорее вопроса реализации агрегатных функций, а не нашего определения. Рассмотрим последний запрос из приведенных выше; поставленную задачу для него можно сформулировать следующим образом: Подсчитать, сколько раз встречается каждое имя в таблице FRUITS или сколько членов в каждой группе. Проанализировав приведенное выше выражение INSERT, можно увидеть, что строк со значениями NULL пять, т. е. существует группа NULL из пяти членов. Хотя, несомненно, значение NULL обладает свойствами, которые отличают его от других значений, тем не менее это значение, и оно может быть группой.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |