В университете мой профессор научил меня в этом году, что это заявление SQL:
SELECT COUNT(length) FROM product
вернется 2
со следующим набором данных:
| product |
|id | length | code |
|-------------------|
| 1 | 11 | X00 |
| 2 | 11 | C02 |
| 3 | 40 | A31 |
Она оправдала это тем, что COUNT
не считает дубликатов.
Я сказал своему профессору, что, по-моему, она допустила ошибку. Она ответила мне, что некоторые СУБД могут или не могут считать дубликаты.
Попробовав много СУБД, я так и не нашел такую, которая бы имела такое поведение.
Существует ли эта СУБД?
Есть ли у профессора повод учить этому поведению? И даже не упоминая, что другие СУБД могут вести себя по-другому?
К вашему сведению, поддержка курса доступна здесь (на французском) . Соответствующий слайд находится в левом нижнем углу на странице 10.
Ответы:
COUNT
считает ли дубликаты во всех СУБД, о которых я знаю, но.Да, есть причина. В оригинальной реляционной теории (которая лежит в основе всех современных реляционных СУБД) отношение является множеством в математическом смысле этого слова. Это означает, что ни одно отношение не может содержать дубликаты вообще, включая все переходные отношения, а не только ваши «таблицы».
Следуя этому принципу, вы можете сказать, что он
SELECT length FROM product
уже содержит только две строки, следовательно, соответствующихCOUNT
возвращений2
нет3
.Например, в СУБД Rel , используя отношение, данное в вопросе, и синтаксис Tutorial D :
дает:
источник
COUNT
поведение отличается от реализаций SQL.Либо ваш профессор ошибся, либо вы неправильно поняли, что она сказала. В контексте реляционных СУБД, реализованных различными поставщиками, агрегатная функция
COUNT(<expression>)
возвращает количество ненулевых значений<expression>
в наборе результатов (или группе).Существует особый случай
COUNT(*)
, который возвращает количество строк в наборе результатов или группе, а не количество значений чего-либо. Это эквивалентно томуCOUNT(<constant expression>)
, например , какCOUNT(1)
.Поддержка многих баз данных
COUNT(DISTINCT <expression>)
, которая будет возвращать количество уникальных значений<expression>
.источник
Если ваш профессор говорит об SQL, утверждение неверно.
COUNT(x)
вернет количество строк, где х,IS NOT NULL
включая дубликаты.COUNT(*) or COUNT([constant])
это особый случай, который будет считать строки, даже те, где каждый столбецNULL
. Однако дубликаты всегда учитываются, если вы не укажетеCOUNT(distinct x)
. Пример:COUNT(distinct *)
является недействительным AFAIK.В качестве примечания, NULL вводит неинтуитивное поведение. В качестве примера:
то есть:
Если он / она говорит о реляционной системе, как описано, например, в книге « Базы данных, типы и реляционная модель: третий манифест» С. Дж. Дейта и Хью Дарвена - это было бы правильным утверждением.
Скажи, что у нас есть отношение:
соответствует:
т.е.
который бы вернулся 2 .
источник
Вот как это работает в MS SQL Server
источник
Если бы стол выглядел так,
можно ожидать, что запрос вернет 2, по крайней мере, в Oracle DB, поскольку нули не учитываются. Дубликаты, однако, считаются просто отлично.
источник
может быть, она имеет в виду в сочетании с уникальным, но граф делает удвоение счета. Есть некоторые учителя, которые не знают своего дела, не беспокоясь, просто сообщите своим одноклассникам / друзьям, чтобы, когда они перейдут на более высокий уровень и в реальной жизни они не забудут, лучше отправьте анонимное сообщение своему учителю, спрашивая ее, что они этого не сделали. поймите некоторые функции sql и хотите демонстрацию, попросите вашего учителя дать классу способ предложить, что вставлять, включая дубликаты (не иметь больших данных), и когда она использует счетчик функций, вы получаете ее. Некоторые люди подберут его. Также, когда она говорит другие базы данных, попросите вашего друга спросить ее, а затем дважды поймайте ее в ловушку и скажите, что вы перепробовали все эти базы данных, и они не работают, как она сказала, и этот счет обнаруживает дубликаты.
источник