MySQL - Statements Reference
欢迎,未来的数据库法师们!今天,我们将深入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 ('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