Список числовых функций

Как мы говорили выше, для СУБД мало просто хранить данные определенного типа, нужно еще поддерживать обширный набор супербыстрых операций над данными этих типов.

И, как ты знаешь, все СУБД поддерживают разнообразные числовые типы и операции над ними. Сегодня ты познакомишься с самыми популярными из них.

Все числовые функции в MySQL можно условно разделить на 5 групп:

  • Арифметически операции
  • Битовые операции
  • Функции округления
  • Алгебраические функции
  • Тригонометрические функции

Кстати, с очень многими из них ты знаком благодаря языку Java, так что думаю они не станут для тебя сюрпризом. Но начнем по порядку.

Полный список функций можно найти по ссылке.

Арифметические операции

Тут в принципе ничего неожиданного, все те же стандартные операции, как и везде:

# Пример
1 +, -, *, / 2+2*2 Сложение, вычитание, умножение, деление (не нацело!)
2 % 13 % 5 Остаток от деления
3 MOD 13 MOD 5 Остаток от деления
4 DIV 13 DIV 5 Деление нацело

Из интересного: при делении двух целых чисел получится вещественно число. Для деления нацело нужно использовать оператор DIV.

Если ты хочешь получить остаток от деления нацело, то нужно использовать или оператор MOD или % как в языке Java. Примеров приводить не буду, как по мне тут и так все очевидно.

Битовые операции

Над числами в SQL можно также проводить битовые операции, примерно, как и в языке Java. Хотя есть нюансы. Список доступных битовых операций представлен в таблице ниже:

# Пример Примечание
1 & 0b1111 & 0b1000 Побитовый AND
2 | 0b1111 | 0b0001 Битовый OR
3 ^ 0b1111 ^ 0b1111 Битовый XOR
4 ~ ~0b1111 Побитовая инверсия
5 >> 128 >> 5 Битовый сдвиг вправо
6 << 2 << 5 Битовый сдвиг влево
7 BIT_COUNT() BIT_COUNT(255) Возвращает количество бит, которые равны 1

В MySQL до версии 8.0 такие операции можно было выполнять только с типом данных BIGINT, который состоял из 64 бит и был аналогичен типу long в Java. Однако в MySQL 8.0 (который мы и рассматриваем) концепция поменялась. Теперь эти операции можно выполнять над специальными двоичными типами:

  • BINARY
  • VARBINARY
  • А также над типами BLOB (которые представляют из себя массив байт)

Все остальные типы просто приводятся к типу BIGINT и операции выполняются, как и ранее (только над первыми 64 битами).

Функции округления

Для округления в MySQL используются до боли знакомые тебе функции. Список их приведен в таблице ниже:

# Пример Примечание
1 CEIL(), CEILING() CEIL (5.1) = 6 Округляет вещественное число вверх
2 FLOOR() FLOOR (5.9) = 5 Округляет вещественное число вниз
3 ROUND() ROUND(4.1) = 4 Округляет вещественное число до ближайшего целого
4 TRUNCATE() TRUNCATE(4.123, 2) = 4.12 Обрезает число до N знаков после запятой
5 RAND() 0.61914388706828 Возвращает случайное вещественное число в диапазоне от 0 до 1
6 RAND(N) 0.93845168309142 Возвращает случайное вещественное число в диапазоне от 0 до 1. N используется как seed value

Со всеми функциями округления ты знаком еще со времен первого квеста в Java. Интерес тут может представлять только функция TRUNCATE() и RANDOM(N).

Функция TRUNCATE (число, количество) принимает в качестве первого параметра вещественное число, а в качестве второго – количество знаков поле запятой, которое должно оставаться. Число обрезается до нужного количества знаков после запятой.

Что касается функции RAND(N) все немного сложнее. Как ты, наверное, знаешь, компьютер не может генерировать случайные числа. Вместо этого он генерирует так называемую последовательность псевдослучайных чисел. То есть глядя на одно число не понятно – случайное оно или нет, а вот последовательность чисел уже может быть похожей на случайную. Этим и пользуются разработчики, генерируя последовательность чисел, которая очень похожа на случайную.

При этом каждое новое число последовательности генерируется по хитрому правилу на основе предыдущего числа этой последовательности. Поэтому если ты передашь в алгоритм генерации случайных чисел некое стартовое число (его еще называют seed), то каждый раз будешь получать одну и ту же последовательность случайных чисел.