Основы SQL: SELECT, INSERT, UPDATE, DELETE

С возвращением.
В предыдущем уроке ты изучал базы данных и таблицы.
Ты узнал, что база данных содержит таблицы.
Таблицы содержат строки и колонки.
Строки — это записи.
Колонки описывают данные.
Очень организованно.
Очень PostgreSQL.
Сегодня мы изучим четыре базовых действия, которые ты будешь использовать постоянно:
SELECT;INSERT;UPDATE;DELETE.
Это основные команды для работы с данными.
Они позволяют:
- читать данные;
- добавлять данные;
- изменять данные;
- удалять данные.
Это часто называют CRUD.
CRUD означает:
Create
Read
Update
Delete
Не самое красивое слово.
Звучит как что-то, что живёт под старой клавиатурой.
Но это очень важно.
Почти каждое приложение делает CRUD.
Блог.
Магазин.
Task manager.
Система бронирования.
Dashboard.
Даже модное современное приложение с анимациями и эмоциональными градиентами, скорее всего, где-то в фоне делает CRUD.
Базы данных скромные.
Но мощные.
Что Ты Изучишь
В этом уроке ты изучишь:
- как читать строки через
SELECT; - как выбирать конкретные колонки;
- как добавлять строки через
INSERT; - как вставлять несколько строк;
- как изменять строки через
UPDATE; - почему
WHEREчрезвычайно важен; - как удалять строки через
DELETE; - как избегать опасных ошибок начинающих;
- как практиковать CRUD на настоящей таблице.
В конце этого урока ты сможешь работать с данными в таблице PostgreSQL.
Не только создавать таблицы.
А реально ими пользоваться.
Именно здесь база данных начинает казаться живой.
Немного страшно.
Но живой.
Подготовь Базу Данных
Открой PostgreSQL:
sudo -iu postgres psql
Подключись к базе данных из предыдущих уроков:
\c learning_postgresql
Если этой базы нет, создай её:
CREATE DATABASE learning_postgresql;
Потом подключись:
\c learning_postgresql
Теперь нам нужна таблица для практики.
Мы используем таблицу с названием products.
Если она уже существует, можешь сначала удалить её:
DROP TABLE IF EXISTS products;
Потом создай её:
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
category VARCHAR(100),
price INTEGER,
available BOOLEAN
);
Эта таблица хранит товары.
Каждый товар имеет:
id;name;category;price;available.
Просто.
Понятно.
Готово к действию.
Таблица стоит и как будто говорит:
Пожалуйста, дай мне данные.
Очень вежливо.
Пока что.
INSERT: Добавление Данных
INSERT добавляет новые строки в таблицу.
Пример:
INSERT INTO products (name, category, price, available)
VALUES ('Laptop', 'Electronics', 900, true);
PostgreSQL должен сказать:
INSERT 0 1
Это означает, что одна строка была добавлена.
Теперь добавь больше товаров:
INSERT INTO products (name, category, price, available)
VALUES ('Mouse', 'Electronics', 25, true);
INSERT INTO products (name, category, price, available)
VALUES ('Keyboard', 'Electronics', 70, false);
INSERT INTO products (name, category, price, available)
VALUES ('Desk Chair', 'Furniture', 150, true);
Теперь у нас есть данные.
Настоящие строки.
Таблица больше не пустая.
Таблица без данных — это как магазин с полками, но без товаров.
Технически готов.
Эмоционально грустный.
Синтаксис INSERT
Базовая структура выглядит так:
INSERT INTO table_name (column1, column2, column3)
VALUES (value1, value2, value3);
Для нашей таблицы:
INSERT INTO products (name, category, price, available)
VALUES ('Monitor', 'Electronics', 250, true);
Важно:
Текстовые значения используют одинарные кавычки:
'Monitor'
'Electronics'
Числа не используют кавычки:
250
Boolean использует:
true
false
PostgreSQL строгий.
Если ты напишешь текст без кавычек, он не будет угадывать.
PostgreSQL не занимается эмоциональной интерпретацией.
Он занимается структурой.
Именно поэтому мы его любим.
В основном.
Вставка Нескольких Строк
Можно вставить несколько строк сразу.
Пример:
INSERT INTO products (name, category, price, available)
VALUES
('Notebook', 'Office', 5, true),
('Pen', 'Office', 2, true),
('Desk Lamp', 'Furniture', 45, true);
Это полезно, когда нужно добавить несколько строк вместе.
Теперь прочитай таблицу:
SELECT * FROM products;
Ты должен увидеть все товары.
Если не видишь, проверь:
- подключился ли ты к правильной базе данных?
- создал ли таблицу?
- не забыл ли точку с запятой?
- показал ли PostgreSQL ошибку?
PostgreSQL обычно говорит правду.
Иногда жёстко.
SELECT: Чтение Данных
SELECT читает данные из таблицы.
Самый простой запрос:
SELECT * FROM products;
Это означает:
Дай мне все колонки из всех товаров.
* означает все колонки.
Это полезно для обучения.
Но в реальных приложениях часто лучше выбирать только те колонки, которые нужны.
Пример:
SELECT name, price FROM products;
Это показывает только:
name;price.
Гораздо чище.
PostgreSQL любит точные запросы.
Люди тоже.
Обычно.
SELECT с Конкретными Колонками
Попробуй:
SELECT name FROM products;
Это возвращает только названия товаров.
Попробуй:
SELECT name, category FROM products;
Это возвращает названия и категории товаров.
Попробуй:
SELECT name, price, available FROM products;
Это возвращает названия, цены и доступность.
Не всегда нужно всё.
Если тебе нужны только названия товаров, попроси только названия товаров.
Не проси весь шкаф базы данных.
База данных — это не твой эмоциональный чемодан.
SELECT с ORDER BY
Можно сортировать результаты через ORDER BY.
Пример:
SELECT name, price FROM products
ORDER BY price;
Это сортирует товары по цене от самой низкой до самой высокой.
Чтобы сортировать от самой высокой до самой низкой:
SELECT name, price FROM products
ORDER BY price DESC;
DESC означает descending.
Также есть ASC для ascending:
SELECT name, price FROM products
ORDER BY price ASC;
Ascending используется по умолчанию.
Поэтому это:
ORDER BY price
то же самое, что:
ORDER BY price ASC
Сортировка полезна.
Особенно когда твои данные перестают быть маленькими и милыми.
SELECT с WHERE
WHERE фильтрует строки.
Пример:
SELECT * FROM products
WHERE category = 'Electronics';
Это означает:
Дай мне товары, где категория — Electronics.
Другой пример:
SELECT * FROM products
WHERE available = true;
Это показывает только доступные товары.
Ещё один:
SELECT * FROM products
WHERE price > 100;
Это показывает товары с ценой больше чем 100.
Важная заметка для MDX и документации:
Когда пишешь операторы типа >, <, >=, <= в обычном тексте, клади их в backticks.
В SQL-блоках они нормальные.
MDX чувствительный.
Как PostgreSQL, но с большим frontend-драматизмом.
WHERE Очень Важен
WHERE чрезвычайно важен.
Он говорит PostgreSQL, какие именно строки ты хочешь.
Без WHERE команды часто влияют на все строки.
Это нормально для:
SELECT * FROM products;
Но опасно для:
UPDATE products
SET price = 1;
Это обновляет каждый товар.
Все цены становятся 1.
Поздравляю.
Ты уничтожил магазин.
Очень щедро.
Очень плохо.
Всегда думай перед запуском UPDATE или DELETE.
Особенно без WHERE.
UPDATE: Изменение Данных
UPDATE изменяет существующие строки.
Пример:
UPDATE products
SET price = 950
WHERE name = 'Laptop';
Это изменяет цену Laptop.
Теперь проверь:
SELECT * FROM products
WHERE name = 'Laptop';
Ты должен увидеть обновлённую цену.
Базовая структура:
UPDATE table_name
SET column_name = new_value
WHERE condition;
Пример:
UPDATE products
SET available = true
WHERE name = 'Keyboard';
Это делает Keyboard доступной.
Хорошо.
Клавиатура вернулась в общество.
Обновление Нескольких Колонок
Можно обновить несколько колонок сразу.
Пример:
UPDATE products
SET price = 80,
available = true
WHERE name = 'Keyboard';
Это обновляет:
price;available.
Всегда используй WHERE, если ты действительно не хочешь обновить каждую строку.
А если ты действительно хочешь обновить каждую строку, остановись и подумай ещё раз.
Потом, возможно, сделай это.
Но осторожно.
С кофе.
И backup-ами.
Опасная Ошибка с UPDATE
Опасно:
UPDATE products
SET price = 10;
Это обновляет все товары.
Каждый товар теперь стоит 10.
Laptop?
10.
Mouse?
10.
Desk Chair?
10.
Поздравляю, ты изобрёл банкротство.
Правильно:
UPDATE products
SET price = 10
WHERE name = 'Pen';
Клауза WHERE тебя спасает.
WHERE — это не декорация.
Это ремень безопасности.
Используй его.
DELETE: Удаление Данных
DELETE удаляет строки из таблицы.
Пример:
DELETE FROM products
WHERE name = 'Pen';
Это удаляет товар с названием Pen.
Теперь проверь:
SELECT * FROM products;
Pen должна исчезнуть.
Без прощания.
Без церемонии.
Просто SQL.
Базовая структура:
DELETE FROM table_name
WHERE condition;
Ещё раз:
Используй WHERE.
Пожалуйста.
Опасная Ошибка с DELETE
Опасно:
DELETE FROM products;
Это удаляет все строки из таблицы.
Таблица всё ещё существует.
Но все данные исчезли.
Пусто.
Тихо.
Как холодильник после визита подростков.
Правильно:
DELETE FROM products
WHERE name = 'Notebook';
Это удаляет только Notebook.
Перед удалением разумно проверить условие через SELECT.
Пример:
SELECT * FROM products
WHERE name = 'Notebook';
Если результат правильный, тогда выполни:
DELETE FROM products
WHERE name = 'Notebook';
Эта привычка может спасти тебя от боли.
Серьёзной боли.
Базоданной боли.
SELECT Перед UPDATE или DELETE
Хорошая привычка:
Перед этим:
UPDATE products
SET price = 100
WHERE category = 'Office';
Выполни это:
SELECT * FROM products
WHERE category = 'Office';
Перед этим:
DELETE FROM products
WHERE available = false;
Выполни это:
SELECT * FROM products
WHERE available = false;
Сначала проверь строки.
Потом обновляй или удаляй.
Это не паранойя.
Это профессионализм.
Database-профессионалы — это просто люди, которые научились страху структурированно.
RETURNING
PostgreSQL имеет полезную возможность под названием RETURNING.
Она может показать строки, которых коснулся INSERT, UPDATE или DELETE.
Пример:
INSERT INTO products (name, category, price, available)
VALUES ('Webcam', 'Electronics', 60, true)
RETURNING *;
Это вставляет строку и сразу показывает её.
Пример с update:
UPDATE products
SET price = 65
WHERE name = 'Webcam'
RETURNING *;
Пример с delete:
DELETE FROM products
WHERE name = 'Webcam'
RETURNING *;
RETURNING очень полезен.
Он позволяет увидеть, что произошло.
PostgreSQL говорит:
Вот что я изменил.
Очень вежливо.
Немного драматично.
NULL в INSERT
Если колонка позволяет NULL, её можно пропустить при вставке.
Пример:
INSERT INTO products (name, price, available)
VALUES ('Mystery Box', 99, false);
Здесь мы не указали category.
Если category позволяет NULL, PostgreSQL это примет.
Проверь:
SELECT * FROM products
WHERE name = 'Mystery Box';
Ты должен увидеть пустое значение в категории.
Это NULL.
NULL означает отсутствующее значение.
Не ноль.
Не пустая строка.
Отсутствующее.
SQL относится к отсутствию серьёзно.
Как детектив.
Проверь Таблицу
На этом этапе выполни:
SELECT * FROM products;
У тебя должно быть несколько строк.
Попробуй:
SELECT name, price FROM products
ORDER BY price DESC;
Попробуй:
SELECT * FROM products
WHERE available = true;
Попробуй:
SELECT * FROM products
WHERE category = 'Electronics';
Это практика.
А практика — это место, где SQL становится нормальным.
Сначала SQL кажется странным.
Потом однажды ты пишешь:
SELECT * FROM products WHERE available = true;
и это звучит естественно.
Это значит, что база данных тебя приняла.
Возможно.
Типичные Ошибки
Забыть Точку с Запятой
Неправильно:
SELECT * FROM products
Правильно:
SELECT * FROM products;
Если psql продолжает ждать, ты, вероятно, забыл ;.
PostgreSQL не завис.
Он ждёт, пока ты закончишь предложение.
Очень формально.
Забыть Кавычки для Текста
Неправильно:
WHERE name = Laptop;
Правильно:
WHERE name = 'Laptop';
Текст требует одинарных кавычек.
Названия колонок — нет.
Эта разница имеет значение.
PostgreSQL не угадывает.
Это база данных, а не твоя бабушка.
UPDATE Без WHERE
Опасно:
UPDATE products
SET available = false;
Это делает все товары недоступными.
Правильно:
UPDATE products
SET available = false
WHERE name = 'Keyboard';
WHERE спасает данные.
Уважай WHERE.
DELETE Без WHERE
Опасно:
DELETE FROM products;
Это удаляет все строки.
Правильно:
DELETE FROM products
WHERE name = 'Keyboard';
Перед удалением выполни SELECT с тем же условием.
Это сильная привычка.
Сохрани её.
Практика
Создай таблицу с названием tasks.
CREATE TABLE tasks (
id SERIAL PRIMARY KEY,
title VARCHAR(150) NOT NULL,
status VARCHAR(50),
priority INTEGER
);
Вставь задачи:
INSERT INTO tasks (title, status, priority)
VALUES ('Learn SELECT', 'open', 1);
INSERT INTO tasks (title, status, priority)
VALUES ('Practice INSERT', 'open', 2);
INSERT INTO tasks (title, status, priority)
VALUES ('Be careful with DELETE', 'open', 3);
Прочитай все задачи:
SELECT * FROM tasks;
Обнови одну задачу:
UPDATE tasks
SET status = 'done'
WHERE title = 'Learn SELECT';
Удали одну задачу:
DELETE FROM tasks
WHERE title = 'Practice INSERT';
Прочитай снова:
SELECT * FROM tasks;
Это даёт тебе полную CRUD-практику.
Маленькая таблица.
Большой урок.
Мини-Челлендж
Создай таблицу с названием customers.
Она должна иметь:
id;name;email;city;active.
Вставь минимум пять customers.
Потом напиши запросы, которые:
- показывают всех customers;
- показывают только имена и email;
- показывают только активных customers;
- обновляют город одного customer;
- деактивируют одного customer;
- удаляют одного customer.
Перед каждым UPDATE или DELETE сначала выполняй SELECT с тем же WHERE.
Это привычка.
Не опция.
Ну хорошо, технически опция.
Но шлем тоже опция.
Ты понимаешь.
Итог
Сегодня ты изучил:
INSERTдобавляет строки;SELECTчитает строки;UPDATEизменяет строки;DELETEудаляет строки;WHEREфильтрует строки;ORDER BYсортирует результаты;RETURNINGпоказывает строки, которых коснулась команда;- текстовые значения требуют одинарных кавычек;
- booleans используют
trueилиfalse; UPDATEбезWHEREизменяет все строки;DELETEбезWHEREудаляет все строки;- проверка через
SELECTпередUPDATEилиDELETE— профессиональная привычка.
Это один из самых важных уроков в курсе.
С этими четырьмя командами ты можешь выполнять базовую работу почти любого приложения с базой данных.
Создавать данные.
Читать данные.
Изменять данные.
Удалять данные.
Простые слова.
Большая ответственность.
PostgreSQL даёт тебе силу.
Используй её осторожно.
Особенно рядом с DELETE.
Следующий Урок
В следующем уроке мы изучим типы данных и ограничения.
Мы рассмотрим:
INTEGER;VARCHAR;TEXT;BOOLEAN;DATE;NOT NULL;UNIQUE;- базовые правила для более безопасных таблиц.
Потому что базы данных — это не только storage.
Они также охранники структуры.
Строгие охранники.
С точками с запятой.