Back to: SELECT, INSERT, UPDATE — SQL запити
0
SELECT, INSERT, UPDATE — SQL запросы
SQL (Structured Query Language) — язык запросов к базам данных. В этом уроке подробно разберём основные типы запросов: SELECT, INSERT, UPDATE и DELETE.
SELECT — выборка данных
Базовый SELECT
-- Все колонки и все строки
SELECT * FROM users;
-- Конкретные колонки
SELECT name, email, age FROM users;
-- С псевдонимами (aliases)
SELECT name AS "Имя", email AS "Почта" FROM users;
-- Вычисляемые колонки
SELECT name, age, age * 365 AS "Дней прожито" FROM users;
WHERE — фильтрация
-- Равно
SELECT * FROM users WHERE name = "Alice";
-- Больше/меньше
SELECT * FROM users WHERE age > 25;
SELECT * FROM users WHERE age <= 30;
-- Между
SELECT * FROM users WHERE age BETWEEN 20 AND 40;
-- В списке
SELECT * FROM users WHERE name IN ("Alice", "Bob", "Charlie");
-- Не в списке
SELECT * FROM users WHERE name NOT IN ("Alice", "Bob");
-- Шаблон (LIKE)
SELECT * FROM users WHERE name LIKE "A%"; -- начинается на A
SELECT * FROM users WHERE name LIKE "%e%"; -- содержит e
SELECT * FROM users WHERE email LIKE "%@gmail.com"; -- gmail
-- NULL проверки
SELECT * FROM users WHERE phone IS NULL;
SELECT * FROM users WHERE phone IS NOT NULL;
-- Комбинирование условий
SELECT * FROM users WHERE age > 20 AND age < 40;
SELECT * FROM users WHERE age < 20 OR age > 60;
SELECT * FROM users WHERE NOT age < 20;
ORDER BY — сортировка
-- По одной колонке
SELECT * FROM users ORDER BY name ASC; -- по возрастанию
SELECT * FROM users ORDER BY name DESC; -- по убыванию
-- По нескольким колонкам
SELECT * FROM users ORDER BY age DESC, name ASC;
-- По вычисляемому полю
SELECT name, age FROM users ORDER BY age DESC;
GROUP BY — группировка
-- Подсчёт по группам
SELECT age, COUNT(*) AS count
FROM users
GROUP BY age;
-- Средний возраст по группам
SELECT department, AVG(age) AS avg_age
FROM employees
GROUP BY department;
-- С условием на группу (HAVING)
SELECT age, COUNT(*) AS count
FROM users
GROUP BY age
HAVING COUNT(*) > 1;
Агрегатные функции
SELECT COUNT(*) FROM users; -- количество строк
SELECT COUNT(DISTINCT age) FROM users; -- уникальные значения
SELECT SUM(amount) FROM orders; -- сумма
SELECT AVG(age) FROM users; -- среднее
SELECT MIN(age) FROM users; -- минимум
SELECT MAX(age) FROM users; -- максимум
LIMIT и OFFSET
-- Первые 10 строк
SELECT * FROM users LIMIT 10;
-- Страница 2 (по 10 на странице)
SELECT * FROM users LIMIT 10 OFFSET 10;
-- PostgreSQL/SQLite синтаксис
SELECT * FROM users LIMIT 10 OFFSET 20;
JOIN — объединение таблиц
-- INNER JOIN (только совпадающие записи)
SELECT u.name, o.product, o.amount
FROM users u
INNER JOIN orders o ON u.id = o.user_id;
-- LEFT JOIN (все из левой таблицы)
SELECT u.name, o.product
FROM users u
LEFT JOIN orders o ON u.id = o.user_id;
-- RIGHT JOIN (все из правой таблицы)
SELECT u.name, o.product
FROM users u
RIGHT JOIN orders o ON u.id = o.user_id;
-- FULL OUTER JOIN (все из обеих таблиц)
SELECT u.name, o.product
FROM users u
FULL OUTER JOIN orders o ON u.id = o.user_id;
-- Несколько JOIN
SELECT u.name, o.product, p.price
FROM users u
JOIN orders o ON u.id = o.user_id
JOIN products p ON o.product_id = p.id;
INSERT — вставка данных
-- Полная вставка
INSERT INTO users (name, email, age)
VALUES ("Alice", "alice@example.com", 30);
-- Несколько строк
INSERT INTO users (name, email, age)
VALUES
("Bob", "bob@example.com", 25),
("Charlie", "charlie@example.com", 35);
-- Из другой таблицы
INSERT INTO users_archive (name, email, age)
SELECT name, email, age FROM users WHERE active = 0;
-- Или игнорировать при конфликте
INSERT OR IGNORE INTO users (id, name) VALUES (1, "Alice");
-- Обновить при конфликте (upsert)
INSERT INTO users (id, name, age)
VALUES (1, "Alice", 31)
ON CONFLICT(id) DO UPDATE SET age = 31;
UPDATE — обновление данных
-- Обновить одну колонку
UPDATE users SET age = 31 WHERE id = 1;
-- Несколько колонок
UPDATE users
SET age = 26, email = "bob_new@example.com", updated_at = CURRENT_TIMESTAMP
WHERE id = 2;
-- По условию
UPDATE users SET status = "active" WHERE status = "pending";
-- Математические операции
UPDATE products SET price = price * 1.1 WHERE category = "electronics";
-- ⚠️ БЕЗ WHERE обновятся ВСЕ строки!
UPDATE users SET status = "active"; -- всем пользователям!
DELETE — удаление данных
-- Удалить по условию
DELETE FROM users WHERE id = 5;
-- Удалить по нескольким условиям
DELETE FROM orders WHERE status = "cancelled" AND created_at < "2025-01-01";
-- Удалить все (ОСТОРОЖНО!)
DELETE FROM users;
-- Удалить с JOIN (в SQLite)
DELETE FROM users
WHERE id IN (
SELECT user_id FROM orders WHERE status = "cancelled"
);
Транзакции
-- Начало транзакции
BEGIN TRANSACTION;
INSERT INTO users (name, email) VALUES ("Test", "test@test.com");
INSERT INTO orders (user_id, product) VALUES (1, "Widget");
-- Если всё OK
COMMIT;
-- Если ошибка — откатить
ROLLBACK;
Практическое задание
- Создайте базу:
sqlite3 practice.db - Создайте таблицы users и orders
- Вставьте 5 пользователей и 8 заказов
- Выполните SELECT с WHERE:
SELECT * FROM users WHERE age > 25; - Выполните JOIN:
SELECT u.name, o.product FROM users u JOIN orders o ON u.id = o.user_id; - Сгруппируйте:
SELECT u.name, COUNT(o.id) FROM users u LEFT JOIN orders o ON u.id = o.user_id GROUP BY u.id; - Обновите запись:
UPDATE users SET age = 50 WHERE name = "Alice"; - Удалите запись:
DELETE FROM orders WHERE amount < 10; - Используйте транзакцию:
BEGIN; INSERT ...; COMMIT;


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