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);
这会在我们的“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