Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.29;
Скачать: CL | DM;

Вниз

Понятие NULL   Найти похожие ветки 

 
Тульский ©   (2006-09-28 08:45) [0]

Смотрю методичку по лаб. работам с БД. И вижу:
Значение NULL. Значение NULL в SQL - это неизвестное значение, которое не следует путать с пустым. Пустое значение - это отсутствие данных, в случае же значения NULL неизвестно, какое зна-чение должно быть записано в данном поле. Значения NULL трактуются в SQL особым образом. Пустые значения равны друг другу, значения NULL — не равны, что интуитивно по-нятно, так как это неизвестные значения, а два неизвестных значения не должны обяза-тельно быть равны друг другу.
По-моему, гон. Википидия дает определение NULL как отсутствующее значение. Учебник от Microsoft Corporation Проектирование и реализация баз данных Microsoft SQL Server 2000. Учебный курс MCAD/
MCSE, MCDBA/ И вовсе называет NULL - пустым значением.
А вы как считаете?


 
Внук ©   (2006-09-28 08:47) [1]

Тут скорее всего имеется в виду, что пустая строка и NULL - не одно и то же. Хотя изложено коряво.


 
Sergey13 ©   (2006-09-28 09:19) [2]

У разных серверов наверное и слегка разные интерпретации NULL. Например в Оракле вставляя "" вставляется NULL. В ФБ вставятся именно "" и NULL, т.е. по разному.


 
pasha_golub ©   (2006-09-28 09:27) [3]

Mantra:
NULL is a state, not a value.
NULL is a state, not a value.
NULL is a state, not a value.


Кстати, мужики, есть у кого-нибудь короткие такие определения или что-нибудь эдакое, что может служить подсказкой дня (tip of the day) при старте програмы? Интересует дизайн БД.


 
Sergey13 ©   (2006-09-28 09:30) [4]

> [3] pasha_golub ©   (28.09.06 09:27)

Нормализация - не цель, а метод.
Занимаясь нормализацией главное не переусердствовать.

8-)


 
pasha_golub ©   (2006-09-28 09:40) [5]


> Sergey13 ©   (28.09.06 09:30) [4]

Круто. :-) А англицкий вариант есть? Я то переведу, просто может эта фраза уже узнаваема в каком-либо виде.


 
Sergey13 ©   (2006-09-28 09:47) [6]

> [5] pasha_golub ©   (28.09.06 09:40)

Если честно, это мои фразы (хотя на уникальность не претендую 8-), посему аглицкого варианта нет. Переводи как хочешь. Ссылка на меня НЕ обязательна.
8-)


 
Johnmen ©   (2006-09-28 09:48) [7]


> Тульский ©   (28.09.06 08:45) 


Хорошо изложено, доходчиво и понятно.
А от того, что палец назовут ж...й, он пальцем быть не перестанет :))


 
Курдль ©   (2006-09-28 09:51) [8]


> Sergey13 ©   (28.09.06 09:19) [2]
> Например в Оракле вставляя "" вставляется NULL.

Не верю! :(  
Надо срочно проверить. А то я - наивный чукотский мальчик, думал, что вставляется значение, равное пустой строке...


 
Sergey13 ©   (2006-09-28 10:04) [9]

> [8] Курдль ©   (28.09.06 09:51)

Я перед тем как писать проверил на 8.1.7. 8-)


 
Тульский ©   (2006-09-28 10:05) [10]


> Johnmen ©   (28.09.06 09:48) [7]


> Хорошо изложено, доходчиво и понятно.

Но неправильно.


 
Курдль ©   (2006-09-28 10:28) [11]


> Sergey13 ©   (28.09.06 10:04) [9]
> Я перед тем как писать проверил на 8.1.7. 8-)

Черт! Оракла под рукой нет. Проверил на DB2 AS/400.
Запросы
select count(*) from T where F is Null
select count(*) from T where F = ""

выдают совершенно разные ответы...


 
Sergey13 ©   (2006-09-28 10:33) [12]

> [11] Курдль ©   (28.09.06 10:28)

Я создал табличку test(id,name). Вставил туда
insert into test(id,name) values(1,"");
insert into test(id,name) values(2,NULL);
select * from test where name is NULL
1
2
select * from test where name=""
данных нет.


 
Johnmen ©   (2006-09-28 10:44) [13]


> Тульский ©   (28.09.06 10:05) [10]
> Но неправильно.


Что конкретно неправильно?


 
Тульский ©   (2006-09-28 11:42) [14]

вот это:

> Значение NULL в SQL - это неизвестное значение


 
Palladin ©   (2006-09-28 11:46) [15]

почему? для "неизвестного значения" в SQL есть что то другое?


 
Johnmen ©   (2006-09-28 12:07) [16]


> Тульский ©   (28.09.06 11:42) [14]
> вот это:> Значение NULL в SQL - это неизвестное значение


А что, известное?
Да и дело не в терминах. А в сути. Про палец я уже говорил :)


 
Тугодум ©   (2006-09-28 12:09) [17]

Oracle must die? :)


 
Reindeer Moss Eater ©   (2006-09-28 12:47) [18]

Oracle must have!

Прикол с пустой строкой и нулом там с незапамятных времен. Это не баг а фича!

select sysdate from dual where "" = ""


 
Тугодум ©   (2006-09-28 13:09) [19]

Reindeer Moss Eater ©   (28.09.06 12:47) [18]

Что в результате? Системная дата в единственном экземпляре?


 
Reindeer Moss Eater ©   (2006-09-28 13:13) [20]

В результате пустой НД


 
Баба Яга   (2006-09-28 13:14) [21]


> А что, известное?
> Да и дело не в терминах. А в сути. Про палец я уже говорил
> :)

Уважаемый, если вы не понимаете логики SQL, то может стоит задуматься над тем, что называть пальцем, а кого им делали, и соответственно кто чем думает.
SQL запрос должен выдавать только то, что ТОЧНО соответствует запросу. И если в запросе стоит условие = "", то должны учитываться только пустые строки, а в строках с NULL нет ничего (например ещё не присвоено), даже пустой строки, поэтому они не соответствуют условию. Если вы этого не понимаете, то не надо говорить что палец это ж..а, а то возникают сомнения по поводу того, чем вы думаете.


 
Игорь Шевченко ©   (2006-09-28 13:19) [22]

Баба Яга   (28.09.06 13:14) [21]

В SQL равенство с NULL никто вроде не пишет. Обычно для этого используется оператор IS, который прекрасно выбирает по условию IS NULL


> Если вы этого не понимаете


Эта...при блистании интеллектом все-таки за словарным запасом надо следить. Вытру нафиг.


 
Баба Яга   (2006-09-28 13:32) [23]


> Эта...при блистании интеллектом все-таки за словарным запасом
> надо следить. Вытру нафиг.

Мильён пардонов, действительно уважаемый! Никоим образом не хотел оскорбить чувств присутствующих, я лишь употребил цитаты, из написанного ранее, но если это кого задело, то примите мои искренние извинения.
В моём сообщении нет записи "=NULL". Но ваше замечание ценно ещё и тем, для понимания вопроса, что к понятию NULL условие равенства даже не применяется, в отличие от "пустой строки", которую сравнивать разрешено.


 
Johnmen ©   (2006-09-28 13:45) [24]


> Уважаемый, если вы не понимаете логики SQL


А если понимаю, то что?


> Если вы этого не понимаете


А если понимаю, то что?

Почему логическое выражение неполное? В NULL ушло?


 
Баба Яга   (2006-09-28 13:50) [25]


> А если понимаю, то что?

Если бы понимали, то не написали бы:

> А от того, что палец назовут ж...й, он пальцем быть не перестанет
> :))


 
Sergey13 ©   (2006-09-28 13:52) [26]

> [25] Баба Яга   (28.09.06 13:50)

А ты не согласен? Ты считаешь, что палец после переименования, станет мягче и толще? 8-)


 
Johnmen ©   (2006-09-28 13:54) [27]

>Если бы понимали, то не написали бы:

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


 
Баба Яга   (2006-09-28 13:59) [28]

Johnmen ©   (28.09.06 13:54) [27]
Благодарю.
Однако смею заверить, что Ваше мнение интересует окружающих, так же сильно, как и моё, тем более, что Вы его очень убедительно аргументируете.
Однако это уже переходит в личное общение и глубокоуважаемый модератор имеет все основания удалить эти сообщения. Не будем засорять тему.


 
Johnmen ©   (2006-09-28 14:01) [29]


> Баба Яга   (28.09.06 13:59) [28]
> так же сильно, как и моё,


Не льсти себе, мой загадочный друг.


 
Внук ©   (2006-09-28 14:52) [30]

Изложено коряво. Потому что надо уточнять, что под пустым значением имеется в виду строка нулевой длины. Иначе возникает вопрос - что такое "пустая дата" и "пустое число". В двух последних случаях понятие "пустое значение" не имеет смысла. Есть либо некоторое значение, либо отсутствие значения (неизвестное значение, NULL).
То, как Oracle обходится с пустой строкой - печальный факт, но не образец для подражания.


 
kaif ©   (2006-09-28 15:41) [31]

Вообще тема интересная.
Изложено, действительно, криво.

значения NULL — не равны

Например из сказанного неясно, что вернет такое вот выражение:

(Field1 = NULL) or (Field1 <> NULL)

Судя по сказанному, вернет TRUE.
А вот судя по ИМХО, вернет опять NULL
:)


 
Тульский ©   (2006-09-28 15:58) [32]

DECLARE @A INT, @B INT
SET @A = Null
SET @B = Null

if @A = @B print "TRUE" else print "FALSE"
if @A <> @B print "TRUE" else print "FALSE"

---
Результат:

FALSE
FALSE


 
vuk ©   (2006-09-28 23:13) [33]

Какое такое нафиг неизвестное значение? Данные, они либо есть либо нет(NULL). Третьего не бывает. Сравнивать с нечто с понятием "нет данных" смысла особого нет, поэтому при сравнении получаем false. При сложении чего угодно с NULL получим опять же NULL.


 
Ученик чародея.   (2006-09-28 23:35) [34]


> Смотрю методичку по лаб. работам с БД. И вижу:
> Значение NULL. Значение NULL в SQL - это неизвестное значение,
>  которое не следует путать с пустым. Пустое значение - это
> отсутствие данных, в случае же значения NULL неизвестно,
>  какое зна-чение должно быть записано в данном поле. Значения
> NULL трактуются в SQL особым образом. Пустые значения равны
> друг другу, значения NULL — не равны, что интуитивно по-
> нятно, так как это неизвестные значения, а два неизвестных
> значения не должны обяза-тельно быть равны друг другу.
> По-моему, гон. Википидия дает определение NULL как отсутствующее
> значение. Учебник от Microsoft Corporation Проектирование
> и реализация баз данных Microsoft SQL Server 2000. Учебный
> курс MCAD/
> MCSE, MCDBA/ И вовсе называет NULL - пустым значением.
> А вы как считаете?


При логических операциях со значениями типа Null в БД получается третье логическое значение Unknown, а не True или False.

Советую почитать книгу Гектор Гарсиа-Молина, Джеффри Д. Ульман, Дженнифер Уидом "Системы баз данных полный курс". Хотя у Дейта лучше описывается.


 
evvcom ©   (2006-09-29 08:59) [35]

> [8] Курдль ©   (28.09.06 09:51)
> Не верю! :(  

А зря. Так и есть. Oracle 9.2

> [17] Тугодум ©   (28.09.06 12:09)

Не... Тугодум must die! :-)

> [30] Внук ©   (28.09.06 14:52)
> То, как Oracle обходится с пустой строкой - печальный факт,
> но не образец для подражания

А какой смысл разделять понятия "пустая строка" и "пустое значение в строке"? Каков практический смысл? Практически каждый день пишу на нем, и ни разу не было даже мысли, что здесь разработчики оракла не правы.

> [32] Тульский ©   (28.09.06 15:58)

Надо было писать "... else print "FALSE или неопределено""!
[0] А в методичке упоминается какая-нить конкретная СУБД? Для каких-то это верно, для Оракла - лажа.


 
Тугодум ©   (2006-09-29 09:15) [36]

evvcom ©   (29.09.06 08:59) [35]

А какой смысл разделять понятия "пустая строка" и "пустое значение в строке"? Каков практический смысл? Практически каждый день пишу на нем, и ни разу не было даже мысли, что здесь разработчики оракла не правы.

Да уж, человек ко всему привыкает. Я думаю, если бы в Oracle не было бы и пустой строки, а была бы строка из одного пробела, ты бы то же самое сказал:
А какой смысл разделять понятия "пустая строка" и "строка из одного пробела"? Каков практический смысл? Практически каждый день пишу на нем, и ни разу не было даже мысли, что здесь разработчики оракла не правы

:)


 
Внук ©   (2006-09-29 09:20) [37]

>>evvcom ©   (29.09.06 08:59) [35]
>>Каков практический смысл? Практически каждый день пишу на нем, и ни разу не было даже мысли, что здесь разработчики оракла не правы.
 Практически - никакого. Тоже почти каждый день пишу на нем, и не страдаю. Но теоретически - не правы.


 
Внук ©   (2006-09-29 09:22) [38]

Например, запрос
Select * from table1 where field1="" будет работать не так, как следовало бы ожидать теоретически


 
Тугодум ©   (2006-09-29 09:51) [39]

Внук ©   (29.09.06 09:20) [37]

Ну вот первый пришедший на ум случай - заполняется БД с каким-либо необязательным полем, причем оператор может выбрать NULL для указания того, что значение ему неизвестно, либо указать "", если значение - пустая строка.
Например, пусть это будет номер мобильного телефона или отчество.
Возможно, кто-то из других операторов знает нужное значение и сможет затем отредактировать строку и заменить NULL. Но в Oracle придется заводить еще одно поле, чтобы оператору не пришлось каждый раз просматривать записи с "" и догадываться, настоящиая это пустая строка или всего лишь неизвестное значение.


 
Sergey13 ©   (2006-09-29 09:59) [40]

> [39] Тугодум ©   (29.09.06 09:51)

Фантазер. 8-)
Просто надо знать особенности того инструмента (а сервер БД это именно инструмент) с которым работаешь. Х.З. почему Ораклы так обрабатывают NULL, но наверное не с бухты-барахты.



Страницы: 1 2 3 4 5 6 7 8 9 
10 вся ветка

Текущий архив: 2006.10.29;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.036 c
3-1156875836
Николай_Москва
2006-08-29 22:23
2006.10.29
Запрос к 2м таблицам, объединенным отн. многие-ко-многим


15-1160362661
Slider007
2006-10-09 06:57
2006.10.29
С днем рождения ! 8 октября


2-1160662054
novill
2006-10-12 18:07
2006.10.29
Почему TFileStream.size показывает 0 если файл отрывается


2-1160653889
Alex_C
2006-10-12 15:51
2006.10.29
TMemo и DoubleBuffered проблема


15-1160223275
Adder
2006-10-07 16:14
2006.10.29
Anatoly Podgoretsky с днём рождения!