
SQL представляет собой декларативный язык для управления реляционными базами данных, основное внимание которого сосредоточено на манипуляции таблицами и извлечении данных. Ключевыми конструкциями являются SELECT, INSERT, UPDATE и DELETE, каждая из которых имеет четко определенный синтаксис и область применения. Например, SELECT позволяет извлекать данные с фильтрацией через WHERE, сортировкой с помощью ORDER BY и объединением таблиц через JOIN.
Работа с базами данных требует понимания структур данных: таблицы, строки и столбцы формируют основу SQL-запросов. Команды CREATE TABLE и ALTER TABLE позволяют создавать и модифицировать схемы базы данных, определяя типы данных для каждого столбца, индексы и ограничения. Практика показывает, что корректное использование индексов значительно ускоряет SELECT-запросы на больших объемах данных.
Для управления транзакциями используются конструкции BEGIN, COMMIT и ROLLBACK, что обеспечивает целостность данных при сложных операциях. Эффективная работа с SQL невозможна без понимания агрегатных функций, таких как COUNT, SUM, AVG, а также группировки данных через GROUP BY и фильтрации агрегатов через HAVING.
Использование подзапросов и соединений таблиц позволяет создавать сложные аналитические отчеты без дублирования данных. Комбинация INNER JOIN, LEFT JOIN и подзапросов с EXISTS или IN дает возможность получать точные результаты даже при множественных зависимостях между таблицами. Практическая рекомендация: всегда проверять план выполнения запросов через EXPLAIN для оптимизации скорости и снижения нагрузки на сервер.
Создание и удаление таблиц с помощью CREATE и DROP

Команда CREATE TABLE определяет структуру таблицы: имена колонок, типы данных и ограничения. Пример:
CREATE TABLE products (
product_id INT PRIMARY KEY,
name VARCHAR(150) NOT NULL,
price DECIMAL(10,2) CHECK (price >= 0),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Для предотвращения ошибок при повторном создании используют IF NOT EXISTS:
CREATE TABLE IF NOT EXISTS customers (
customer_id INT PRIMARY KEY,
full_name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE,
signup_date DATE DEFAULT CURRENT_DATE
);
Удаление таблицы выполняется командой DROP TABLE. Она удаляет таблицу и все её данные:
DROP TABLE products;
Если таблица может не существовать, безопаснее использовать IF EXISTS:
DROP TABLE IF EXISTS customers;
Перед применением DROP TABLE важно учитывать, что удаляются все индексы, ограничения и связанные внешние ключи. Рекомендуется создавать резервные копии данных.
При создании таблиц с отношениями используют FOREIGN KEY для обеспечения целостности данных и предотвращения удаления связанных записей:
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
order_date DATE DEFAULT CURRENT_DATE,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
Добавление, обновление и удаление данных через INSERT, UPDATE и DELETE

INSERT используется для добавления новых записей в таблицу. Синтаксис включает указание целевой таблицы, колонок и значений: INSERT INTO table_name (column1, column2) VALUES (value1, value2); Для массовой вставки можно перечислять несколько наборов значений через запятую. Рекомендуется всегда явно указывать список колонок, чтобы избежать ошибок при изменении структуры таблицы.
UPDATE позволяет изменять существующие записи. Основной синтаксис: UPDATE table_name SET column1 = value1, column2 = value2 WHERE condition; Ключевое значение имеет условие WHERE, без которого все строки таблицы будут изменены. Для повышения производительности при обновлении большого объема данных следует использовать индексы в условиях.
DELETE удаляет записи из таблицы. Пример: DELETE FROM table_name WHERE condition; Без условия WHERE удаляются все строки, поэтому рекомендуется сначала выполнять SELECT с тем же условием, чтобы проверить, какие записи будут затронуты. Для безопасного удаления большого количества данных используют ограничение LIMIT или удаление по частям.
При работе с INSERT, UPDATE и DELETE важно учитывать транзакции: использование BEGIN TRANSACTION и COMMIT позволяет откатить изменения при ошибке, предотвращая потерю данных. Также рекомендуется проверять ограничения таблицы, такие как FOREIGN KEY и UNIQUE, чтобы избежать нарушений целостности.
Фильтрация данных с использованием WHERE и операторов сравнения

Оператор WHERE используется для ограничения выборки строк в SQL-запросах на основе заданных условий. Он размещается после указания таблицы в конструкции SELECT и до операторов GROUP BY, ORDER BY или LIMIT.
Основные операторы сравнения включают:
=– проверка на равенство. Например:SELECT * FROM employees WHERE department_id = 3;вернёт всех сотрудников третьего отдела.<>или!=– проверка на неравенство.SELECT * FROM products WHERE price <> 100;исключит товары с ценой 100.<,<=,>,>=– сравнение числовых или датированных значений.SELECT * FROM orders WHERE order_date > '2025-01-01';вернёт заказы после указанной даты.BETWEEN ... AND ...– проверка попадания значения в диапазон. Например:SELECT * FROM sales WHERE total BETWEEN 1000 AND 5000;выберет продажи с суммой от 1000 до 5000.IN (...)– проверка на принадлежность множеству значений.SELECT * FROM employees WHERE role IN ('Manager','Analyst');вернёт только менеджеров и аналитиков.LIKE– поиск по шаблону с использованием символов подстановки%(любое количество символов) и_(один символ).SELECT * FROM customers WHERE name LIKE 'A%';выберет клиентов, чьи имена начинаются с «A».IS NULLиIS NOT NULL– проверка на пустые значения.SELECT * FROM products WHERE description IS NULL;вернёт товары без описания.
Для комбинирования условий применяются логические операторы AND, OR и NOT. Например: SELECT * FROM orders WHERE status = 'shipped' AND total > 100; отфильтрует отправленные заказы с суммой больше 100.
Рекомендации по оптимизации фильтрации: использовать точные индексы по столбцам, участвующим в условиях; избегать функций на столбцах в WHERE, так как это препятствует использованию индексов; при работе с диапазонами дат уточнять тип данных для предотвращения ошибок сравнения.
Фильтрация через WHERE позволяет создавать точные запросы, минимизируя объём обрабатываемых данных и ускоряя выполнение SQL-запросов в больших таблицах.
Сортировка и ограничение результатов с ORDER BY и LIMIT
Команда ORDER BY используется для упорядочивания строк результата по одной или нескольким колонкам. Синтаксис позволяет указать направление сортировки: ASC для по возрастанию и DESC для по убыванию. Пример сортировки списка сотрудников по фамилии:
SELECT id, фамилия, зарплата FROM сотрудники ORDER BY фамилия ASC;
Можно сортировать по нескольким колонкам одновременно. В этом случае сортировка выполняется последовательно, сначала по первой колонке, затем по второй и так далее:
SELECT id, фамилия, зарплата FROM сотрудники ORDER BY зарплата DESC, фамилия ASC;
SELECT * FROM сотрудники ORDER BY зарплата DESC LIMIT 10;
Для выборки определенного диапазона строк используется конструкция LIMIT offset, count, где offset – начальная позиция, а count – количество строк:
SELECT * FROM сотрудники ORDER BY id ASC LIMIT 5, 10;
Пример применения ORDER BY и LIMIT для анализа продаж:
| Продукт | Количество продаж | Дата последней продажи |
|---|---|---|
| Ноутбук | 150 | 2025-10-05 |
| Смартфон | 120 | 2025-10-04 |
| Планшет | 80 | 2025-10-03 |
Запрос для получения топ-2 самых продаваемых продуктов:
SELECT Продукт, Количество_продаж FROM продажи ORDER BY Количество_продаж DESC LIMIT 2;
Советы по оптимизации:
- Для больших таблиц используйте индексы на колонках, по которым выполняется сортировка.
- Сортировка по нескольким колонкам снижает производительность; выбирайте только необходимые.
- LIMIT ускоряет выдачу первых результатов, особенно при большом объеме данных.
Объединение таблиц через JOIN и виды соединений

В SQL оператор JOIN используется для комбинирования данных из двух и более таблиц на основе связанных столбцов. Основные типы соединений позволяют контролировать, какие строки включаются в результат.
INNER JOIN возвращает только те строки, которые имеют совпадения в обеих таблицах. Пример: SELECT a.id, a.name, b.salary FROM employees a INNER JOIN salaries b ON a.id = b.employee_id; – вернёт только сотрудников с информацией о зарплате.
LEFT JOIN возвращает все строки из левой таблицы и совпадающие строки из правой. Если соответствия нет, поля правой таблицы будут NULL. Пример: SELECT a.id, a.name, b.project FROM employees a LEFT JOIN projects b ON a.id = b.employee_id; – покажет всех сотрудников, включая тех, кто не назначен на проекты.
RIGHT JOIN аналогично LEFT JOIN, но возвращает все строки из правой таблицы. Применяется реже, чаще LEFT JOIN более интуитивен и читаем.
FULL OUTER JOIN объединяет LEFT и RIGHT JOIN, возвращая все строки из обеих таблиц. Несовпадающие записи получают NULL в полях отсутствующих данных.
CROSS JOIN создаёт декартово произведение двух таблиц. Каждая строка первой таблицы соединяется с каждой строкой второй. Используется для генерации комбинаций, но требует осторожности с большим количеством данных.
Рекомендации при использовании JOIN: всегда уточнять условие соединения через ON или USING, избегать неопределённых соединений, использовать индексы на колонках, участвующих в JOIN, и проверять результаты на дублирование строк.
Для сложных запросов можно комбинировать несколько JOIN, но важно соблюдать порядок и логику соединений, чтобы не получить избыточные или некорректные строки.
Группировка данных и вычисление агрегатных функций с GROUP BY и HAVING

Команда GROUP BY позволяет объединять строки таблицы по значению одного или нескольких столбцов, создавая группы, над которыми можно применять агрегатные функции. Это особенно полезно для анализа больших наборов данных.
Основные агрегатные функции в SQL:
COUNT()– подсчет количества строк в группе.SUM()– суммирование числовых значений.AVG()– вычисление среднего значения.MIN()– определение минимального значения.MAX()– определение максимального значения.
Пример базовой группировки:
SELECT department_id, COUNT(*) AS employees_count
FROM employees
GROUP BY department_id;
В этом примере сотрудники сгруппированы по идентификатору отдела, и подсчитывается количество сотрудников в каждом отделе.
Команда HAVING применяется для фильтрации результатов уже после группировки. В отличие от WHERE, она работает с агрегатными функциями.
Пример использования HAVING:
SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 50000;
Здесь сначала создаются группы по отделам, вычисляется средняя зарплата, а затем фильтруются только те отделы, где средняя зарплата превышает 50 000.
Рекомендации при работе с GROUP BY и HAVING:
- Все столбцы в
SELECT, которые не являются агрегатными функциями, должны присутствовать вGROUP BY. - Используйте
HAVINGтолько для условий над агрегатными функциями; обычные фильтры лучше применять черезWHERE. - Для нескольких уровней группировки перечисляйте столбцы через запятую в
GROUP BY. - Оптимизируйте запросы, применяя фильтры
WHEREперед группировкой, чтобы уменьшить объем обрабатываемых данных.
Комбинируя GROUP BY с агрегатными функциями и HAVING, можно строить точные отчеты, выявлять аномалии и проводить глубокий анализ данных в SQL.
Создание подзапросов и вложенных SELECT для сложных выборок

Подзапрос – SELECT, встроенный в другой SQL-запрос, используется для фильтрации, агрегации и расчета значений. Основные виды: скалярный, многозначный и коррелированный. Скалярный подзапрос возвращает одно значение, применяется в WHERE, SELECT или SET. Многозначный возвращает несколько строк, используется с IN, ANY, ALL. Коррелированный зависит от внешнего запроса и выполняется для каждой строки внешнего запроса.
Пример скалярного подзапроса для поиска сотрудника с максимальной зарплатой в отделе 20:
SELECT employee_name, salary FROM employees WHERE salary = (SELECT MAX(salary) FROM employees WHERE department_id = 20);
Коррелированный подзапрос для выбора сотрудников с зарплатой выше средней по отделу:
SELECT employee_name, salary, department_id FROM employees e WHERE salary > (SELECT AVG(salary) FROM employees WHERE department_id = e.department_id);
Вложенные SELECT в FROM позволяют формировать временные таблицы для дальнейшей обработки. Пример: суммарная продажа по регионам с фильтром:
SELECT region, total_sales FROM (SELECT region, SUM(sales) AS total_sales FROM orders GROUP BY region) AS regional_sales WHERE total_sales > 50000;
Рекомендации: избегать глубокой вложенности для производительности, индексировать столбцы, используемые в подзапросах, заменять коррелированные подзапросы на JOIN при работе с большими таблицами, применять EXISTS вместо IN для проверки наличия записей в больших наборах данных.
Подзапросы можно комбинировать для многоступенчатой фильтрации. Пример: выбор сотрудников из отделов с числом сотрудников >5 и зарплатой выше медианы:
SELECT employee_name, salary FROM employees WHERE department_id IN (SELECT department_id FROM employees GROUP BY department_id HAVING COUNT(*) > 5) AND salary > (SELECT MEDIAN(salary) FROM employees);
Вопрос-ответ:
Какая команда используется для выборки данных из таблицы и как она работает?
Для выборки данных используется команда SELECT. Она позволяет указать, какие столбцы из таблицы нужно получить, а также при необходимости применить условия с помощью конструкции WHERE. Например, SELECT имя, возраст FROM сотрудники WHERE возраст > 30; вернёт только тех сотрудников, чей возраст превышает 30 лет. Кроме того, можно использовать сортировку с ORDER BY и ограничение количества строк с LIMIT.
Как с помощью SQL объединять данные из нескольких таблиц?
Объединение данных из нескольких таблиц выполняется через JOIN. Существует несколько типов соединений: INNER JOIN возвращает только строки, которые совпадают по условию в обеих таблицах, LEFT JOIN — все строки из первой таблицы и совпадающие из второй, RIGHT JOIN — наоборот. Например, SELECT A.имя, B.должность FROM сотрудники A INNER JOIN отделы B ON A.id_отдела = B.id; вернёт имена сотрудников вместе с их должностями, если сотрудник привязан к отделу.
В чем разница между командами INSERT и UPDATE?
Команда INSERT добавляет новые записи в таблицу. Например, INSERT INTO сотрудники (имя, возраст) VALUES (‘Иван’, 25); создаст новую строку с указанными значениями. UPDATE используется для изменения существующих записей. Например, UPDATE сотрудники SET возраст = 26 WHERE имя = ‘Иван’; изменит возраст только того сотрудника, чей имя совпадает с указанным. INSERT не изменяет существующие данные, а UPDATE не добавляет новые записи.
Какие конструкции позволяют фильтровать данные по нескольким условиям?
Фильтрация выполняется с помощью WHERE и логических операторов AND, OR, NOT. Например, SELECT * FROM сотрудники WHERE возраст > 25 AND должность = ‘менеджер’; вернёт только тех сотрудников, которые старше 25 лет и занимают должность менеджера. Для проверки значения на принадлежность множеству используют IN, для диапазона — BETWEEN, а для частичного совпадения текста — LIKE.
Как в SQL группировать данные и подсчитывать агрегаты?
Для группировки используется конструкция GROUP BY, которая объединяет строки с одинаковыми значениями указанного столбца. С ней часто применяют агрегатные функции: COUNT подсчитывает количество записей, SUM — сумму чисел, AVG — среднее значение, MAX и MIN — максимальные и минимальные значения. Например, SELECT отдел, COUNT(*) FROM сотрудники GROUP BY отдел; покажет количество сотрудников в каждом отделе. Для фильтрации групп используют HAVING, поскольку WHERE фильтрует только отдельные строки.
