📌 MySQL 語句大全(完整實用教程)
📌 1. 數據庫操作
? 創建數據庫
CREATE DATABASE mydb; -- 創建名為 mydb 的數據庫
? 使用數據庫
USE mydb; -- 選擇數據庫
? 刪除數據庫
DROP DATABASE mydb; -- 刪除數據庫(謹慎使用)
?? 注意點:
- 刪除數據庫會 丟失所有數據,操作前需備份!
📌 2. 表操作
? 創建表
CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT, -- 自增主鍵name VARCHAR(50) NOT NULL, -- 不能為空age INT DEFAULT 18, -- 默認值 18email VARCHAR(100) UNIQUE -- 唯一約束
);
? 查看表結構
DESC users; -- 查看表的字段信息
SHOW CREATE TABLE users; -- 查看完整建表語句
? 修改表
ALTER TABLE users ADD phone VARCHAR(20); -- 添加新列
ALTER TABLE users MODIFY name VARCHAR(100); -- 修改字段類型
ALTER TABLE users DROP COLUMN phone; -- 刪除列
? 刪除表
DROP TABLE users; -- 刪除表(謹慎使用)
?? 注意點:
DROP TABLE
不可恢復,需謹慎。ALTER TABLE
可能 影響性能,大表操作前需測試。
📌 3. 數據操作(CRUD)
? 插入數據
INSERT INTO users (name, age, email) VALUES ('Alice', 25, 'alice@example.com');
? 批量插入數據
INSERT INTO users (name, age, email) VALUES('Bob', 30, 'bob@example.com'),('Charlie', 22, 'charlie@example.com');
? 查詢數據
SELECT * FROM users; -- 查詢所有字段
SELECT name, age FROM users; -- 查詢指定字段
SELECT * FROM users WHERE age > 25; -- 條件查詢
SELECT * FROM users ORDER BY age DESC; -- 按年齡降序排列
SELECT * FROM users LIMIT 5; -- 取前 5 條記錄
? 更新數據
UPDATE users SET age = 26 WHERE name = 'Alice'; -- 更新 Alice 的年齡
? 刪除數據
DELETE FROM users WHERE name = 'Bob'; -- 刪除 Bob
?? 注意點:
DELETE
語句如果沒有WHERE
,會刪除整個表的數據。- 可使用
LIMIT
限制刪除的條數。
📌 4. 約束(Constraints)
? 主鍵約束
CREATE TABLE orders (id INT PRIMARY KEY AUTO_INCREMENT,order_number VARCHAR(20) NOT NULL UNIQUE
);
? 外鍵約束
CREATE TABLE orders (id INT PRIMARY KEY AUTO_INCREMENT,user_id INT,FOREIGN KEY (user_id) REFERENCES users(id)
);
?? 注意點:
FOREIGN KEY
約束確保數據一致性,刪除或更新數據時需注意級聯操作。
📌 5. 高級查詢
? 聚合函數
SELECT COUNT(*) FROM users; -- 統計總人數
SELECT AVG(age) FROM users; -- 計算平均年齡
SELECT MAX(age), MIN(age) FROM users; -- 查找最大、最小年齡
? 分組查詢(GROUP BY)
SELECT age, COUNT(*) FROM users GROUP BY age; -- 按年齡分組統計人數
? 連接查詢(JOIN)
SELECT users.name, orders.order_number
FROM users
JOIN orders ON users.id = orders.user_id;
?? 注意點:
JOIN
操作會影響性能,大數據量時需優化索引。
📌 6. 事務控制(Transactions)
? 開啟事務
START TRANSACTION;
? 執行事務
UPDATE users SET age = 40 WHERE name = 'Alice';
COMMIT; -- 提交事務
? 回滾事務
ROLLBACK; -- 回滾到事務開始前
?? 注意點:
- 事務適用于 銀行轉賬、訂單處理等操作,確保數據一致性。
📌 7. 索引(Indexes)
? 創建索引
CREATE INDEX idx_name ON users(name); -- 創建索引
? 查看索引
SHOW INDEX FROM users; -- 查看索引
? 刪除索引
DROP INDEX idx_name ON users;
?? 注意點:
- 索引加速查詢,但會降低寫入速度,需平衡。
📌 8. 備份 & 恢復
? 備份數據庫
mysqldump -u root -p mydb > mydb_backup.sql # 備份數據庫
? 恢復數據庫
mysql -u root -p mydb < mydb_backup.sql # 還原數據庫
?? 注意點:
- 定期備份數據,避免數據丟失。
📌 9. 常見問題 & 解決方案
?? 端口占用(3306 被占用)
netstat -tulnp | grep 3306 # 查看占用進程
kill -9 <PID> # 終止進程
?? root 用戶無權限
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'yourpassword';
FLUSH PRIVILEGES;
📌 觸發器(Triggers)
🔹 什么是觸發器?
觸發器(Trigger)是一種特殊的存儲過程,在對數據庫表執行 INSERT
、UPDATE
或 DELETE
操作時自動觸發執行。用于 數據驗證、日志記錄、自動更新等。
? 創建觸發器(案例)
CREATE TRIGGER before_insert_users
BEFORE INSERT ON users
FOR EACH ROW
SET NEW.name = UPPER(NEW.name);
📌 說明:
- 該觸發器在
users
表執行INSERT
語句之前觸發, - 將新插入的
name
字段轉換為大寫。
? 刪除觸發器
DROP TRIGGER IF EXISTS before_insert_users;
?? 注意點:
- 觸發器不能被
ALTER
修改,如需修改,需先DROP
再CREATE
。 - 觸發器執行過程中不能直接修改同一個表的數據,否則會引發遞歸調用。
📌 存儲過程(Stored Procedures)
🔹 什么是存儲過程?
存儲過程(Stored Procedure)是一組預編譯的 SQL 語句集合,封裝一系列數據庫操作,提高執行效率并減少代碼重復。
? 創建存儲過程(案例)
DELIMITER $$
CREATE PROCEDURE GetUserCount()
BEGINSELECT COUNT(*) FROM users;
END $$
DELIMITER ;
📌 說明:
DELIMITER $$
用于改變默認的;
結束符,防止CREATE PROCEDURE
語句因;
過早終止。GetUserCount
存儲過程用于統計users
表的總記錄數。
? 調用存儲過程
CALL GetUserCount();
? 刪除存儲過程
DROP PROCEDURE IF EXISTS GetUserCount;
?? 注意點:
- 存儲過程適用于 重復執行的復雜 SQL 操作,如報表查詢、數據批量更新等。
- 存儲過程可接收 輸入參數 并返回 輸出參數。
📌 游標(Cursors)
🔹 什么是游標?
游標(Cursor)用于 遍歷查詢結果集,通常用于存儲過程中的批量數據處理。
? 聲明游標
DECLARE cur CURSOR FOR SELECT name FROM users;
? 使用游標(案例)
DELIMITER $$
CREATE PROCEDURE PrintAllUserNames()
BEGINDECLARE done INT DEFAULT 0;DECLARE username VARCHAR(255);DECLARE cur CURSOR FOR SELECT name FROM users;DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;OPEN cur;FETCH cur INTO username;WHILE done = 0 DO-- 這里可以對 username 進行進一步處理SELECT username;FETCH cur INTO username;END WHILE;CLOSE cur;
END $$
DELIMITER ;
📌 說明:
DECLARE cur CURSOR FOR
聲明游標,指定查詢語句。OPEN cur;
打開游標。FETCH cur INTO username;
獲取一行數據。CLOSE cur;
關閉游標。
? 調用游標
CALL PrintAllUserNames();
?? 注意點:
- 使用
DECLARE CONTINUE HANDLER
捕獲游標遍歷結束時的NOT FOUND
事件。 WHILE done = 0 DO
循環執行FETCH
語句,直到數據全部遍歷完畢。