Неочевидный 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 (например, константа или литерал), то все строки будут посчитаны.