SQL 查询中各个关键字的执行先后顺序:
FROM > ON > JOIN > WHERE > GROUP BY > WITH > HAVING > SELECT > DISTINCT > ORDER BY > LIMIT
MySQL 表基础语法涵盖创建、插入、查询、条件筛选、排序及聚合函数。内容包括建表约束、单行多行插入、全列指定列查询、表达式与别名、where 比较逻辑、order by 排序规则、count/sum/avg/max/min 聚合计算,以及日期、字符串、数学函数的常用方法。通过代码示例演示增删查改操作,帮助掌握数据库核心交互技能。

SQL 查询中各个关键字的执行先后顺序:
FROM > ON > JOIN > WHERE > GROUP BY > WITH > HAVING > SELECT > DISTINCT > ORDER BY > LIMIT
使用 CREATE TABLE 语法创建表。
CREATE TABLE 表名 (
字段名 1 字段类型,
字段名 2 字段类型
);
例如创建一个学生信息表,包含学生名、学号(主键)、电话号码(唯一键),且不能为空。
首先创建数据库 message,然后创建表结构:
CREATE TABLE student (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
phone VARCHAR(20) UNIQUE NOT NULL
);
插入核心语法:INSERT INTO 表名 (数据字段) VALUES (插入数据)。
如果不填数据字段,默认是全列插入。
INSERT INTO student (id, name, phone) VALUES (1, '张三', '13800138000');
填充表名后面的数据字段即可。
INSERT INTO student (name, phone) VALUES ('李四', '13900139000'), ('王五', '13700137000');
如果因为主键或者唯一键的冲突导致插入失败,可以使用 ON DUPLICATE KEY UPDATE 进行更新。
INSERT INTO student (id, name, phone)
VALUES (1, '王五', '15098706751')
ON DUPLICATE KEY UPDATE phone = '18927390098';
为了方便演示,创建测试数据表 exam_result:
CREATE TABLE exam_result (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL COMMENT '同学姓名',
chinese FLOAT DEFAULT 0.0 COMMENT '语文成绩',
math FLOAT DEFAULT 0.0 COMMENT '数学成绩',
english FLOAT DEFAULT 0.0 COMMENT '英语成绩'
);
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);
SELECT 后直接使用 * 代表全列查询。
SELECT * FROM exam_result;
在 SELECT 后面增加要查询的字段,多个字段用逗号分开。
SELECT name, chinese, math FROM exam_result;
SELECT 后面的查询字段可以带表达式,依然用逗号区分。
SELECT name, chinese + math AS total_score FROM exam_result;
在表达式后面用空格分开,直接写别名。
SELECT name AS 姓名,chinese AS 语文 FROM exam_result;
SELECT 后面的语句是用来指定查找的内容,WHERE 子句增加比较逻辑。
SELECT ... FROM ... WHERE ...;
支持 =, !=, <, >, <=, >=, IS NULL, IS NOT NULL 等。
支持 AND, OR, NOT。
查找英语高于 60 分的同学:
SELECT * FROM exam_result WHERE english > 60;
查找数学和英语成绩之和超过 120 的同学:
SELECT * FROM exam_result WHERE math + english > 120;
语文和数学成绩之和,在 [120~150] 的同学:
SELECT * FROM exam_result WHERE chinese + math BETWEEN 120 AND 150;
使用 LIKE 进行模糊匹配。
查找姓孙的同学:
SELECT * FROM exam_result WHERE name LIKE '孙%';
查找孙某同学:
SELECT * FROM exam_result WHERE name LIKE '孙_';
没有 ORDER BY 子句的查询,返回的顺序是未定义的。
-- ASC 为升序(从小到大)
-- DESC 为降序(从大到小)
-- 默认为 ASC
SELECT ... FROM ... ORDER BY ...;
例如:查英语降序:
SELECT * FROM exam_result ORDER BY english DESC;
只有前一个字段的值相同时,才会执行后一个字段的排序。
SELECT * FROM exam_result ORDER BY math DESC, english DESC;
聚合函数支持将字段名组合进行参数传递。
COUNT(字段);
例如:查有几个人:
SELECT COUNT(*) FROM exam_result;
SUM(字段);
例如:查语文和数学成绩总和:
SELECT SUM(chinese + math) FROM exam_result;
AVG(字段);
例如:查语文平均成绩:
SELECT AVG(chinese) FROM exam_result;
MAX(字段); MIN(字段);
例如:查数学最高分:
SELECT MAX(math) FROM exam_result;
下面是日期函数调用,使用方法和聚合函数一样。
获取当前日期:
SELECT CURDATE();
获取当前时间:
SELECT CURTIME();
获取当前日期的时间:
SELECT NOW();
创建一个留言表:记录人留的字段,自动记录时间(可以用 CURRENT_TIMESTAMP 作为缺省值)。
CREATE TABLE message (
id INT PRIMARY KEY AUTO_INCREMENT,
content TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
自动补充时间:
INSERT INTO message (content) VALUES ('这是一条留言');
形成留言的效果:
SELECT * FROM message;
连接字符串:
CONCAT(str1, str2);
查询 instr 是由 1 开始计算下标,不是从 0 开始:
INSTR(str, substr);
搭配字段使用:
SELECT CONCAT(name, '的成绩是') FROM exam_result;
常用的数学函数包括取绝对值、四舍五入、取余数等。
取绝对值:
ABS(-10);
四舍五入:
ROUND(3.14159, 2);
取余数:
MOD(10, 3);
向上取整:
CEIL(3.1);
向下取整:
FLOOR(3.9);
以上函数可直接在 SELECT 语句中使用,用于数值处理。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
在线格式化和美化您的 SQL 查询(它支持各种 SQL 方言)。 在线工具,SQL 美化和格式化在线工具,online
解析 INSERT 等受限 SQL,导出为 CSV、JSON、XML、YAML、HTML 表格(见页内语法说明)。 在线工具,SQL转CSV/JSON/XML在线工具,online
CSV 与 JSON/XML/HTML/TSV/SQL 等互转,单页多 Tab。 在线工具,CSV 工具包在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online