Мой профессор научил меня, что «COUNT» не учитывает дубликаты

В университете мой профессор научил меня в этом году, что этот оператор SQL:

SELECT COUNT(length) FROM product

вернет 2 со следующим набором данных:

|   product         |
|id | length | code |
|-------------------|
| 1 |    11  | X00  |
| 2 |    11  | C02  |
| 3 |    40  | A31  |

Она оправдала это, сказав, что COUNT не учитывает дубликаты.

Я сказал своему профессору, что я ошибся. Она ответила мне, что некоторые СУБД могут или не могут рассчитывать дубликаты.

После попыток большого количества СУБД я никогда не нашел того, у кого такое поведение.

Существует ли эта СУБД?

Есть ли причина, по которой профессор должен преподавать это поведение? И даже не упоминая, что другие СУБД могут вести себя по-другому?


FYI, поддержка курса доступна здесь (на французском) . Соответствующий слайд находится в левом нижнем углу на стр. 10.

39 голосов | спросил Jules Lamur 2 AM00000020000003831 2017, 02:00:38

6 ответов


38

COUNT делает подсчет дубликатов во всех СУБД, о которых я знаю, но.

  

Есть ли причина, по которой профессор должен преподавать это поведение

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

Следуя этому принципу, вы можете сказать, что SELECT length FROM product уже содержит только две строки, поэтому соответствующий COUNT возвращает 2, а не 3.


Например, в Rel DBMS, используя отношение, заданное в вопросе, и Учебник D синтаксис:

SUMMARIZE product {length} BY {}: {c := COUNT()}

дает:

 Rel result

ответил Vadim Pushtaev 2 PM00000030000004631 2017, 15:57:46
47

Либо ваш профессор допустил ошибку, либо вы неправильно поняли, что она сказала. В контексте реляционных СУБД, реализованных различными поставщиками, агрегированная функция COUNT(<expression>) возвращает количество не-NULL значений <expression> в результирующем наборе (или группе).

Существует специальный случай COUNT(*), который возвращает число rows в результирующем наборе или группе, а не в количестве значений чего-либо. Это эквивалентно COUNT(<constant expression>), например COUNT(1).

Многие базы данных поддерживают COUNT(DISTINCT <expression>), который будет возвращать число уникальных значений <expression>.

ответил mustaccio 2 AM00000040000004831 2017, 04:09:48
13

Если ваш профессор говорит о SQL, утверждение неверно. COUNT(x) будет возвращать количество строк, где x IS NOT NULL, включая дубликаты. COUNT(*) or COUNT([constant]) - это особый случай, который будет считать строки, даже те, где каждый столбец NULL. Однако дубликаты всегда учитываются, если вы не укажете COUNT(distinct x). Пример:

with t(x,y) as ( values (null,null),(null,1),(1,null),(1,1) )

select count(*) from t
4

select count(1) from t
4

select count(distinct 1) from t
1

select count(x) from t
2

select count(distinct x) from t
1

COUNT(distinct *) недействителен AFAIK.

В качестве дополнительной заметки NULL вводит какое-то неинтуитивное поведение. В качестве примера:

SELECT SUM(x) + SUM(y),  SUM(x + y) FROM T
4, 2

то есть:

SUM(x)+SUM(y) <> SUM(x+y)

Если он /она говорит о реляционной системе, как описано, например, в книге Базы данных, типы и реляционная модель: третий манифест от CJ Date и Hugh Darwen - это было бы правильное утверждение.

Скажем, что мы имеем отношение:

 STUDENTS = Relation(["StudentId", "Name"]
                    , [{"StudentId":'S1', "Name":'Anne'},
                       {"StudentId":'S2', "Name":'Anne'},
                       {"StudentId":'S3', "Name":'Cindy'},
                     ])
SELECT COUNT(NAME) FROM STUDENTS

соответствует:

COUNT(STUDENTS.project(['Name']))

то есть.

 COUNT( Relation(["Name"]
               , [{"Name":'Anne'},
                  {"Name":'Cindy'},
                ]) )

, который вернет 2 .

ответил Lennart 2 PM00000040000000331 2017, 16:27:03
3

Вот как это работает в MS SQL Server

  

COUNT (*) возвращает количество элементов в группе. Это включает NULL   значения и дубликаты.

     

COUNT (выражение ALL) оценивает выражение для каждой строки в группе и   возвращает число ненулевых значений.

     

COUNT (выражение DISTINCT) оценивает выражение для каждой строки в   group и возвращает количество уникальных значений nonnull.

ответил Daniel Björk 2 PM00000040000001531 2017, 16:06:15
1

Если таблица выглядела так,

|   product         |
|id | length | code |
|-------------------|
| 1 |    11  | X00  |
| 2 |    11  | C02  |
| 3 |  null  | A31  |

вы могли ожидать, что запрос вернет 2, по крайней мере, в Oracle DB, поскольку значения NULL не учитываются. Дубликаты, однако, считаются просто прекрасными.

ответил Terje 2 PM00000020000005131 2017, 14:25:51
-7

может быть, она подразумевает в сочетании с уникальным, но Count делает COUNT DUPLICATES. Есть несколько учителей, которые не знают своих вещей, не беспокойтесь, просто сообщите своим одноклассникам /друзьям, чтобы, когда они перейдут к высшему db и реальной жизни, они не забудут, тем не менее, отправите анонимное сообщение своему учителю, спрашивая ее, что они не понять некоторые из функций sql и попробовать демонстрацию, попросите своего учителя предложить класс, чтобы предлагать, что нужно вставлять, включая дубликаты (не имея больших данных), и когда она использует счет функции, вы ее получили. Некоторые люди будут нажимать на нее. Также, когда она говорит о других базах данных, попросите своего друга спросить ее, какие из них, а затем удвоить ее и сказать, что вы пробовали все эти базы данных, и они не работают, как она говорила, и этот счет собирает дубликаты.

ответил dasda 4 PM00000050000001431 2017, 17:24:14

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132