0Pricing
SQL Academy · Урок

Целочисленное и десятичное деление

Избегайте неожиданных результатов с помощью приведения типов

«Целочисленное и десятичное деление» — бесплатный урок SQL Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.

Неожиданный результат

Начнём с загадки. Как Вы думаете, что возвращает следующий запрос?

Если Вы ожидаете 0.5, результат может Вас удивить. Во многих базах данных SQL деление двух целых чисел возвращает целое число — дробная часть полностью отбрасывается.

SELECT 1 / 2 AS result;

Целочисленное деление

Когда оба операнда при делении являются целыми числами, SQL выполняет целочисленное деление. Результат усекается к нулю: без округления сохраняется только целая часть.

Поэтому 1 / 2 = 0, 7 / 3 = 2, а 9 / 4 = 2. Дробная часть молча отбрасывается.

SELECT 7 / 3 AS truncated_result;

Дополнительные примеры целочисленного деления

Вот несколько примеров целочисленного деления в одном запросе. Обратите внимание, что во всех результатах дробные части потеряны. Это поведение одинаково для выражений, содержащих только целочисленные константы или столбцы.

SELECT
  10 / 4  AS ten_div_four,
  9  / 2  AS nine_div_two,
  1  / 3  AS one_div_three,
  6  / 6  AS six_div_six;

Исправление с помощью CAST

Самый надёжный способ принудительно включить десятичное деление — привести хотя бы один операнд к десятичному типу. CAST(value AS DECIMAL) или CAST(value AS NUMERIC) указывает SQL трактовать число как число с плавающей точкой, поэтому деление возвращает точный результат.

SELECT CAST(1 AS DECIMAL) / 2 AS result;

CAST для обеих сторон

Для получения десятичного результата достаточно привести к нужному типу одну сторону деления — SQL автоматически преобразует другой операнд. Однако преобразование обеих сторон явно показывает намерение и помогает избежать путаницы при последующем чтении кода.

SELECT
  CAST(7 AS DECIMAL) / CAST(3 AS DECIMAL) AS both_cast,
  CAST(7 AS DECIMAL) / 3                   AS one_cast;

Использование десятичной константы

Ещё один быстрый приём — записать один операнд как десятичную константу, добавив .0. SQL воспринимает 1.0 как десятичное число, что принудительно включает десятичную арифметику для всего выражения.

Это удобно для быстрых разовых запросов, хотя CAST понятнее в рабочем коде.

SELECT 1.0 / 2  AS decimal_result,
       7.0 / 3  AS another_result;

Практическая ловушка: данные в столбцах

Проблема особенно заметна при работе с целочисленными столбцами. Представьте таблицу для отслеживания планов продаж. Деление целочисленных столбцов даёт целые результаты — коэффициент конверсии равен 0, хотя должен быть равен 0.75!

CREATE TABLE sales_targets (
  rep         TEXT,
  achieved    INT,
  target      INT
);

INSERT INTO sales_targets VALUES
  ('Alice', 75, 100),
  ('Bob',   3,  4),
  ('Carol', 9,  10);

SELECT rep,
       achieved / target AS wrong_rate
FROM   sales_targets;

Исправление деления столбцов

Примените CAST к столбцу числителя, и деление теперь возвращает фактический коэффициент конверсии в виде десятичного числа. Знаменатель автоматически приводится к десятичному типу.

Последующее умножение на 100.0 даёт процент — при этом на всём протяжении вычислений используется десятичная арифметика.

SELECT rep,
       CAST(achieved AS DECIMAL) / target          AS conversion_rate,
       CAST(achieved AS DECIMAL) / target * 100.0  AS pct
FROM   sales_targets;

Управление точностью десятичных чисел

Вы можете управлять количеством сохраняемых десятичных знаков, указав точность и масштаб при приведении типа: DECIMAL(10, 2) означает всего до 10 цифр, из которых 2 находятся после десятичной запятой. Это полезно, когда нужен аккуратный округлённый результат, а не множество лишних цифр после запятой.

SELECT CAST(CAST(1 AS DECIMAL(10,4)) / 3 AS DECIMAL(10,2)) AS rounded_result;

ROUND после деления

Иногда нужно выполнять вычисления с полной точностью, а затем округлять итоговое отображаемое значение. Функция ROUND принимает значение и количество десятичных знаков, которые нужно сохранить.

Всегда сначала делите, используя десятичную арифметику, а затем округляйте — никогда не округляйте перед делением.

SELECT
  ROUND(CAST(1 AS DECIMAL) / 3, 4)  AS four_places,
  ROUND(CAST(1 AS DECIMAL) / 3, 2)  AS two_places,
  ROUND(CAST(1 AS DECIMAL) / 3, 0)  AS zero_places;

Целочисленное деление бывает полезным

Целочисленное деление не всегда является ошибкой — иногда оно именно то, что вам нужно. Например, преобразование общего количества минут в целые часы намеренно использует целочисленное деление. Главное — осознанно выбирать целочисленное или десятичное деление, а не получать его случайно.

SELECT
  137 / 60  AS full_hours,
  137 % 60  AS remaining_minutes;

Быстрая проверка

Проверьте, насколько хорошо Вы понимаете целочисленное и десятичное деление в SQL.

Итоги урока

В этом уроке Вы узнали, как SQL обрабатывает деление целых чисел:

  • Целое число / целое число усекает результат — десятичная часть незаметно теряется.
  • Используйте CAST(value AS DECIMAL) хотя бы для одного операнда, чтобы принудительно выполнить десятичное деление.
  • Запись десятичного литерала, например 1.0, также переводит выражение в десятичную арифметику.
  • Используйте ROUND после деления, чтобы управлять количеством отображаемых десятичных знаков.
  • Целочисленное деление иногда применяется намеренно, например при преобразовании минут в часы, но всегда делайте этот выбор осознанно, а не случайно.

Помните об этой ловушке при делении столбцов с целыми числами — это один из самых распространённых источников незаметных и трудно обнаруживаемых ошибок в SQL-запросах.

Часто задаваемые вопросы

Урок «Целочисленное и десятичное деление» бесплатный?

Да — полный текст урока «Целочисленное и десятичное деление» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.

Чему я научусь в уроке «Целочисленное и десятичное деление»?

Избегайте неожиданных результатов с помощью приведения типов Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать SQL Academy?

Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Целочисленное и десятичное деление»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке SQL Academy?

Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Арифметика и операторы
  2. Округление и усечение
  3. Целочисленное и десятичное деление
  4. Полезные математические функции
← Назад к SQL Academy