Представьте, что компании нужно работать с гигантской библиотекой клиентской информации. Чтобы быстро находить нужные «книги» и управлять ими, нужен понятный язык. Для самых популярных типов баз данных — реляционных — таким языком стал SQL.
SQL — это универсальный ключ к данным. Простыми словами, SQL — это язык, который помогает «общаться» с сервером и получать из него нужную информацию. Он логичный, мощный и довольно простой, если разобраться.
И это не просто теория: по данным JetBrains, каждый второй разработчик регулярно использует SQL в своих проектах. То есть вы точно не зря его изучаете.
Типы SQL-запросов
Основные SQL-запросы делятся на несколько типов.
DDL — группа команд для управления объектами в таблицах. Нужна для разработки и описания структур баз данных. DDL-запросы предназначены для регулирования расположения информации в БД. К ним относятся:
- CREATE
- RENAME
- DROP
- ALTER
- MODIFY
DML — группа команд, которая отвечает за контроль над данными. К этому типу относятся запросы по добавлению, получению, сохранению, обновлению или удалению различных данных из БД. В число DML-запросов входят такие операторы, как:
- SELECT
- DELETE
- UPDATE
- INSERT
DCL — группа команд, используемых для предоставления разрешений или запретов пользователям БД. К этому типу относятся запросы настройки СУБД:
- GRANT
- DENY
- REVOKE
TCL — группа команд для управления транзакциями. С их помощью можно контролировать изменения в БД (это делают с использованием DML-запросов). При необходимости их объединяют в пакеты транзакций.
- BEGIN
- ROLLBACK
- COMMIT
Базовые команды SQL
С помощью SQL вы можете попросить базу показать нужную информацию, добавить новую запись или даже перестроить целые таблицы.
Что можно делать с помощью базовых команд:
- Находить нужные данные в огромных таблицах
- Создавать новые таблицы и структуры
- Добавлять и обновлять информацию
- Удалять то, что больше не нужно
Прелесть SQL в том, что его команды выглядят как обычные фразы на английском — они интуитивно понятные и логичные. Это делает работу с данными точнее, а сами базы — защищённее.
Давайте рассмотрим команды, которые нужны чаще всего, — соберём своего рода стартовый набор для комфортной работы с базами данных.
CREATE TABLE
Благодаря CREATE TABLE в БД появляется таблица с необходимым количеством столбцов.
Синтаксис:
CREATE TABLE table_name (
column1 datatype,
column2 datatype,
column3 datatype,
...
);
Например:
CREATE TABLE employee (
employee_id INT PRIMARY KEY,
FirstName VARCHAR(200),
LastName VARCHAR(200)
);
Здесь у нас создалась новая таблица под названием "employee".
SELECT
SELECT применяется для извлечения нужных сведений из обозначенных столбцов, выражений и вычислений, находящихся в БД.
Синтаксис:
SELECT column1, column2, ...
FROM table_name;
Например:
SELECT FirstName, LastName
FROM clients;
FROM
Этот вспомогательный SQL-оператор используют для указания места (таблица), где будет происходить выборка данных по SELECT-запросу.
Синтаксис:
SELECT column1, column2, ...
FROM table_name;
Пример есть выше с SELECT, но его также можно использовать с подзапросом, который приведён в скобках ниже:
SELECT FirstName, LastName
FROM (SELECT ...);
WHERE
Оператор WHERE применяют для фильтрации или ограничения затрагиваемых строк. Его используют совместно с командами SELECT, UPDATE и DELETE. Вы указываете условия, которые должны быть истинными, чтобы оператор повлиял на строку.
Синтаксис:
SELECT column1, column2, ...
FROM table_name
WHERE condition;
Например:
SELECT FirstName, LastName
FROM clients
WHERE status = 'Active';
Этот запрос покажет всех клиентов, у которых значение статуса равно «Активный». Если строка клиента не равна «Активному», она не будет отображаться.
GROUP BY
Эту команду используют в запросе SELECT для объединения или агрегирования данных в группы.
Синтаксис:
SELECT column1, column2, ...
FROM table_name
GROUP BY column_name;
Например:
SELECT FirstName, COUNT(*)
FROM clients
GROUP BY FirstName;
Запрос покажет все значения FirstName и количество этих значений в таблице клиентов.
HAVING
Команда HAVING используется с GROUP BY для фильтрации результатов запроса SELECT после того, как он сгруппирован. Функции похожи на WHERE, однако WHERE работает до группирования данных, а HAVING — после.
Например:
SELECT first_name, COUNT(*)
FROM customer
GROUP BY first_name
HAVING COUNT(*) > 1;
Такая конструкция покажет все значения first_name, а также число их вхождений для тех, количество которых больше 1.
ORDER BY
ORDER BY в SQL используется для указания порядка, в котором должны отображаться результаты запроса SELECT. Разносит информацию по столбцам в нужном виде (например, в порядке возрастания или убывания).
Синтаксис:
SELECT column1, column2, ...
FROM table_name
ORDER BY column1, column2, ... ASC|DESC;
Пример:
SELECT LastName, FirstName
FROM clients
ORDER BY FirstName ASC;
При этом будут показаны имена ваших клиентов по алфавиту.
INNER JOIN
При использовании этого SQL-оператора сведения в нескольких таблицах объединяются, после чего отображаются совпадающие в них строки.
Синтаксис:
SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;
Оператор ON указывает здесь условия соответствия различных строк в объединяемых таблицах и связь строк, которые нужно объединить.
Например:
SELECT orders.order_id, clients.FirstName
FROM clients
INNER JOIN orders ON clients.client_id = orders.client_id;
Запрос выявит все идентификаторы заказа и имена клиентов, если они совпадают в обозначенных таблицах. Условие после оператора ON показывает, что нужно выбирать лишь те строки, у которых значение client_id в таблице clients соответствует значению client_id в таблице orders.
LEFT JOIN
Команда обозначает тип соединения, при котором две таблицы связываются вместе. Однако в таблице слева от оператора JOIN выводит на экран все записи, и при наличии совпадений в таблице справа они также отобразятся, в противном случае высветится значение NULL.
Синтаксис:
SELECT column_name(s)
FROM table1
LEFT JOIN table2
ON table1.column_name = table2.column_name;
Например:
SELECT orders.order_id, clients.FirstName
FROM clients
LEFT JOIN orders ON clients.client_id = orders.client_id;
Этот запрос покажет имена всех клиентов, а если они оформили заказы, то и идентификаторы. Если заказа нет, отображается значение NULL.
RIGHT JOIN
Команда обозначает тип соединения, при котором две таблицы связаны. Однако в правой от оператора JOIN таблице будут отображены все записи, и при наличии совпадений в таблице слева они также подтянутся в общий список. В противном случае мы увидим значение NULL.
Синтаксис:
SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;
Например:
SELECT orders.order_id, clients.FirstName
FROM clients
RIGHT JOIN orders ON clients.client_id = orders.client_id;
Запрос отобразит все заказы, и если есть связанный клиент, то и его имя. Если у заказа нет клиента, выводится значение NULL.
FULL JOIN
FULL JOIN представляет собой симбиоз левого и правого соединения и показывает совпадающие строки между двумя таблицами. Если в одной таблице нет совпадений со строкой из другой, отображается значение NULL. Недоступно в MySQL.
Синтаксис:
SELECT column_name(s)
FROM table1
FULL OUTER JOIN table2
ON table1.column_name = table2.column_name;
Например:
SELECT orders.order_id, clients.FirstName
FROM clients
FULL JOIN orders ON clients.client_id = orders.client_id;
Команда выведет на экран список всех клиентов и всех заказов и, обозначив совпадения строк в обеих таблицах, в случае несовпадения значений выдаст NULL.
AS
Ключевое слово AS позволяет задать псевдоним столбцу или таблице.
Псевдоним в качестве заголовка столбца может быть более читабельным:
SELECT COUNT(FirstName) AS count_fn
FROM clients;
Также его используют в запросе вместо полного имени таблицы:
SELECT o.order_id, c.FirstName
FROM clients AS c
INNER JOIN orders AS o ON c.client_id = o.client_id;
DISTINCT
Ключевое слово DISTINCT, как правило, применяется сразу после SELECT для удаления повторяющихся строк из результата.
Если в результатах запроса SELECT строка дублируется, то добавление DISTINCT гарантирует, что появится только один экземпляр строки (дубликаты игнорируются).
Например:
SELECT DISTINCT LastName, FirstName
FROM clients;
LIKE
LIKE нужен для выполнения поиска по подстановочным знакам или по частичному совпадению строковых значений в WHERE-предложении.
Применяется в выражениях для сравнения значений полей со строками.
Синтаксис:
SELECT column1, column2, ...
FROM table_name
WHERE column LIKE pattern;
Например:
SELECT COUNT(*)
FROM clients
WHERE FirstName LIKE 'A%';
Этот запрос покажет количество записей, имя которых начинается с буквы «А».
AND
Ключевое слово AND позволяет использовать два условия в предложении WHERE и указывает на то, что они оба должны быть истинными.
Синтаксис:
SELECT column1, column2, ...
FROM table_name
WHERE condition1 AND condition2 AND condition3 ...;
Вы можете применять в своих запросах столько операторов AND, сколько необходимо.
Например:
SELECT FirstName, LastName
FROM clients
WHERE status = 'Active' AND region = 'North';
Этот запрос показывает имя и фамилию клиента со статусом «Активен» и регионом «Север».
OR
Ключевое слово OR позволяет использовать два условия в предложении WHERE и указывает на то, что хотя бы одно из них должно быть истинным.
Синтаксис:
SELECT column1, column2, ...
FROM table_name
WHERE condition1 OR condition2 OR condition3 ...;
Можно использовать любое необходимое количество ключевых слов и критериев «ИЛИ».
Например:
SELECT FirstName, LastName
FROM clients
WHERE status = 'Active' OR status = 'Pending';
Запрос показывает фамилию и имя клиента со статусом «Активен» или «Ожидание».
BETWEEN
Ключевое слово BETWEEN в SQL применяют в предложении WHERE, чтобы указать, что значение должно находиться в пределах указанного диапазона.
Синтаксис:
SELECT column_name(s)
FROM table_name
WHERE column_name BETWEEN value1 AND value2;
Значения в предложении BETWEEN инклюзивные.
Например:
SELECT order_id
FROM orders
WHERE order_amount BETWEEN 100 AND 200;
Этот запрос покажет идентификаторы заказов, у которых order_amount находится в диапазоне от 100 до 200 включительно.
EXISTS
С помощью ключевого слова EXISTS проверяют, найдены ли записи в подзапросе. Если найдена хотя бы одна, её можно вернуть в основной запрос и использовать с такими операторами, как SELECT, INSERT, UPDATE и DELETE.
Синтаксис:
SELECT column_name(s)
FROM table_name
WHERE EXISTS (SELECT column_name FROM table_name WHERE condition);
Например:
SELECT city_name
FROM cities
WHERE EXISTS (SELECT id FROM olympics WHERE olympics.city_name = cities.city_name);
Этот запрос отобразит список городов, которые существуют в подзапросе с названиями городов, принимавших Олимпиаду.
IN
Ключевое слово IN позволяет проверить список значений или подзапрос, чтобы увидеть, соответствует ли он столбцу или выражению.
Синтаксис:
SELECT column_name(s)
FROM table_name
WHERE column_name IN (value1, value2, ...);
Это можно сделать с конкретными значениями:
SELECT COUNT(*)
FROM clients
WHERE status IN ('Active', 'Pending', 'Paused');
Или с помощью подзапроса:
SELECT COUNT(*)
FROM clients
WHERE status IN (SELECT status_value FROM status_lookup);
Указанные запросы ищут клиентов, которые имеют определённые значения статуса.
UNION
Ключевое слово UNION позволяет объединить результаты двух запросов. Тип данных и количество столбцов должны совпадать.
Синтаксис:
SELECT column_name(s) FROM table1
UNION
SELECT column_name(s) FROM table2;
Например:
SELECT FirstName, LastName FROM clients
UNION
SELECT FirstName, LastName FROM employee;
Запрос покажет один список результатов с именами и фамилиями — как клиентов, так и сотрудников.
LIMIT
Ключевое слово LIMIT используется всегда в конце запроса и позволяет указать максимальное количество строк, возвращаемых в наборе результатов.
LIMIT применяется в MySQL и PostgreSQL, но недоступно в Oracle или SQL Server. В Oracle есть похожая функция ROWNUMBER, а в SQL Server — ключевое слово TOP.
Синтаксис:
SELECT columns
FROM table
LIMIT number;
Например:
SELECT FirstName, LastName
FROM clients
LIMIT 10;
Команда выберет первые 10 строк в обозначенной таблице. Её часто используют с предложением ORDER BY, чтобы расположить результаты в определённом порядке.
UPDATE
UPDATE — базовая команда SQL для внесения изменений в данные таблицы без необходимости их удалять и заново добавлять.
Предложение WHERE является необязательным.
Синтаксис:
UPDATE table_name
SET column1 = value1, column2 = value2, ...
WHERE condition;
Например:
UPDATE clients
SET status = 'Inactive'
WHERE client_id = 4;
Запрос обновит статус на «Неактивный» для строки в таблице клиентов, где идентификатор клиента равен 4. Ключевое слово SET указывает, в каких столбцах и какие значения в таблице будут обновлены.
DELETE
Ключевое слово DELETE нужно для удаления записи из таблицы. Всегда работает в связке с оператором WHERE. Если использовать без него, то удаляется всё содержимое таблицы.
Синтаксис:
DELETE FROM table_name WHERE condition;
Например:
DELETE FROM clients
WHERE client_id = 4;
Запрос удалит записи в таблице клиентов, где client_id равен 4.
INSERT
Команда INSERT добавит новую запись в таблицу.
Синтаксис:
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
Например:
INSERT INTO clients (client_id, FirstName, LastName)
VALUES (35, 'Ivan', 'Petrov');
ALTER TABLE
ALTER TABLE позволит внести изменения в уже существующую таблицу, например переименовать её или добавить и удалить столбцы.
Синтаксис:
ALTER TABLE table_name
ADD column_name datatype;
Например:
ALTER TABLE clients
ADD client_type VARCHAR(20);
Так мы добавили в таблицу клиентов новый столбец с именем client_type.
BEGIN
Оператор BEGIN создан для обозначения новой транзакции. Любые другие команды, следующие за ним, будут рассматриваться как часть этой транзакции, пока она не будет зафиксирована (COMMIT) или отменена (ROLLBACK).
Например:
BEGIN;
UPDATE users SET name = 'John' WHERE id = 1;
COMMIT;
Или:
BEGIN;
UPDATE users SET name = 'John' WHERE id = 1;
ROLLBACK;
COMMIT
Команду COMMIT используют для сохранения изменений текущей открытой транзакции в базе данных. При этом изменения будут сохранены навсегда, поскольку в зависимости от настроек вашей базы данных и IDE они могут не зафиксироваться автоматически.
Синтаксис:
COMMIT;
После любого изменения данных оператор фиксирует транзакцию.
Пример:
BEGIN;
UPDATE users SET name = 'John' WHERE id = 1;
COMMIT;
ROLLBACK
Команда ROLLBACK отменяет любые изменения, внесённые в текущую открытую транзакцию. Они не применяются к базе данных.
Синтаксис:
ROLLBACK;
Использование ROLLBACK откатит транзакцию к предыдущему состоянию.
Например:
DELETE FROM clients WHERE Country = 'Russia';
ROLLBACK;
Заключение
Представьте, что SQL — это такой универсальный ключ, который открывает двери к данным в любом проекте. Когда вы знаете его основы, ваши сервисы начинают работать быстрее и стабильнее.
Что это даёт на практике:
- Сервисы работают чётче и отзывчивее
- API становятся удобнее и логичнее
- Данные всегда там, где они нужны
Главное — команды из этой статьи работают в любой популярной системе управления базами данных. Неважно, что вы выбрали: PostgreSQL, MySQL или другую СУБД, — эти знания останутся с вами надолго.
Думайте о SQL как о прочном фундаменте: освоите основы — сможете строить что угодно. И это точно окупится в любом вашем проекте.