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

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

DROP TABLE

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

DROP TABLE books;

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

数据操作语句

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

INSERT

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

INSERT INTO books (title, author, publication_year, genre)
VALUES ('了不起的盖茨比', 'F. 斯科特·菲茨杰拉德', 1925, '经典');

这会将一本书添加到我们的表中。你可以一次添加多本书:

INSERT INTO books (title, author, publication_year, genre)
VALUES
('杀死一只知更鸟', '哈珀·李', 1960, '小说'),
('1984', '乔治·奥威尔', 1949, '科幻');

SELECT

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

SELECT * FROM books;

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

SELECT title, author FROM books WHERE publication_year < 1950;

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

UPDATE

哎呀,我们犯了一个错误!“1984”实际上是反乌托邦小说:

UPDATE books
SET genre = '反乌托邦小说'
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 ('傲慢与偏见', '简·奥斯汀', 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以来所做的所有更改。

预处理语句

预处理语句就像食谱一样——你设置一次,然后可以用不同的配料多次使用它们。

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();

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

存储程序中的变量

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

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('了不起的盖茨比', 'F. 斯科特·菲茨杰拉德');

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

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

Credits: Image by storyset