语法格式:
SELECT 列名1, 列名2, ...
FROM 表名;
示例:
-- 创建学生表
CREATE TABLE students (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age TINYINT UNSIGNED,
gender ENUM('男', '女'),
score DECIMAL(5, 2),
city VARCHAR(50)
);
-- 插入测试数据
INSERT INTO students (name, age, gender, score, city) VALUES
('张三', 20, '男', 85.5, '北京'),
('李四', 22, '女', 92.0, '上海'),
('王五', 21, '男', 78.5, '广州'),
('赵六', 19, '女', 88.0, '深圳'),
('孙七', 23, '男', 95.5, '北京'),
('周八', 20, '女', 82.0, '上海');
-- 查询所有列
SELECT * FROM students;
-- 查询指定列
SELECT name, age, score FROM students;
语法格式:
SELECT 列名 AS 别名 FROM 表名;
或
SELECT 列名 别名 FROM 表名;
示例:
-- 使用AS关键字
SELECT name AS 姓名, age AS 年龄 FROM students;
-- 省略AS关键字
SELECT name 姓名, score 成绩 FROM students;
-- 使用引号(包含特殊字符)
SELECT name AS '学生姓名', score AS '成绩(分)' FROM students;
语法格式:
SELECT DISTINCT 列名 FROM 表名;
示例:
-- 查询所有城市(包含重复)
SELECT city FROM students;
-- 查询不重复的城市
SELECT DISTINCT city FROM students;
输出对比:
-- 不使用DISTINCT
+--------+
| city |
+--------+
| 北京 |
| 上海 |
| 广州 |
| 深圳 |
| 北京 |
| 上海 |
+--------+
-- 使用DISTINCT
+--------+
| city |
+--------+
| 北京 |
| 上海 |
| 广州 |
| 深圳 |
+--------+
-- 查询不重复的城市和性别组合
SELECT DISTINCT city, gender FROM students;
语法格式:
SELECT 列名 FROM 表名 LIMIT 数量;
示例:
-- 查询前3条记录
SELECT * FROM students LIMIT 3;
语法格式:
SELECT 列名 FROM 表名 LIMIT 偏移量, 数量;
或
SELECT 列名 FROM 表名 LIMIT 数量 OFFSET 偏移量;
示例:
-- 第1页:从第0条开始,取3条
SELECT * FROM students LIMIT 0, 3;
-- 第2页:从第3条开始,取3条
SELECT * FROM students LIMIT 3, 3;
-- 第3页:从第6条开始,取3条
SELECT * FROM students LIMIT 6, 3;
-- 使用OFFSET语法
SELECT * FROM students LIMIT 3 OFFSET 0;
SELECT * FROM students LIMIT 3 OFFSET 3;
| 运算符 | 说明 | 示例 |
|---|---|---|
| = | 等于 | age = 20 |
| != 或 <> | 不等于 | age != 20 |
| > | 大于 | age > 20 |
| < | 小于 | age < 20 |
| >= | 大于等于 | age >= 20 |
| <= | 小于等于 | age <= 20 |
示例:
-- 等于
SELECT * FROM students WHERE age = 20;
-- 不等于
SELECT * FROM students WHERE age != 20;
-- 大于
SELECT * FROM students WHERE score > 85;
-- 小于等于
SELECT * FROM students WHERE age <= 20;
| 运算符 | 说明 | 示例 |
|---|---|---|
| AND | 逻辑与 | age > 18 AND score > 80 |
| OR | 逻辑或 | age < 20 OR age > 22 |
| NOT | 逻辑非 | NOT gender = '男' |
示例:
-- AND:多个条件同时满足
SELECT * FROM students WHERE age > 20 AND score > 80;
-- OR:满足任一条件
SELECT * FROM students WHERE city = '北京' OR city = '上海';
-- NOT:取反
SELECT * FROM students WHERE NOT gender = '男';
-- 组合使用
SELECT * FROM students
WHERE (city = '北京' OR city = '上海') AND score > 80;
语法格式:
WHERE 列名 BETWEEN 值1 AND 值2
示例:
-- 查询年龄在20到22岁之间的学生
SELECT * FROM students WHERE age BETWEEN 20 AND 22;
-- 等价于
SELECT * FROM students WHERE age >= 20 AND age <= 22;
语法格式:
WHERE 列名 IN (值1, 值2, ...)
示例:
-- 查询北京、上海、广州的学生
SELECT * FROM students WHERE city IN ('北京', '上海', '广州');
-- 等价于
SELECT * FROM students
WHERE city = '北京' OR city = '上海' OR city = '广州';
语法格式:
WHERE 列名 IS NULL
WHERE 列名 IS NOT NULL
示例:
-- 插入包含NULL的数据
INSERT INTO students (name, age, gender) VALUES ('测试', 20, NULL);
-- 查询city为NULL的记录
SELECT * FROM students WHERE city IS NULL;
-- 查询city不为NULL的记录
SELECT * FROM students WHERE city IS NOT NULL;
⚠️ 注意:不能使用= NULL或!= NULL判断NULL值。
语法格式:
WHERE 列名 LIKE '模式'
通配符:
| 通配符 | 说明 | 示例 |
|---|---|---|
| % | 匹配任意多个字符 | '张%' |
| _ | 匹配单个字符 | '张_' |
示例:
-- 以'张'开头
SELECT * FROM students WHERE name LIKE '张%';
-- 以'三'结尾
SELECT * FROM students WHERE name LIKE '%三';
-- 包含'小'
SELECT * FROM students WHERE name LIKE '%小%';
-- 第二个字是'三'
SELECT * FROM students WHERE name LIKE '_三%';
-- 查询两个字的名字
SELECT * FROM students WHERE name LIKE '__';
使用ESCAPE:
-- 查询包含'%'的字符串
SELECT * FROM students WHERE name LIKE '%\%%';
-- 使用ESCAPE指定转义字符
SELECT * FROM students WHERE name LIKE '%|%%' ESCAPE '|';
语法格式:
ORDER BY 列名 ASC
或
ORDER BY 列名
示例:
-- 按年龄升序排序(默认)
SELECT * FROM students ORDER BY age;
-- 明确指定ASC
SELECT * FROM students ORDER BY age ASC;
语法格式:
ORDER BY 列名 DESC
示例:
-- 按成绩降序排序
SELECT * FROM students ORDER BY score DESC;
语法格式:
ORDER BY 列名1 [ASC|DESC], 列名2 [ASC|DESC], ...
示例:
-- 先按城市升序,再按成绩降序
SELECT * FROM students
ORDER BY city ASC, score DESC;
-- 先按性别升序,再按年龄降序
SELECT * FROM students
ORDER BY gender, age DESC;
-- 按成绩的整数部分排序
SELECT name, score, FLOOR(score)
FROM students
ORDER BY FLOOR(score);
-- 按名字长度排序
SELECT * FROM students ORDER BY LENGTH(name);
-- 使用列别名排序
SELECT name, score * 10 AS total_score
FROM students
ORDER BY total_score DESC;
-- 按第2列排序
SELECT name, age, score FROM students ORDER BY 2;
-- 按第3列降序
SELECT name, age, score FROM students ORDER BY 3 DESC;
⚠️ 注意:不推荐使用位置排序,可读性差。
| 函数 | 说明 | 示例 |
|---|---|---|
| COUNT() | 统计行数 | COUNT(*) |
| SUM() | 求和 | SUM(score) |
| AVG() | 平均值 | AVG(score) |
| MAX() | 最大值 | MAX(score) |
| MIN() | 最小值 | MIN(score) |
统计行数:
-- 统计总行数
SELECT COUNT(*) FROM students;
-- 统计非NULL值数量
SELECT COUNT(city) FROM students;
-- 统计不重复值数量
SELECT COUNT(DISTINCT city) FROM students;
求和:
-- 计算总成绩
SELECT SUM(score) AS total_score FROM students;
-- 计算总年龄
SELECT SUM(age) AS total_age FROM students;
平均值:
-- 计算平均成绩
SELECT AVG(score) AS avg_score FROM students;
-- 保留小数位
SELECT ROUND(AVG(score), 2) AS avg_score FROM students;
最大值和最小值:
-- 查询最高分
SELECT MAX(score) AS max_score FROM students;
-- 查询最低分
SELECT MIN(score) AS min_score FROM students;
-- 查询最大年龄
SELECT MAX(age) AS max_age FROM students;
-- 组合使用
SELECT
MAX(score) AS max_score,
MIN(score) AS min_score,
MAX(score) - MIN(score) AS score_range
FROM students;
语法格式:
SELECT 列名, 聚合函数()
FROM 表名
GROUP BY 列名;
示例:
-- 按城市分组统计人数
SELECT city, COUNT(*) AS count
FROM students
GROUP BY city;
-- 按性别分组统计平均成绩
SELECT gender, AVG(score) AS avg_score
FROM students
GROUP BY gender;
-- 按城市和性别分组
SELECT city, gender, COUNT(*) AS count
FROM students
GROUP BY city, gender;
-- 按城市分组,按人数降序排序
SELECT city, COUNT(*) AS count
FROM students
GROUP BY city
ORDER BY count DESC;
语法格式:
SELECT 列名, 聚合函数()
FROM 表名
GROUP BY 列名
HAVING 条件;
示例:
-- 查询人数大于1的城市
SELECT city, COUNT(*) AS count
FROM students
GROUP BY city
HAVING count > 1;
-- 查询平均成绩大于85的性别
SELECT gender, AVG(score) AS avg_score
FROM students
GROUP BY gender
HAVING avg_score > 85;
| 特性 | WHERE | HAVING |
|---|---|---|
| 作用对象 | 行 | 分组 |
| 执行顺序 | GROUP BY前 | GROUP BY后 |
| 聚合函数 | 不能使用 | 可以使用 |
示例对比:
-- WHERE:过滤行
SELECT city, AVG(score) AS avg_score
FROM students
WHERE score > 80
GROUP BY city;
-- HAVING:过滤分组
SELECT city, AVG(score) AS avg_score
FROM students
GROUP BY city
HAVING avg_score > 85;
| 函数 | 说明 | 示例 |
|---|---|---|
| CONCAT() | 连接字符串 | CONCAT('Hello', ' ', 'World') |
| LENGTH() | 字符串长度(字节) | LENGTH('张三') |
| CHAR_LENGTH() | 字符串长度(字符) | CHAR_LENGTH('张三') |
| UPPER() | 转大写 | UPPER('hello') |
| LOWER() | 转小写 | LOWER('HELLO') |
| LEFT() | 左截取 | LEFT('Hello', 2) |
| RIGHT() | 右截取 | RIGHT('Hello', 2) |
| SUBSTRING() | 子串 | SUBSTRING('Hello', 2, 3) |
| TRIM() | 去除空格 | TRIM(' Hello ') |
| LPAD() | 左填充 | LPAD('5', 3, '0') |
| RPAD() | 右填充 | RPAD('5', 3, '0') |
| REPLACE() | 替换 | REPLACE('Hello', 'l', 'L') |
示例:
-- 连接字符串
SELECT CONCAT(name, '(', city, ')') AS info FROM students;
-- 字符串长度
SELECT name, LENGTH(name), CHAR_LENGTH(name) FROM students;
-- 大小写转换
SELECT UPPER(name), LOWER(name) FROM students;
-- 截取字符串
SELECT LEFT(name, 1) AS 姓氏 FROM students;
SELECT SUBSTRING(name, 2, 1) AS 名字 FROM students;
-- 替换
SELECT REPLACE(name, '张', '王') FROM students;
| 函数 | 说明 | 示例 |
|---|---|---|
| ABS() | 绝对值 | ABS(-5) |
| CEIL() | 向上取整 | CEIL(4.3) |
| FLOOR() | 向下取整 | FLOOR(4.7) |
| ROUND() | 四舍五入 | ROUND(4.567, 2) |
| TRUNCATE() | 截断 | TRUNCATE(4.567, 2) |
| MOD() | 取模 | MOD(10, 3) |
| POWER() | 幂运算 | POWER(2, 3) |
| SQRT() | 平方根 | SQRT(16) |
| RAND() | 随机数 | RAND() |
示例:
-- 绝对值
SELECT ABS(score - 90) FROM students;
-- 四舍五入
SELECT ROUND(score, 1) FROM students;
-- 向上取整
SELECT CEIL(score) FROM students;
-- 随机数
SELECT RAND() FROM students;
-- 随机排序
SELECT * FROM students ORDER BY RAND();
| 函数 | 说明 | 示例 |
|---|---|---|
| NOW() | 当前日期时间 | NOW() |
| CURDATE() | 当前日期 | CURDATE() |
| CURTIME() | 当前时间 | CURTIME() |
| DATE() | 提取日期 | DATE(NOW()) |
| TIME() | 提取时间 | TIME(NOW()) |
| YEAR() | 提取年份 | YEAR(NOW()) |
| MONTH() | 提取月份 | MONTH(NOW()) |
| DAY() | 提取日 | DAY(NOW()) |
| HOUR() | 提取小时 | HOUR(NOW()) |
| MINUTE() | 提取分钟 | MINUTE(NOW()) |
| SECOND() | 提取秒 | SECOND(NOW()) |
| DATE_FORMAT() | 格式化日期 | DATE_FORMAT(NOW(), '%Y-%m-%d') |
| DATE_ADD() | 日期加 | DATE_ADD(NOW(), INTERVAL 1 DAY) |
| DATE_SUB() | 日期减 | DATE_SUB(NOW(), INTERVAL 1 MONTH) |
| DATEDIFF() | 日期差 | DATEDIFF('2024-12-31', '2024-01-01') |
示例:
-- 当前日期时间
SELECT NOW(), CURDATE(), CURTIME();
-- 提取日期部分
SELECT YEAR(NOW()), MONTH(NOW()), DAY(NOW());
-- 格式化日期
SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日 %H:%i:%s');
-- 日期计算
SELECT DATE_ADD(NOW(), INTERVAL 7 DAY);
SELECT DATE_SUB(NOW(), INTERVAL 1 MONTH);
-- 日期差值
SELECT DATEDIFF('2024-12-31', NOW());
语法格式:
IF(条件, 真值, 假值)
示例:
-- 成绩等级判断
SELECT name, score,
IF(score >= 60, '及格', '不及格') AS grade
FROM students;
语法格式1:
CASE
WHEN 条件1 THEN 结果1
WHEN 条件2 THEN 结果2
...
ELSE 默认结果
END
语法格式2:
CASE 表达式
WHEN 值1 THEN 结果1
WHEN 值2 THEN 结果2
...
ELSE 默认结果
END
示例:
-- 成绩等级划分
SELECT name, score,
CASE
WHEN score >= 90 THEN '优秀'
WHEN score >= 80 THEN '良好'
WHEN score >= 70 THEN '中等'
WHEN score >= 60 THEN '及格'
ELSE '不及格'
END AS grade
FROM students;
-- 城市区域划分
SELECT name, city,
CASE city
WHEN '北京' THEN '华北'
WHEN '上海' THEN '华东'
WHEN '广州' THEN '华南'
WHEN '深圳' THEN '华南'
ELSE '其他'
END AS region
FROM students;
SELECT DISTINCT 列名
FROM 表名
JOIN 表名 ON 条件
WHERE 条件
GROUP BY 列名
HAVING 条件
ORDER BY 列名
LIMIT 数量;
执行顺序:
示例:
SELECT city, COUNT(*) AS count
FROM students
WHERE score > 80
GROUP BY city
HAVING count > 1
ORDER BY count DESC
LIMIT 3;
执行过程:
✅ SELECT查询数据,支持列别名 ✅ WHERE过滤数据,支持多种条件 ✅ ORDER BY排序,支持多列排序 ✅ LIMIT限制结果,支持分页 ✅ 聚合函数结合GROUP BY使用
完成本章学习后,请确认您能够: