Как написать базовые SQL-запросы для работы с данными?

«Как написать базовые SQL-запросы для работы с данными?» — вопрос из категории Базы данных и SQL, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

SQL (Structured Query Language) используется для управления реляционными базами данных. Основные операции описываются командами CRUD: Create, Read, Update, Delete.

1. Чтение данных (SELECT):

-- Выбрать все столбцы из таблицы users с ограничением в 10 записей
SELECT * FROM users LIMIT 10;

-- Выбрать конкретные столбцы с фильтрацией и сортировкой
SELECT id, username, email, created_at 
FROM users 
WHERE is_active = TRUE AND created_at >= '2024-01-01'
ORDER BY created_at DESC;

-- Использование агрегатных функций и группировки
SELECT 
    department_id, 
    COUNT(*) as employee_count,
    AVG(salary) as avg_salary
FROM employees 
GROUP BY department_id 
HAVING COUNT(*) > 5;

-- JOIN для связи таблиц
SELECT 
    o.order_id,
    o.order_date,
    c.customer_name,
    p.product_name,
    oi.quantity
FROM orders o
INNER JOIN customers c ON o.customer_id = c.customer_id
INNER JOIN order_items oi ON o.order_id = oi.order_id
INNER JOIN products p ON oi.product_id = p.product_id;

2. Вставка данных (INSERT):

-- Вставка одной строки
INSERT INTO products (name, price, category_id) 
VALUES ('Wireless Mouse', 29.99, 5);

-- Вставка нескольких строк
INSERT INTO products (name, price, category_id) 
VALUES 
    ('Mechanical Keyboard', 99.99, 5),
    ('USB-C Cable', 19.99, 6);

-- Вставка данных из результата другого запроса
INSERT INTO archived_orders (order_id, total, customer_id)
SELECT order_id, total, customer_id 
FROM orders 
WHERE order_date < '2023-01-01';

3. Обновление данных (UPDATE):

-- Обновление всех строк, удовлетворяющих условию
UPDATE employees 
SET salary = salary * 1.05, 
    last_raise_date = CURRENT_DATE 
WHERE performance_rating >= 4.5;

-- Обновление с использованием подзапроса
UPDATE inventory i
SET stock_count = (
    SELECT SUM(quantity) 
    FROM shipments s 
    WHERE s.product_id = i.product_id
)
WHERE i.product_id IN (SELECT product_id FROM shipments);

4. Удаление данных (DELETE):

-- Удаление строк по условию (ВСЕГДА используйте WHERE!)
DELETE FROM user_sessions 
WHERE last_activity < NOW() - INTERVAL '30 days';

-- Полная очистка таблицы (осторожно!)
TRUNCATE TABLE temp_log_data;

5. Создание и изменение структуры (DDL):

-- Создание таблицы
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    is_active BOOLEAN DEFAULT TRUE
);

-- Добавление индекса для ускорения поиска
CREATE INDEX idx_users_email ON users(email);

-- Добавление столбца в существующую таблицу
ALTER TABLE users ADD COLUMN phone_number VARCHAR(20);