← Back to course

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

Основы SQL

С возвращением.

В предыдущем уроке ты изучал базы данных и таблицы.

Ты узнал, что база данных содержит таблицы.

Таблицы содержат строки и колонки.

Строки — это записи.

Колонки описывают данные.

Очень организованно.

Очень PostgreSQL.

Сегодня мы изучим четыре базовых действия, которые ты будешь использовать постоянно:

Это основные команды для работы с данными.

Они позволяют:

Это часто называют CRUD.

CRUD означает:

Create
Read
Update
Delete

Не самое красивое слово.

Звучит как что-то, что живёт под старой клавиатурой.

Но это очень важно.

Почти каждое приложение делает CRUD.

Блог.

Магазин.

Task manager.

Система бронирования.

Dashboard.

Даже модное современное приложение с анимациями и эмоциональными градиентами, скорее всего, где-то в фоне делает 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
);

Эта таблица хранит товары.

Каждый товар имеет:

Просто.

Понятно.

Готово к действию.

Таблица стоит и как будто говорит:

Пожалуйста, дай мне данные.

Очень вежливо.

Пока что.

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 обычно говорит правду.

Иногда жёстко.

SELECT: Чтение Данных

SELECT читает данные из таблицы.

Самый простой запрос:

SELECT * FROM products;

Это означает:

Дай мне все колонки из всех товаров.

* означает все колонки.

Это полезно для обучения.

Но в реальных приложениях часто лучше выбирать только те колонки, которые нужны.

Пример:

SELECT name, price FROM products;

Это показывает только:

Гораздо чище.

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';

Это обновляет:

Всегда используй 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.

Она должна иметь:

Вставь минимум пять customers.

Потом напиши запросы, которые:

Перед каждым UPDATE или DELETE сначала выполняй SELECT с тем же WHERE.

Это привычка.

Не опция.

Ну хорошо, технически опция.

Но шлем тоже опция.

Ты понимаешь.

Итог

Сегодня ты изучил:

Это один из самых важных уроков в курсе.

С этими четырьмя командами ты можешь выполнять базовую работу почти любого приложения с базой данных.

Создавать данные.

Читать данные.

Изменять данные.

Удалять данные.

Простые слова.

Большая ответственность.

PostgreSQL даёт тебе силу.

Используй её осторожно.

Особенно рядом с DELETE.

Следующий Урок

В следующем уроке мы изучим типы данных и ограничения.

Мы рассмотрим:

Потому что базы данных — это не только storage.

Они также охранники структуры.

Строгие охранники.

С точками с запятой.