MySQL - Statements Reference

欢迎,未来的数据库法师们!今天,我们将深入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);

这向我们的“books”表中添加了一个名为“genre”的新列。

DROP TABLE

如果我们决定不再需要我们的表(也许我们改用电子书了?),我们可以移除它:

DROP TABLE books;

但是要小心使用这个命令!这就像点燃你的书架一样 - 没有回头路!

数据操作语句

现在我们有了结构,让我们用数据填充它!

INSERT

是时候向我们的图书馆添加一些书了:

INSERT INTO books (title, author, publication_year, genre)
VALUES ('The Great Gatsby', 'F. Scott Fitzgerald', 1925, 'Classic');

这向我们的表中添加了一本书。你可以一次添加多本书:

INSERT INTO books (title, author, publication_year, genre)
VALUES
('To Kill a Mockingbird', 'Harper Lee', 1960, 'Fiction'),
('1984', 'George Orwell', 1949, 'Science Fiction');

SELECT

现在,让我们看看我们有哪些书:

SELECT * FROM books;

这从“books”表检索所有列(*)。你可以更具体:

SELECT title, author FROM books WHERE publication_year < 1950;

这仅获取出版年份早于1950年的书的标题和作者。

UPDATE

哦,我们犯了一个错误!"1984"实际上是反乌托邦小说:

UPDATE books
SET genre = 'Dystopian Fiction'
WHERE title = '1984';

这将标题为"1984"的书的类别更改为反乌托邦小说。

DELETE

假设我们想删除所有出版年份早于1930年的书:

DELETE FROM books
WHERE publication_year < 1930;

使用DELETE时要小心 - 和DROP一样,它是永久性的!

事务和锁定语句

有时,我们需要确保一系列操作要么全部完成,要么全部不完成。这就是事务的作用。

START TRANSACTION

START TRANSACTION;
INSERT INTO books (title, author, publication_year, genre)
VALUES ('Pride and Prejudice', 'Jane Austen', 1813, 'Romance');
UPDATE books SET publication_year = 1960 WHERE title = 'To Kill a Mockingbird';
COMMIT;

这确保了INSERT和UPDATE一起发生。如果出现错误,两者都不会生效。

ROLLBACK

如果我们中途改变主意:

START TRANSACTION;
DELETE FROM books WHERE publication_year < 1900;
-- 哦,我们并不想这么做!
ROLLBACK;

ROLLBACK取消自START TRANSACTION以来所做的所有更改。

预编译语句

预编译语句就像食谱 - 你设置一次,然后用不同的配料多次使用。

PREPARE stmt FROM 'SELECT * FROM books WHERE author = ?';
SET @a = 'George Orwell';
EXECUTE stmt USING @a;

这准备了一个用于查找特定作者的书籍的语句,然后针对George Orwell执行它。

复合语句

复合语句允许我们将多个语句组合在一起。它们通常用于存储过程和函数中。

DELIMITER //
CREATE PROCEDURE CountBooks()
BEGIN
DECLARE bookCount INT;
SELECT COUNT(*) INTO bookCount FROM books;
SELECT CONCAT('图书馆有 ', bookCount, ' 本书。') AS Message;
END //
DELIMITER ;

CALL CountBooks();

这个存储过程计算书籍数量并显示一条消息。

存储程序中的变量

存储程序中的变量就像我们暂时存储信息的小盒子。

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游标语句

游标允许我们一次遍历结果集的一行。

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('The Great Gatsby', 'F. Scott Fitzgerald');

这个存储过程安全地添加书籍,处理书籍可能已存在的情况。

就这样!你已经迈出了进入MySQL语句世界的第一步。记住,熟能生巧,所以不要害怕用这些命令进行实验。在你意识到之前,你将像经验丰富的专业人士一样管理数据库!

Credits: Image by storyset