CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100),
age INT,
city VARCHAR(50),
status VARCHAR(20) DEFAULT 'active',
created_at TIMESTAMP DEFAULT NOW()
);
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
category VARCHAR(50),
price NUMERIC(10, 2),
stock INT DEFAULT 0
);
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
user_id INT REFERENCES users(id),
order_date DATE DEFAULT CURRENT_DATE,
amount NUMERIC(10, 2),
status VARCHAR(20) DEFAULT 'pending'
);
CREATE TABLE order_items (
id SERIAL PRIMARY KEY,
order_id INT REFERENCES orders(id),
product_id INT REFERENCES products(id),
quantity INT,
unit_price NUMERIC(10, 2)
);
CREATE TABLE departments (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
budget NUMERIC(12, 2)
);
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
name VARCHAR(100),
department_id INT REFERENCES departments(id),
manager_id INT REFERENCES employees(id),
salary NUMERIC(10, 2),
hire_date DATE
);
[!tip] Тестовые данные Данные уже загружены через docker-compose up — см. init/02_data.sql
Задача | Ключевой приём |
Количество/сумма/среднее | COUNT / SUM / AVG |
Группировка | GROUP BY + агрегаты |
Фильтр групп | HAVING |
Соединение | JOIN ON |
Все из одной таблицы | LEFT JOIN |
Anti-join | NOT EXISTS (безопаснее NOT IN!) |
Semi-join | EXISTS или IN |
Подзапрос | WHERE ... IN (SELECT ...) |
Один на группу | DISTINCT ON или ROW_NUMBER |
Подитоги | GROUPING SETS / ROLLUP / CUBE |
Иерархия | WITH RECURSIVE |
Массив из строк | array_agg(col ORDER BY ...) |
Строка из значений | string_agg(col, ', ') |