Что такое запрос?sql-8

Запрос — это выражение на языке SQL, которое инструктирует СУБД выполнить определенные операции с данными. Запросы позволяют извлекать, изменять, добавлять или удалять информацию из базы данных, а также управлять её структурой.

Основные типы запросов

1. DQL - Запросы на выборку данных

SELECT employee_id, first_name, last_name
FROM employees
WHERE department = 'IT'
ORDER BY hire_date DESC;

2. DML - Запросы модификации данных

-- Вставка
INSERT INTO products (name, price)
VALUES ('Ноутбук', 999.99);

-- Обновление
UPDATE customers
SET loyalty_points = loyalty_points + 100
WHERE last_purchase_date > '2023-01-01';

-- Удаление
DELETE FROM temp_logs
WHERE created_at < CURRENT_DATE - INTERVAL '30 days';

3. DDL - Запросы определения структуры

CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    customer_id INT REFERENCES customers(customer_id),
    order_date DATE NOT NULL DEFAULT CURRENT_DATE
);

ALTER TABLE employees
ADD COLUMN email VARCHAR(255) UNIQUE;

DROP TABLE IF EXISTS backup_data;

Компоненты SQL-запроса

  1. SELECT - Указывает какие столбцы вернуть
  2. FROM - Определяет таблицу(ы) для запроса
  3. WHERE - Фильтрация строк по условию
  4. GROUP BY - Группировка данных
  5. HAVING - Фильтрация групп
  6. ORDER BY - Сортировка результатов
  7. LIMIT/OFFSET - Ограничение количества строк

Пример комплексного запроса:

SELECT
    d.department_name,
    COUNT(e.employee_id) AS employee_count,
    AVG(e.salary) AS avg_salary
FROM
    employees e
JOIN
    departments d ON e.department_id = d.department_id
WHERE
    e.hire_date > '2020-01-01'
GROUP BY
    d.department_name
HAVING
    COUNT(e.employee_id) > 5
ORDER BY
    avg_salary DESC
LIMIT 10;

Виды запросов по сложности

  1. Простые запросы (к одной таблице)
SELECT * FROM products WHERE price < 100;
  1. Сложные соединения (JOIN)
SELECT o.order_id, c.name, p.product_name
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
JOIN order_items oi ON o.order_id = oi.order_id
JOIN products p ON oi.product_id = p.product_id;
  1. Подзапросы
SELECT name
FROM employees
WHERE department_id IN (
    SELECT department_id
    FROM departments
    WHERE location = 'Москва'
);
  1. Рекурсивные запросы (WITH RECURSIVE)
WITH RECURSIVE employee_hierarchy AS (
    SELECT employee_id, name, manager_id
    FROM employees
    WHERE employee_id = 100  -- Начало с CEO

    UNION ALL

    SELECT e.employee_id, e.name, e.manager_id
    FROM employees e
    JOIN employee_hierarchy eh ON e.manager_id = eh.employee_id
)
SELECT * FROM employee_hierarchy;

Оптимизация запросов

  1. Использование индексов
CREATE INDEX idx_employee_department ON employees(department_id);
  1. Анализ выполнения (EXPLAIN)
EXPLAIN ANALYZE
SELECT * FROM large_table WHERE category = 'A';
  1. Оптимизация JOIN
SELECT /*+ HASH_JOIN(orders, customers) */
    o.order_id, c.name
FROM orders o
JOIN customers c ON o.customer_id = c.customer_id;

Резюмируем

SQL-запрос — это точная инструкция для СУБД, которая может:

  • Извлекать данные (SELECT)
  • Модифицировать данные (INSERT, UPDATE, DELETE)
  • Управлять структурой БД (CREATE, ALTER, DROP)
  • Контролировать доступ (GRANT, REVOKE)

Эффективные запросы требуют:

  • Понимания структуры данных
  • Знания особенностей СУБД
  • Умения анализировать план выполнения
  • Соблюдения принципов безопасности (защита от SQL-инъекций)

Профессиональные разработчики тратят значительное время на оптимизацию запросов, особенно при работе с большими объемами данных.