Функція 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 вже фільтрує рядки до підрахунку.
Ці нюанси часто призводять до логічних помилок у запитах. Будь уважний!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ