SELECT, INSERT, UPDATE — SQL запити

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;

Практическое задание

  1. Создайте базу: sqlite3 practice.db
  2. Создайте таблицы users и orders
  3. Вставьте 5 пользователей и 8 заказов
  4. Выполните SELECT с WHERE: SELECT * FROM users WHERE age > 25;
  5. Выполните JOIN: SELECT u.name, o.product FROM users u JOIN orders o ON u.id = o.user_id;
  6. Сгруппируйте: SELECT u.name, COUNT(o.id) FROM users u LEFT JOIN orders o ON u.id = o.user_id GROUP BY u.id;
  7. Обновите запись: UPDATE users SET age = 50 WHERE name = "Alice";
  8. Удалите запись: DELETE FROM orders WHERE amount < 10;
  9. Используйте транзакцию: BEGIN; INSERT ...; COMMIT;

Comments

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Related Post