Основные SQL‑запросы: INSERT, SELECT, UPDATE, DELETE и другие — с примерами на PHP + PDO

Ниже — основные SQL‑запросы для работы с данными (не только INSERT), с короткими пояснениями и примерами на PHP + PDO.


INSERT — вставка одной строки

Добавляет новую запись. Всегда лучше указывать колонки явно.

sql
INSERT INTO users (name, email) VALUES (:name, :email);

PHP:

$sql = "INSERT INTO users (name, email) VALUES (:name, :email)";
$stmt = $pdo->prepare($sql);
$stmt->execute([':name' => 'Иван Иванов', ':email' => 'ivan@example.com']);
$id = $pdo->lastInsertId();

SELECT — выборка данных

Читает строки из таблицы. Можно выбирать все колонки или конкретные.

Все колонки:

sql
SELECT * FROM users WHERE id = :id;

Конкретные колонки:

sql
SELECT id, name, email FROM users WHERE email = :email;

PHP (выборка одной строки):

$sql = "SELECT id, name, email FROM users WHERE id = :id";
$stmt = $pdo->prepare($sql);
$stmt->execute([':id' => 123]);
$row = $stmt->fetch(PDO::FETCH_ASSOC); // вернёт ассоциативный массив или false

PHP (выборка нескольких строк):

$sql = "SELECT id, name FROM users LIMIT 10";
$stmt = $pdo->prepare($sql);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

UPDATE — обновление существующей строки

Меняет данные в уже существующих записях. Почти всегда нужен WHERE, иначе обновится вся таблица.

sql
DELETE FROM users WHERE id = :id;

PHP:

$sql = "DELETE FROM users WHERE id = :id";
$stmt = $pdo->prepare($sql);
$stmt->execute([':id' => 123]);
$count = $stmt->rowCount();

DELETE — удаление строк

Удаляет записи. Без WHERE удалится всё.

sql
REPLACE INTO users (name, email) VALUES (:name, :email);

PHP:

$sql = "REPLACE INTO users (name, email) VALUES (:name, :email)";
$stmt = $pdo->prepare($sql);
$stmt->execute([':name' => 'Иван Иванов', ':email' => 'ivan@example.com']);

REPLACE — перезапись по уникальному ключу

Если есть дубликат по уникальному полю (например, email), старая строка удаляется и вставляется новая. По сути — «вставить или заменить».

sql
REPLACE INTO users (name, email) VALUES (:name, :email);

PHP:

$sql = "REPLACE INTO users (name, email) VALUES (:name, :email)";
$stmt = $pdo->prepare($sql);
$stmt->execute([':name' => 'Иван Иванов', ':email' => 'ivan@example.com']);

Важно: REPLACE может менять id (если автоинкремент), потому что это фактически DELETE + INSERT.


INSERT … ON DUPLICATE KEY UPDATE — аккуратная «вставка или обновление»

Если запись с уникальным ключом уже есть — обновит указанные поля, а не удалит и не создаст заново. Это чаще используют вместо REPLACE, чтобы не терять ID и не сбрасывать автоинкременты.

sql
INSERT INTO users (name, email)
VALUES (:name, :email)
ON DUPLICATE KEY UPDATE name = :name;

PHP:

$sql = "INSERT INTO users (name, email) VALUES (:name, :email) ON DUPLICATE KEY UPDATE name = :name";
$stmt = $pdo->prepare($sql);
$stmt->execute([
    ':name'  => 'Иван Иванов',
    ':email' => 'ivan@example.com',
]);

TRUNCATE — очистка всей таблицы

Полностью удаляет все строки, сбрасывает автоинкремент. Работает быстрее, чем DELETE FROM table, но нельзя откатить в рамках транзакции в некоторых движках.

sql
TRUNCATE TABLE users;

PHP:

$pdo->exec("TRUNCATE TABLE users");

Не используйте плейсхолдеры в TRUNCATE — это DDL‑команда, она не принимает параметры.


MERGE (в MySQL его нет) — важное уточнение

В некоторых СУБД (Oracle, SQL Server) есть MERGE для «вставить/обновить по условию». В MySQL аналога нет: вместо него используют INSERT ... ON DUPLICATE KEY UPDATE либо логику на стороне PHP.


Частые ошибки и как их избегать

  • Забыл WHERE в UPDATE/DELETE → меняются/удаляются лишние строки. Всегда сначала проверяйте SELECT с тем же условием.
  • Прямая подстановка значений в SQL → риск SQL‑инъекций. Используйте prepare() + execute() с плейсхолдерами.
  • Не проверяете результат → полезно смотреть rowCount() и обрабатывать исключения PDOException.
  • Смешивание стилей плейсхолдеров → в одном запросе используйте либо именованные (:name), либо позиционные (?), не вместе.

Добавить комментарий