数据创建(Create)
要存储数据,首先需要创建表结构。以下是在 MySQL 命令行中创建一个名为 students 的学生表的示例:
CREATE TABLE students (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT '自增主键',
sn INT NOT NULL UNIQUE COMMENT '学号',
name VARCHAR(20) NOT NULL COMMENT '姓名',
qq VARCHAR(20) COMMENT 'QQ 号'
);
插入数据的方式
有了表之后,接下来是插入数据。
方式一:全列插入
如果不写列名,可以直接全列插入。但需注意 VALUES 后面的参数顺序和数量必须与表定义严格一致。
INSERT INTO students VALUES (100, 10000, '唐三藏', NULL);
INSERT INTO students VALUES (101, 10001, '孙悟空', '11111');
方式二:指定列插入
推荐这种方式。只插入需要的列,更加安全且减少数据传输量。
INSERT INTO students (id, sn, name) VALUES (102, 20001, '曹孟德'), (103, 20002, '孙仲谋');
冲突处理策略
插入数据时可能会遇到主键或唯一键冲突。例如再次插入 id=100 的数据会报错 Duplicate entry。
方案 A:冲突则更新(ON DUPLICATE KEY UPDATE)
如果主键冲突,则执行更新操作。
INSERT INTO students (id, sn, name) VALUES (100, 10010, '唐大师')
ON DUPLICATE KEY UPDATE sn = 10010, name = '唐大师';
注意:MySQL 返回的 affected rows 含义不同:0 表示未修改,1 表示插入成功,2 表示发生冲突并更新。
方案 B:替换(REPLACE)
逻辑为:无冲突正常插入;有冲突则先删除原记录再插入新记录。
REPLACE INTO students (sn, name) VALUES (20001, '曹阿瞒');
数据查询(Retrieve)
SELECT 语句是 SQL 的核心,语法丰富。演示表 exam_result 如下:
CREATE TABLE exam_result (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
chinese float DEFAULT 0.0,
math float DEFAULT 0.0,
english float DEFAULT 0.0
);
INSERT INTO exam_result (name, chinese, math, english) VALUES
('唐三藏', 67, 98, 56), ('孙悟空', 87, 78, 77), ('猪悟能', 88, 98, 90),
('曹孟德', 82, 84, 67), ('刘玄德', 55, 85, 45), ('孙权', 70, 73, 78), ('宋公明', 75, 65, 30);
基础查询技巧
1. 全列查询
SELECT * FROM exam_result;
建议:生产环境中尽量避免使用 *,以减少带宽消耗并利用索引优化。
2. 指定列查询
SELECT id, name, english FROM exam_result;
3. 别名与计算
可以为列起别名,甚至进行计算。
SELECT id, name, chinese + math + english AS 总分 FROM exam_result;
4. 去重(DISTINCT)
查看不重复的数学分数。
SELECT DISTINCT math FROM exam_result;
条件过滤(WHERE)
使用运算符筛选数据,如比较运算符、范围查询、模糊匹配等。
案例:
SELECT name, chinese FROM exam_result WHERE chinese BETWEEN 80 AND 90;
SELECT name FROM exam_result WHERE name LIKE '孙%';
注意:在 WHERE 子句中不能使用 SELECT 中定义的别名。
排序(ORDER BY)
支持升序(ASC,默认)和降序(DESC),支持多字段排序。
SELECT name, math, english FROM exam_result ORDER BY math DESC, english ASC;
提示:ORDER BY 中可以使用别名,这与 WHERE 不同。
分页(LIMIT)
大数据量查询需分页,防止全表扫描导致性能问题。
SELECT * FROM exam_result LIMIT 3 OFFSET 0;
SELECT * FROM exam_result LIMIT 3 OFFSET 3;
建议:对陌生大表查询时,养成加 LIMIT 1 的习惯以防卡死数据库。