Web 開發最核心的數據增刪改查:INSERT 多種寫入姿勢、SELECT 七大子句完整語法與實戰模式、UPDATE 條件更新、DELETE 條件刪除,含INSERT ... SELECT 複製數據、多表查詢、分組統計、排序分頁、事務安全模式等實戰技巧。
INSERT [INTO] tbl_name [(col_list)] VALUES (val_list), (val_list)...;
INSERT [INTO] tbl_name SET col=val, col=val...; -- 單行,不支持多行
-- 全列插入(主鍵自增傳 NULL 或 0)
INSERT INTO test01_01 VALUES (NULL, 'www.111cn.net', '23', 'beij');
-- 批量插入(單條 SQL,性能最優)
INSERT INTO test01_01 VALUES
('www.111cn.net', '23', 'beij'),
('grey', '34', 'ah');
-- 指定列插入(其餘列走默認值/NULL)
INSERT INTO test01_01 (name) VALUES ('gery'), ('mack'), ('rose');
-- SET 語法(單行)
INSERT INTO test01_01 SET name='sara';
-- 結構完全一致
INSERT INTO tb_name SELECT * FROM tb_name1;
-- 僅複製指定列
INSERT INTO tb_name (col1) SELECT col1 FROM tb_name1;
限制:
ORDER BYFROM 子句中(ANSI SQL 禁止)
SELECT selection_list
FROM table_list
WHERE primary_constraint
GROUP BY grouping_columns
HAVING secondary_constraint
ORDER BY sorting_columns
LIMIT count;
順序固定,除 SELECT 外均可選。MySQL 允許無 FROM 純表達式求值。
SELECT * FROM test01_01;
SELECT name, age FROM test01_01;
SELECT (2+3*4.5)/2.5; -- 無表表達式
SELECT * FROM test01_01 WHERE name='www.111cn.net';
SELECT * FROM test01_01 WHERE age>=20 AND name LIKE 'zhang%';
SELECT * FROM test01_01 ORDER BY age ASC; -- 升序(默認)
SELECT * FROM test01_01 ORDER BY age DESC; -- 降序
SELECT * FROM test01_01 ORDER BY age DESC, name ASC; -- 多鍵排序
-- 按 name 分組計數
SELECT name, COUNT(*) FROM test01_01 GROUP BY name;
-- 僅返回聚合列時可省略 GROUP BY,但帶非聚合列必須 GROUP BY
SELECT t1.name AS t1name, t1.age AS t1age,
t2.name AS t2name, t2.age AS t2age
FROM test01_01 AS t1, test01_03 AS t2
WHERE t1.name = t2.name;
建議顯式使用 INNER JOIN ... ON,語義更清晰。
SELECT * FROM test01_01 LIMIT 10; -- 前 10 行
SELECT * FROM test01_01 LIMIT 10, 20; -- 偏移 10,取 20 行
UPDATE tbl_name SET col1=val1, col2=val2... [WHERE condition];
WHERE 可選,缺省 = 全表更新(極度危險)UPDATE test01_03 SET name='www.111cn.net' WHERE age='20';
DELETE FROM tbl_name [WHERE condition];
WHERE 可選,缺省 = 清空全表(極度危險)DELETE FROM test01_01 WHERE age=10;TRUNCATE TABLE(DDL,無事務、無觸發器、極快)
START TRANSACTION;
UPDATE accounts SET balance=balance-100 WHERE id=1;
UPDATE accounts SET balance=balance+100 WHERE id=2;
COMMIT; -- 或 ROLLBACK;
確保轉賬類業務原子性。
UPDATE/DELETE 無 WHERE 先 SELECT 確認VALUES (...),(...) 而非循環單條LIMIT 深分頁性能差,改用游標/延遲關聯