本文通過一個 employee 表的完整生命周期,串聯 DDL、DML、查詢、函數、事務等核心操作,適合初學者跟敲練習。
DROP TABLE IF EXISTS employee;
CREATE TABLE employee (
id INT,
name VARCHAR(20),
gender VARCHAR(6),
birthday DATE,
entry_date DATE,
job VARCHAR(30),
salary FLOAT(5,1),
resume TEXT
) CHARSET=utf8;
INSERT INTO employee (id,name,gender,birthday,entry_date,job,salary,resume)
VALUES (1,'jack','male','2011-10-08','2011-12-31','software',5000.1,'hello');
-- 增加列
ALTER TABLE employee ADD image BLOB;
-- 修改列長度與默認值
ALTER TABLE employee MODIFY job VARCHAR(60) DEFAULT 'teacher';
-- 刪除列
ALTER TABLE employee DROP gender;
-- 重命名表
RENAME TABLE employee TO user;
-- 修改表字符集
ALTER TABLE user CHARACTER SET utf8;
-- 重命名列
ALTER TABLE user CHANGE COLUMN name username VARCHAR(20);
SET character_set_client = gbk;
SET character_set_results = gbk;
-- 或一鍵設置
SET NAMES gbk;
INSERT INTO user (username,id,birthday,entry_date,job,salary,resume)
VALUES ('傑克',2,'2011-10-08','2011-12-31','software',5000.1,'你好');
INSERT INTO user VALUES (3,'馬利','2011-10-08','2011-12-31','software',5000.1,'你好',NULL);
INSERT INTO user VALUES (4,'馬利','2011-10-08','2011-12-31','software',5000.1,NULL,NULL);
INSERT INTO user (id,username,birthday,entry_date,job,salary,image)
VALUES (5,'馬利','2011-10-08','2011-12-31','software',5000.1,NULL);
-- 全表更新
UPDATE user SET salary = 6000;
-- 條件更新
UPDATE user SET salary = 7000 WHERE username = '馬利';
-- 相對更新
UPDATE user SET salary = salary + 1000 WHERE username = 'jack';
-- 條件刪除
DELETE FROM user WHERE username = 'jack';
-- 全表刪除
DELETE FROM user;
-- TRUNCATE(重置自增、速度快)
TRUNCATE TABLE user;
SELECT * FROM student;
SELECT id,name,math,chinese,english FROM student;
SELECT name,english FROM student;
-- 去重
SELECT DISTINCT english FROM student;
SELECT DISTINCT name,english FROM student;
-- 列運算與別名
SELECT name, math+10 AS math_bonus FROM student;
SELECT name, math+chinese+english AS total FROM student;
SELECT name, math+chinese+english AS total FROM student;
SELECT * FROM student WHERE name = '張小明';
SELECT * FROM student WHERE english > 90;
SELECT name, chinese+math+english AS total FROM student WHERE chinese+math+english > 200;
SELECT * FROM student WHERE english BETWEEN 80 AND 90;
SELECT * FROM student WHERE math IN (89,90,91);
SELECT * FROM student WHERE name LIKE '李%';
SELECT * FROM student WHERE name LIKE '%李%';
SELECT * FROM student WHERE name LIKE '__李';
SELECT * FROM student WHERE math IS NOT NULL;
SELECT * FROM student ORDER BY math ASC;
SELECT * FROM student ORDER BY math DESC;
SELECT name, math+chinese+english AS total FROM student ORDER BY total DESC;
SELECT name, math+chinese+english AS total FROM student WHERE name LIKE '李%' ORDER BY total DESC;
SELECT COUNT(*) AS total FROM student;
SELECT COUNT(*) FROM student WHERE math > 80;
SELECT COUNT(*) FROM student WHERE math+chinese+english > 250;
SELECT SUM(math) FROM student;
SELECT SUM(math) AS math_sum, SUM(chinese) AS chinese_sum, SUM(english) AS english_sum FROM student;
SELECT SUM(math)+SUM(chinese)+SUM(english) AS class_total FROM student;
SELECT SUM(math)/COUNT(math) AS math_avg FROM student;
SELECT SUM(math)/COUNT(*) AS math_avg2 FROM student;
| 操作 | DELETE | TRUNCATE | DROP |
|---|---|---|---|
| 作用 | 逐行刪除,可帶 WHERE | 整表重建,不可帶 WHERE | 刪除表結構 |
| 自增重置 | 不重置 | 重置為 1 | 表不存在 |
| 觸發器 | 觸發 | 不觸發 | 無 |
| 回滾 | 事務中可回滾 | 不可回滾(隱式提交) | 不可回滾 |
ORDER BY 必須放最後,NULL 排最前。COUNT(col) 不統計 NULL;COUNT(*) 統計行數。SUM(col) 非數值列返回 0。AVG/MAX/MIN 同理忽略 NULL。跟敲完本練習,即可掌握 MySQL 核心 DDL/DML/查詢/聚合/事務/編碼處理全流程。建議在本地庫重複練習 3 遍,形成肌肉記憶。