ЛЕКЦІЯ 5

Типи даних у SQL

Основи баз даних

VTFK • 2025

Що вже вивчили

Лекція 4: Реляційна модель

  • PK/FK та обмеження
  • CREATE TABLE
  • Цілісність даних

План лекції

  • Числові типи (INT, DECIMAL)
  • Рядкові типи (VARCHAR, TEXT)
  • Дата/час та булеві
  • Обираємо правильний тип

Фокус: як вибрати тип для колонки

Навіщо типи даних

Тип даних

Data Type

Категорія значення в колонці, яка визначає допустимі операції, формати та обсяг пам'яті.

Аналогія: Як контейнер: INT вмішує число, VARCHAR вмішує текст з обмеженням довжини

Дерево типів

Головні групи

%%{init: {"theme": "neutral", "mermaid": {"version": "11.12.2"}}}%% graph TB Root[SQL Types] Root --> Numeric[Numeric] Root --> String[String] Root --> Temporal[Temporal] Root --> Boolean[Boolean] Numeric --> INT[INT/BIGINT] Numeric --> DECIMAL[DECIMAL/FLOAT] String --> VARCHAR[VARCHAR] String --> TEXT[TEXT] Temporal --> DATE[DATE] Temporal --> TIME[TIME] Temporal --> TIMESTAMP[TIMESTAMP]

Числові типи

Тип Розмір Діапазон Використання
TINYINT 1 B 0–255 флаги
INT/INTEGER 4 B ±2.1B ID, кількості
BIGINT 8 B ±9.2e18 великі суми
DECIMAL(p,s) змінна точно гроші, ставки
FLOAT/DOUBLE 4/8 B наблиз. вимірювання, AI

Коли вибирати DECIMAL vs FLOAT

Рядкові типи

Рядкові типи: порівняння

Тип Розмір Пошук Сортування
CHAR(10) 10 B завжди швидкий ОК
VARCHAR(255) до 255 B нормальний ОК
TEXT необмежено повільний потребує індексу

Кодування та колейції

Типи дат/часу

Для часових даних

%%{init: {"theme": "neutral", "mermaid": {"version": "11.12.2"}}}%% graph LR TemporalTypes[Часові типи] TemporalTypes --> DATE[DATE
YYYY-MM-DD] TemporalTypes --> TIME[TIME
HH:MM:SS] TemporalTypes --> TIMESTAMP[TIMESTAMP
YYYY-MM-DD HH:MM:SS] TemporalTypes --> INTERVAL[INTERVAL
між двома точками]

Приклади типів (PostgreSQL)

Різні колонки, різні типи

CREATE TABLE products (
  id BIGSERIAL PRIMARY KEY,
  name VARCHAR(255) NOT NULL,
  description TEXT,
  price DECIMAL(10, 2),
  quantity INT DEFAULT 0,
  is_available BOOLEAN DEFAULT true,
  created_at TIMESTAMP DEFAULT now(),
  last_updated DATE
);

Best practices для типів

Міні-вікторина

Яким типом зберігати ціну товару?

  • FLOAT — простіше
  • DECIMAL(10,2) — точна грошева сума
  • INT копійки — обхід
✅ Правильна відповідь: DECIMAL(10,2) — точна грошева сума
💡 Пояснення:

DECIMAL зберігає точно, избігаючи помилок округлення.

Помилка: VARCHAR без обмеження

⚠️ ЗАСТЕРЕЖЕННЯ

VARCHAR(65535) або просто VARCHAR губить оптимізацію

❌ Неправильно

CREATE TABLE users (email VARCHAR);  -- невизначений розмір

БД не може правильно розподілити сторінки

✓ Правильно

CREATE TABLE users (email VARCHAR(255) NOT NULL UNIQUE);

Явна довжина дозволяє оптимізувати індекси

Вибір типу (алгоритм)

Як систематично вибрати

T0

Природа

Число, текст, час, логіка?

T1

Діапазон

INT, BIGINT, DECIMAL?

T2

Обмеження

VARCHAR(n) чи TEXT?

T3

Точність

FLOAT чи DECIMAL?

T4

DEFAULT

NULL, значення або now()?

Занули та BOOLEAN

Окремі типи

%%{init: {"theme": "neutral", "mermaid": {"version": "11.12.2"}}}%% graph LR Boolean[BOOLEAN] Boolean --> True[true/TRUE] Boolean --> False[false/FALSE] Boolean --> Null[NULL=невідомо] Note[Багато БД не мають BOOLEAN,
вживають INT 0/1 або ENUM]

Спеціальні типи

Міні ТЗ: схема інтернет-магазину

Повна схема магазину

З урахуванням типів

CREATE TABLE users (
  id BIGSERIAL PRIMARY KEY,
  email VARCHAR(255) UNIQUE NOT NULL,
  password_hash VARCHAR(255),
  name VARCHAR(100),
  birth_date DATE,
  created_at TIMESTAMP DEFAULT now()
);

CREATE TABLE products (
  id BIGSERIAL PRIMARY KEY,
  name VARCHAR(200) NOT NULL,
  price DECIMAL(10,2) NOT NULL CHECK (price > 0),
  stock INT DEFAULT 0
);

CREATE TABLE orders (
  id BIGSERIAL PRIMARY KEY,
  user_id BIGINT REFERENCES users(id),
  product_id BIGINT REFERENCES products(id),
  quantity INT NOT NULL CHECK (quantity > 0),
  created_at TIMESTAMP DEFAULT now(),
  status VARCHAR(20) DEFAULT 'pending'
);

Підсумки

  • Типи гарантують дані та оптимізують простір
  • INT/BIGINT для чисел, DECIMAL для грошей
  • VARCHAR(n) для текстів з лімітом, TEXT для більших

Далі — базові SELECT запити

Домашнє завдання

Наступна лекція:

Лекція 6: Вступ до SQL

📚 Корисні ресурси:

📚 Корисні ресурси:

Дякую за увагу! 💾

← Повернутися до списку лекцій