MySQL - Справочник по операторам

Добро пожаловать, будущие маги баз данных! Сегодня мы окунемся в магический мир операторов MySQL. Не волнуйтесь, если вы никогда раньше не писали ни строчки кода - к концу этого учебника вы будете колдовать заклинания баз данных, как профессионал!

MySQL - Statements Reference

Операторы определения данных

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

CREATE TABLE

Представьте, что вы строите библиотеку. Что первое вам нужно? Конечно же, книжные полки, верно? В MySQL наши "книжные полки" - это таблицы. Давайте создадим одну!

CREATE TABLE books (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(100) NOT NULL,
author VARCHAR(50),
publication_year INT
);

Это заклинание... то есть, оператор, создает таблицу под названием "books" с четырьмя столбцами:

  • id: Уникальный идентификатор для каждой книги
  • title: Заголовок книги (до 100 символов)
  • author: Автор книги (до 50 символов)
  • publication_year: Год издания книги

ALTER TABLE

Ой! Мы забыли добавить столбец для жанра книги. Не волнуйтесь, мы можем изменить нашу таблицу:

ALTER TABLE books
ADD COLUMN genre VARCHAR(30);

Это добавляет новый столбец под названием "genre" в нашу таблицу "books".

DROP TABLE

Если мы решим, что нам больше не нужна наша таблица (может быть, мы перейдем на электронные книги?), мы можем удалить ее:

DROP TABLE books;

Будьте осторожны с этим! Это как поджечь вашу книжную полку - обратно уже не вернешь!

Операторы манипуляции данными

Теперь, когда у нас есть структура, давайте заполним ее данными!

INSERT

Пора добавить книги в нашу библиотеку:

INSERT INTO books (title, author, publication_year, genre)
VALUES ('Великий Гэтсби', 'Ф. Скотт Фицджеральд', 1925, 'Классика');

Это добавляет одну книгу в нашу таблицу. Вы можете добавить несколько книг одним махом:

INSERT INTO books (title, author, publication_year, genre)
VALUES
('Убить пересмешника', 'Harper Lee', 1960, 'Художественная литература'),
('1984', 'Джордж Оруэлл', 1949, 'Научная фантастика');

SELECT

Теперь давайте посмотрим, какие у нас есть книги:

SELECT * FROM books;

Этот запрос retrieve все столбцы (*) из таблицы "books". Вы можете быть более конкретными:

SELECT title, author FROM books WHERE publication_year < 1950;

Этот запрос выбирает только заголовок и автора книг, изданных до 1950 года.

UPDATE

Ой, мы допустили ошибку! "1984" на самом деле belongs к жанру антиутопия:

UPDATE books
SET genre = 'Антиутопия'
WHERE title = '1984';

Этот запрос изменяет жанр для книги с названием "1984".

DELETE

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

DELETE FROM books
WHERE publication_year < 1930;

Будьте осторожны с DELETE - как и с DROP, это是不可 reversимо!

Операторы事务 и блокировки

Иногда нам нужно убедиться, что серия операций происходит либо целиком, либо не happens вовсе. Для этого мы используем транзакции.

START TRANSACTION

START TRANSACTION;
INSERT INTO books (title, author, publication_year, genre)
VALUES ('Гордость и предубеждение', 'Джейн Остин', 1813, 'Роман');
UPDATE books SET publication_year = 1960 WHERE title = 'Убить пересмешника';
COMMIT;

Это обеспечивает выполнение как INSERT, так и UPDATE вместе. Если произойдет ошибка, ни один из них не вступит в силу.

ROLLBACK

Если мы передумаем в процессе транзакции:

START TRANSACTION;
DELETE FROM books WHERE publication_year < 1900;
-- Ой, мы не собирались это делать!
ROLLBACK;

ROLLBACK отменит все изменения, внесенные с момента START TRANSACTION.

Подготовленные операторы

Подготовленные операторы resemble рецепты - вы настраиваете их один раз, а затем используете их многократно с различными ингредиентами.

PREPARE stmt FROM 'SELECT * FROM books WHERE author = ?';
SET @a = 'Джордж Оруэлл';
EXECUTE stmt USING @a;

Этот запрос подготавливает оператор для поиска книг определенного автора, а затем выполняет его для Джорджа Оруэлла.

Сложные операторы

Сложные операторы позволяют нам группировать несколько операторов вместе. Они часто используются в хранимых процедурах и функциях.

DELIMITER //
CREATE PROCEDURE CountBooks()
BEGIN
DECLARE bookCount INT;
SELECT COUNT(*) INTO bookCount FROM books;
SELECT CONCAT('В библиотеке ', bookCount, ' книг.') AS Message;
END //
DELIMITER ;

CALL CountBooks();

Эта процедура подсчитывает количество книг и выводит сообщение.

Переменные в хранимых программах

Переменные в хранимых программах resemble маленькие коробки, где мы можем временно хранить информацию.

DELIMITER //
CREATE PROCEDURE OldestBook()
BEGIN
DECLARE oldestYear INT;
DECLARE oldestTitle VARCHAR(100);

SELECT MIN(publication_year), title
INTO oldestYear, oldestTitle
FROM books;

SELECT CONCAT('Самая старая книга - ', oldestTitle, ' издана в ', oldestYear) AS Message;
END //
DELIMITER ;

CALL OldestBook();

Эта процедура находит самую старую книгу и рассказывает о ней.

Операторы управления потоком MySQL

Операторы управления потоком помогают нам принимать решения в нашем коде.

DELIMITER //
CREATE PROCEDURE CategoryByYear(IN pub_year INT)
BEGIN
DECLARE category VARCHAR(20);
IF pub_year < 1900 THEN
SET category = 'Очень старая';
ELSEIF pub_year < 2000 THEN
SET category = 'Классика';
ELSE
SET category = 'Современная';
END IF;
SELECT category AS 'Категория книги';
END //
DELIMITER ;

CALL CategoryByYear(1925);

Этот запрос классифицирует книгу в зависимости от года издания.

Операторы курсоров MySQL

Курсоры позволяют нам iterate через результат одним рядом за раз.

DELIMITER //
CREATE PROCEDURE ListBooks()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE book_title VARCHAR(100);
DECLARE cur CURSOR FOR SELECT title FROM books;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

OPEN cur;

read_loop: LOOP
FETCH cur INTO book_title;
IF done THEN
LEAVE read_loop;
END IF;
SELECT book_title;
END LOOP;

CLOSE cur;
END //
DELIMITER ;

CALL ListBooks();

Эта процедура перечисляет все заголовки книг по одному.

Операторы обработки условий MySQL

Операторы обработки условий позволяют нам изящно обрабатывать ошибки и предупреждения.

DELIMITER //
CREATE PROCEDURE SafeInsert(IN book_title VARCHAR(100), IN book_author VARCHAR(50))
BEGIN
DECLARE EXIT HANDLER FOR 1062
BEGIN
SELECT 'Ошибка: Дублированный ввод' AS Message;
END;

INSERT INTO books (title, author) VALUES (book_title, book_author);
SELECT 'Книга успешно добавлена' AS Message;
END //
DELIMITER ;

CALL SafeInsert('Великий Гэтсби', 'Ф. Скотт Фицджеральд');

Эта процедура безопасно добавляет книгу, обрабатывая случай, когда книга уже существует.

И вот и все! Вы только что сделали свои первые шаги в мир операторов MySQL. Помните, что практика makes perfect, так что не бойтесь экспериментировать с этими командами. Before you know it, вы будете управлять базами данных, как опытный профессионал!

Credits: Image by storyset