JavaRush /Курси /SQL SELF /Підрахунок кількості рядків з COUNT() та йо...

Підрахунок кількості рядків з COUNT() та його варіанти

SQL SELF
Рівень 7 , Лекція 1
Відкрита

Функція COUNT() — це одна з найпопулярніших і реально корисних агрегатних функцій у SQL. Її основна задача — рахувати кількість рядків у результатах запиту. Якби COUNT() була супергероєм у світі SQL, то її суперсила — це швидко знаходити відповіді на такі питання, як:

  • Скільки співробітників працює в компанії?
  • Яка кількість студентів навчається на кожному факультеті?
  • Скільки товарів продано за останній місяць?

Синтаксис COUNT() дуже простий:

COUNT(стовпець)

де стовпець — це ім'я стовпця, рядки якого будуть рахуватись. Але є й інші варіанти використання, які ми розберемо далі в лекції.

Давай почнемо з самого базового використання COUNT().

Варіант 1: Підрахунок усіх рядків за допомогою COUNT(*)

Коли треба порахувати кожен рядок у таблиці, незалежно від того, є там дані чи ні, юзають COUNT(*). Зірочка означає «всі стовпці».

Приклад: у нас є таблиця students з таким вмістом:

id name age
1 Otto 20
2 Maria 22
3 NULL 19
4 Anna 21

Виконаємо такий запит:

SELECT COUNT(*) 
FROM students;

Результат:

count
4

Функція COUNT(*) не звертає уваги на NULL-значення в окремих стовпцях, бо вона просто рахує кількість рядків у таблиці.

Варіант 2: Підрахунок рядків з існуючими значеннями у стовпці COUNT(column)

А що, якщо треба порахувати тільки ті рядки, де вказане не-NULL значення у конкретному стовпці? Тут юзають COUNT(column).

Приклад: порахуємо кількість студентів, у яких вказане ім'я.

SELECT COUNT(name)
FROM students;

Результат:

count
3

Бачиш різницю? У таблиці 4 рядки, але в одному з них стовпець name містить NULL. Функція COUNT(column) ігнорує рядки, де значення стовпця дорівнює NULL.

Порівняння COUNT(*) і COUNT(column)

То чим же відрізняються два варіанти використання функції: COUNT(*) і COUNT(column)?

  • COUNT(*) рахує всі рядки у таблиці, включаючи рядки з NULL у будь-яких стовпцях.
  • COUNT(column) рахує тільки ті рядки, де у вказаному стовпці значення не дорівнює NULL.

Таблиця для прикладу:

id name age
1 Otto 20
2 Maria NULL
3 NULL 19
4 Anna 21

Запити:

-- Порахує всі рядки.
SELECT COUNT(*) FROM students;         -- 4  -- TOTAL (всі рядки)

-- Порахує тільки ті рядки, де ім'я не NULL.
SELECT COUNT(name) FROM students;      -- 3  -- Рахуємо рядки з вказаним ім'ям

-- Порахує тільки ті рядки, де вік не NULL.
SELECT COUNT(age) FROM students;        -- 3  -- Рахуємо рядки з вказаним віком

Варіант 3: Підрахунок унікальних значень з COUNT(DISTINCT column)

Іноді треба порахувати тільки унікальні значення у стовпці. Наприклад, хочемо дізнатись, скільки унікальних віків вказано у студентів. Тут виручає COUNT(DISTINCT column).

Приклад:

id name age
1 Otto 20
2 Maria NULL
3 NULL 19
4 Anna 21
SELECT COUNT(DISTINCT age) FROM students;

Результат:

count
3

Зверни увагу, що тут DISTINCT ігнорує не тільки дублікати, а й NULL-значення.

Якщо ти спробуєш використати DISTINCT разом з COUNT(*), отримаєш помилку: DISTINCT можна юзати тільки до конкретних стовпців.

Приклади використання COUNT() у реальних задачах

Приклад 1. Підрахунок кількості студентів

id name age
1 Otto 20
2 Maria NULL
3 NULL 19
4 Anna 21
SELECT COUNT(*) AS total_students
FROM students;

Результат:

total_students
4

Приклад 2. Підрахунок студентів з відомим віком

id name age
1 Otto 20
2 Maria NULL
3 NULL 19
4 Anna 21
SELECT COUNT(age) AS students_with_age
FROM students;

Результат:

students_with_age
3

Приклад 3. Підрахунок унікальних віків

id name age
1 Otto 20
2 Maria NULL
3 NULL 19
4 Anna 20
SELECT COUNT(DISTINCT age) AS unique_ages
FROM students;

Результат:

unique_ages
2

Типові помилки при використанні COUNT()

Очікування, що COUNT(column) порахує всі рядки, навіть якщо є NULL.

Це не так: COUNT(column) ігнорує рядки з NULL у вказаному стовпці.

Використання COUNT(*) для підрахунку унікальних значень.

Замість цього юзай COUNT(DISTINCT column).

Забудькуватість при підрахунку конкретних даних з фільтрацією.

Наприклад:

SELECT COUNT(*) FROM students WHERE age > 20;

Тут ти отримаєш тільки студентів старше 20 років, а WHERE вже фільтрує рядки до підрахунку.

Ці нюанси часто призводять до логічних помилок у запитах. Будь уважний!

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ