MySQL - Справочник по операторам
Добро пожаловать, будущие маги баз данных! Сегодня мы окунемся в магический мир операторов MySQL. Не волнуйтесь, если вы никогда раньше не писали ни строчки кода - к концу этого учебника вы будете колдовать заклинания баз данных, как профессионал!
Операторы определения данных
Давайте начнем с основ нашего королевства баз данных: операторов определения данных. Это те команды, которые мы используем для создания, изменения и удаления структуры нашей базы данных.
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