← К оглавлению занятия

Занятие 12. Summary session 3

📁 Блок: SQL / MySQL / Повторение ⏱️ Время изучения: ~60 мин 🎯 Сложность: Начальная
#decimal #float #varchar #time #datetime #timestamp #year #signed #unsigned #char #date #now #curdate #curtime #date_format #datediff #date_add #date_sub #month #day #extract #from #int #cast

⚡ Кратко: суть темы

Повторяем темы занятий 9–11: типы данных, преобразование типов через CAST, скрытые преобразования в MySQL, типы даты/времени и основные функции для работы с датами.

  • Числовые, строковые, булевы и временные типы данных.
  • Явное преобразование — CAST(expression AS type).
  • Скрытые преобразования в MySQL: строки ↔ числа.
  • DATE, TIME, DATETIME, TIMESTAMP, YEAR и функции NOW, DATE_ADD, DATEDIFF, DATE_FORMAT.

Что запомнить: правильный тип данных и явное преобразование делают запросы предсказуемыми и переносимыми.

Частая ошибка: полагаться на неявные преобразования при переносе запросов между СУБД.

📖 Типы данных

Каждому столбцу в таблице назначается тип данных. Он определяет:

  • какие значения можно хранить;
  • сколько места занимают данные;
  • какие операции доступны.
КатегорияТипыПримеры использования
ЧисловыеINT, DECIMAL, FLOATКоличество, цена, расчёты
СтроковыеCHAR, VARCHAR, TEXTИмена, адреса, описания
БулевыBOOLEAN / TINYINT(1)Флаги активности, роли
Дата и времяDATE, TIME, DATETIME, TIMESTAMP, YEARДаты заказов, логи, события

📖 Явное преобразование: CAST

Функция CAST преобразует выражение в указанный тип данных. В MySQL часто используются:

  • SIGNED / UNSIGNED — целые числа.
  • DECIMAL — точные числа.
  • CHAR — строки (в MySQL вместо VARCHAR).
  • DATE, TIME, DATETIME — дата и время.
SELECT CAST('123' AS SIGNED) AS number;
SELECT CAST(id AS CHAR(10)) AS id_string FROM customers;
SELECT CAST('2024-08-25' AS DATE) AS converted_date;

📖 Скрытые преобразования в MySQL

MySQL часто преобразует типы автоматически:

  • Строка с числом → число при арифметике.
  • Число → строка при конкатенации.
  • Строка → число при сравнении со числом.
SELECT '100' + 50 AS arithmetic_result;     -- 150
SELECT CONCAT('Total: ', 150) AS msg;        -- 'Total: 150'
SELECT * FROM products WHERE unit_in_stock = '50';

Проверить по документации: скрытые преобразования зависят от СУБД и версии. Для переносимых запросов используйте CAST.

📖 Дата и время

Основные типы:

  • DATE — только дата.
  • TIME — только время.
  • DATETIME — дата и время.
  • TIMESTAMP — момент времени с учётом часового пояса.
  • YEAR — только год.

Частые функции:

  • NOW(), CURDATE(), CURTIME() — текущий момент.
  • DATE_FORMAT(date, format) — форматирование.
  • DATEDIFF(date1, date2) — разница в днях.
  • DATE_ADD(date, INTERVAL n unit), DATE_SUB(...) — сдвиг даты.
  • YEAR(date), MONTH(date), DAY(date), EXTRACT(...) — части даты.

📖 Различия MySQL и PostgreSQL

ОперацияMySQLPostgreSQL
Текущая дата/времяNOW()NOW(), CURRENT_TIMESTAMP
Текущая датаCURDATE()CURRENT_DATE
Разница в дняхDATEDIFF(d1, d2)DATE_PART('day', d1 - d2)
Добавить интервалDATE_ADD(d, INTERVAL 7 DAY)d + INTERVAL '7 days'
Извлечь годYEAR(d)EXTRACT(YEAR FROM d)

✨ Итоги блока

  • Выбирайте тип данных под задачу: деньги — DECIMAL, даты — DATE/DATETIME.
  • Явно приводите типы через CAST, чтобы избежать сюрпризов.
  • Не полагайтесь на скрытые преобразования при работе с несколькими СУБД.
  • Для дат используйте специальные функции, а не строковые манипуляции.