Перейти к основному содержимому

Практика: Типы данных в PostgreSQL


Онлайн редактор кода для PostgreSQL

Здесь вы можете попробовать свои силы в программировании на языке SQL для работы с PostgreSQL. Для этого мы предоставляем вам онлайн редактор кода, в котором вы можете написать свой код и запустить его.


❗️ При обновлении страницы код пропадёт, по этому, сохраните свой код куда-нибудь, если он важный.

Задание 1 — Числовые типы: счётчики и точные суммы

Задание 1: Числовые типы — счётчики и деньги

⏱️ Примерное время: 10-15 минут

Создай таблицу с разными числовыми типами и протестируй диапазоны.


Пример полей:

  • id SERIAL PRIMARY KEY
  • name VARCHAR(100) NOT NULL
  • quantity SMALLINT DEFAULT 0 CHECK (quantity >= 0)
  • views_count INTEGER DEFAULT 0
  • total_revenue BIGINT DEFAULT 0 (или NUMERIC(15,2))

Требования:

  • Вставь 3–4 записи
  • Попробуй вставить >32767 в SMALLINT → посмотри ошибку

Пример:

INSERT INTO products (name, quantity, views_count, total_revenue)
VALUES ('Ноутбук', 150, 4500, 124500000);

Задание 2 — Точные деньги: NUMERIC vs MONEY

Задание 2: Точные суммы — NUMERIC и MONEY

⏱️ Примерное время: 10-15 минут

Сравни NUMERIC и MONEY на примерах цен.


Требования:

  • Создай две таблицы: prices_numeric и prices_money
  • В обе: id SERIAL PK, item VARCHAR(100), price NUMERIC(12,4) / price MONEY
  • Вставь: 1499.99, 0.1, 1234567.89, 0.3333
  • Выполни: SELECT price * 1.2 → сравни точность
  • Сделай вывод: почему NUMERIC лучше для денег

Пример:

SELECT price * 1.2 FROM prices_numeric;  -- точный результат
SELECT price * 1.2 FROM prices_money; -- может быть округление

Задание 3 — Строки: CHAR vs VARCHAR vs TEXT

Задание 3: Строки разной длины

⏱️ Примерное время: 10-15 минут

Сравни поведение CHAR, VARCHAR и TEXT.


Пример полей:

  • code CHAR(10)
  • short_name VARCHAR(80)
  • description TEXT

Требования:

  • Вставь строки разной длины
  • Сравни LENGTH(code), CHAR_LENGTH(code), OCTET_LENGTH(code)
  • Покажи разницу в поведении CHAR (дополнение пробелами)

Пример:

INSERT INTO items (code, short_name, description)
VALUES ('ABC123 ', 'Ноутбук', 'Длинное описание...');
SELECT code, LENGTH(code), CHAR_LENGTH(code) FROM items;

Задание 4 — Даты и время: события и логи

Задание 4: Даты, время и метки

⏱️ Примерное время: 15-20 минут

Работа с DATE, TIME, TIMESTAMP, TIMESTAMPTZ.


Пример полей:

  • event_date DATE
  • start_time TIME
  • created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  • logged_at TIMESTAMPTZ DEFAULT NOW()

Требования:

  • Вставь 3–4 записи
  • Выполни:
    • NOW() - created_at
    • logged_at AT TIME ZONE 'Europe/Moscow'
    • DATE_TRUNC('day', logged_at)

Пример:

SELECT logged_at, logged_at AT TIME ZONE 'UTC' FROM logs;

Задание 5 — INTERVAL: сроки и дедлайны

Задание 5: Интервалы и напоминания

⏱️ Примерное время: 15-20 минут

Используй INTERVAL для расчётов сроков.


Пример полей:

  • due_date TIMESTAMPTZ
  • remind_before INTERVAL DEFAULT INTERVAL '3 days'
  • duration INTERVAL

Требования:

  • Вставь 3 записи
  • Вычисли:
    • due_date - remind_before
    • NOW() + INTERVAL '2 weeks 3 days'
    • AGE(due_date)

Пример:

SELECT due_date, due_date - remind_before AS remind_at FROM tasks;

Задание 6 — BOOLEAN и UUID: флаги и безопасные ID

Задание 6: Флаги и UUID

⏱️ Примерное время: 15-20 минут

Комбинируй BOOLEAN и UUID.


Пример полей:

  • id UUID PRIMARY KEY DEFAULT uuid_generate_v4()
  • is_active BOOLEAN DEFAULT TRUE
  • is_admin / is_featured BOOLEAN DEFAULT FALSE

Требования:

  • CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
  • Вставь 3–4 записи без указания id
  • Сгенерируй UUID вручную: SELECT uuid_generate_v4();

Пример:

INSERT INTO users (username, is_active) VALUES ('andrey', TRUE);

Задание 7 — JSONB: гибкие характеристики

Задание 7: Характеристики в JSONB

⏱️ Примерное время: 20-25 минут

Храни разные свойства товаров в JSONB.


Пример полей:

  • attributes JSONB

Требования:

  • Вставь 3–4 товара с разными наборами ключей
  • Выполни:
    • attributes->>'ram'
    • attributes ? 'cpu'
    • UPDATE ... SET attributes = attributes || '{"warranty":"2 years"}'
    • attributes->'sizes'->0 (первый размер)

Пример:

INSERT INTO products (name, attributes)
VALUES ('Ноутбук', '{"brand":"Dell", "ram":16, "ssd":512}');

Задание 8 — Массивы: теги, рейтинги, цвета

Задание 8: Массивы в столбцах

⏱️ Примерное время: 15-20 минут

Храни списки в массивах.


Примеры полей:

  • tags TEXT[]
  • ratings INTEGER[]
  • colors VARCHAR(50)[]

Требования:

  • Выполни:
    • tags[1]
    • 'performance' = ANY(tags)
    • array_append(tags, 'advanced')
    • array_length(tags, 1)

Пример:

INSERT INTO articles (title, tags)
VALUES ('PostgreSQL', ARRAY['sql','database','performance']);

Задание 9 — Комбинированное: полная таблица товаров

Задание 9: Полная таблица товаров (итоговое)

⏱️ Примерное время: 25-35 минут

Объедини разные типы в одной таблице.


Примеры полей:

  • id SERIAL PRIMARY KEY
  • sku CHAR(12)
  • name VARCHAR(150) NOT NULL
  • price NUMERIC(12,2) CHECK (price > 0)
  • stock SMALLINT DEFAULT 0 CHECK (stock >= 0)
  • created_at TIMESTAMPTZ DEFAULT NOW()
  • is_active BOOLEAN DEFAULT TRUE
  • tags TEXT[]
  • attributes JSONB

Требования:

  • Вставь 4–5 товаров
  • Покажи 2–3 SELECT с разными типами

Пример:

INSERT INTO products (name, price, tags, attributes)
VALUES ('Смартфон', 49990.00, ARRAY['новинка','акция'], '{"ram":8, "storage":256}');
подсказка

Ошибки переполнения, приведения типов и нарушения CHECK — твои лучшие друзья.
Читай их внимательно — они всегда объясняют, что именно пошло не так.