Практика: Типы данных в PostgreSQL
Онлайн редактор кода для PostgreSQL
Здесь вы можете попробовать свои силы в программировании на языке SQL для работы с PostgreSQL. Для этого мы предоставляем вам онлайн редактор кода, в котором вы можете написать свой код и запустить его.
❗️ При обновлении страницы код пропадёт, по этому, сохраните свой код куда-нибудь, если он важный.
Задание 1 — Числовые типы: счётчики и точные суммы
Задание 1: Числовые типы — счётчики и деньги
⏱️ Примерное время: 10-15 минутСоздай таблицу с разными числовыми типами и протестируй диапазоны.
Пример полей:
id SERIAL PRIMARY KEYname VARCHAR(100) NOT NULLquantity SMALLINT DEFAULT 0 CHECK (quantity >= 0)views_count INTEGER DEFAULT 0total_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 DATEstart_time TIMEcreated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMPlogged_at TIMESTAMPTZ DEFAULT NOW()
Требования:
- Вставь 3–4 записи
- Выполни:
NOW() - created_atlogged_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 TIMESTAMPTZremind_before INTERVAL DEFAULT INTERVAL '3 days'duration INTERVAL
Требования:
- Вставь 3 записи
- Вычисли:
due_date - remind_beforeNOW() + 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 TRUEis_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 KEYsku CHAR(12)name VARCHAR(150) NOT NULLprice NUMERIC(12,2) CHECK (price > 0)stock SMALLINT DEFAULT 0 CHECK (stock >= 0)created_at TIMESTAMPTZ DEFAULT NOW()is_active BOOLEAN DEFAULT TRUEtags TEXT[]attributes JSONB
Требования:
- Вставь 4–5 товаров
- Покажи 2–3 SELECT с разными типами
Пример:
INSERT INTO products (name, price, tags, attributes)
VALUES ('Смартфон', 49990.00, ARRAY['новинка','акция'], '{"ram":8, "storage":256}');
Ошибки переполнения, приведения типов и нарушения CHECK — твои лучшие друзья.
Читай их внимательно — они всегда объясняют, что именно пошло не так.