Неочевидный SQL - решение count()

Напомню, как выглядит таблица

id c1
1 null
2 null
3 null
null id
null null

И вот собственно ответ:

  • count(*) = 5
  • count(1) = 5
  • count(2) = 5
  • count(id) = 3
  • count(‘id’) = 5
  • count(null) = 0

Если честно, я правильно ответил только для count(* ) и count(id) - потому что только в таком виде и использую count(). И то, для count(*) сомневался - потому что последняя строка таблицы с одними null ИМХО не возможна в реляционной теории :)

Про формат count(1) и count(2) - почему то всё время знакомства с SQL думал что это указывают номер столбца вместо прямого указания имени, примерно как в group by или order by (нет). Сам так никогда не делаю (“явное лучше неявного”), поэтому с проблемами не сталкивался.

count(‘id’) и count(null) - в таком виде тоже никогда не использовал, так что сомневался будет ли это вообще работать

Теперь, как это работает на самом деле.

count(*) считает все строки, независимо от их содержимого

count(column_name) - подсчитывает количество строк, где значение в указанном столбце не равно null

Все остальные варианты попадают под count(expression) - подсчитывает количество строк, для которых выражение не вычисляется в null. Если выражение всегда возвращает не-null (например, константа или литерал), то все строки будут посчитаны.

Written on November 25, 2024