MySQL基础查询 #
一、SELECT语句概述 #
1.1 基本语法 #
sql
SELECT column1, column2, ...
FROM table_name
WHERE condition
ORDER BY column
LIMIT n;
1.2 示例表结构 #
sql
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
age INT,
email VARCHAR(100),
status TINYINT DEFAULT 1,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
INSERT INTO users (name, age, email, status) VALUES
('John', 25, 'john@example.com', 1),
('Jane', 30, 'jane@example.com', 1),
('Bob', 28, 'bob@example.com', 0),
('Alice', 22, 'alice@example.com', 1),
('Charlie', 35, 'charlie@example.com', 0);
二、基本查询 #
2.1 查询所有列 #
sql
SELECT * FROM users;
+----+---------+------+--------------------+--------+---------------------+
| id | name | age | email | status | created_at |
+----+---------+------+--------------------+--------+---------------------+
| 1 | John | 25 | john@example.com | 1 | 2024-01-15 10:00:00 |
| 2 | Jane | 30 | jane@example.com | 1 | 2024-01-15 11:00:00 |
| 3 | Bob | 28 | bob@example.com | 0 | 2024-01-15 12:00:00 |
| 4 | Alice | 22 | alice@example.com | 1 | 2024-01-15 13:00:00 |
| 5 | Charlie | 35 | charlie@example.com| 0 | 2024-01-15 14:00:00 |
+----+---------+------+--------------------+--------+---------------------+
2.2 查询指定列 #
sql
SELECT name, age, email FROM users;
+---------+------+--------------------+
| name | age | email |
+---------+------+--------------------+
| John | 25 | john@example.com |
| Jane | 30 | jane@example.com |
| Bob | 28 | bob@example.com |
| Alice | 22 | alice@example.com |
| Charlie | 35 | charlie@example.com|
+---------+------+--------------------+
2.3 列别名 #
sql
-- 使用AS关键字
SELECT
name AS user_name,
age AS user_age,
email AS user_email
FROM users;
-- 省略AS关键字
SELECT name user_name, age user_age FROM users;
-- 使用引号(包含空格或特殊字符)
SELECT name AS '用户名', age AS '年龄' FROM users;
2.4 表别名 #
sql
SELECT u.name, u.age, u.email
FROM users AS u;
-- 省略AS
SELECT u.name, u.age FROM users u;
三、DISTINCT去重 #
3.1 基本用法 #
sql
-- 查询所有年龄(包含重复)
SELECT age FROM users;
-- 查询不重复的年龄
SELECT DISTINCT age FROM users;
+------+
| age |
+------+
| 25 |
| 30 |
| 28 |
| 22 |
| 35 |
+------+
3.2 多列去重 #
sql
-- 多列组合去重
SELECT DISTINCT age, status FROM users;
+------+--------+
| age | status |
+------+--------+
| 25 | 1 |
| 30 | 1 |
| 28 | 0 |
| 22 | 1 |
| 35 | 0 |
+------+--------+
3.3 统计去重数量 #
sql
-- 统计不同年龄的数量
SELECT COUNT(DISTINCT age) FROM users;
-- 统计不同年龄和状态组合的数量
SELECT COUNT(DISTINCT age, status) FROM users;
四、WHERE条件 #
4.1 比较运算符 #
sql
-- 等于
SELECT * FROM users WHERE age = 25;
-- 不等于
SELECT * FROM users WHERE age != 25;
SELECT * FROM users WHERE age <> 25;
-- 大于
SELECT * FROM users WHERE age > 25;
-- 小于
SELECT * FROM users WHERE age < 25;
-- 大于等于
SELECT * FROM users WHERE age >= 25;
-- 小于等于
SELECT * FROM users WHERE age <= 25;
4.2 逻辑运算符 #
sql
-- AND:同时满足多个条件
SELECT * FROM users WHERE age > 25 AND status = 1;
-- OR:满足任一条件
SELECT * FROM users WHERE age < 25 OR age > 30;
-- NOT:取反
SELECT * FROM users WHERE NOT status = 0;
-- 组合使用(注意优先级)
SELECT * FROM users
WHERE (age < 25 OR age > 30) AND status = 1;
4.3 BETWEEN…AND #
sql
-- 范围查询(包含边界)
SELECT * FROM users WHERE age BETWEEN 25 AND 30;
-- 等价于
SELECT * FROM users WHERE age >= 25 AND age <= 30;
-- NOT BETWEEN
SELECT * FROM users WHERE age NOT BETWEEN 25 AND 30;
4.4 IN #
sql
-- 列表匹配
SELECT * FROM users WHERE age IN (25, 30, 35);
-- 等价于
SELECT * FROM users WHERE age = 25 OR age = 30 OR age = 35;
-- NOT IN
SELECT * FROM users WHERE age NOT IN (25, 30, 35);
-- 子查询
SELECT * FROM users WHERE id IN (
SELECT user_id FROM orders WHERE status = 'completed'
);
4.5 LIKE模糊匹配 #
sql
-- % 匹配任意多个字符
SELECT * FROM users WHERE name LIKE 'J%'; -- 以J开头
SELECT * FROM users WHERE name LIKE '%n'; -- 以n结尾
SELECT * FROM users WHERE name LIKE '%oh%'; -- 包含oh
-- _ 匹配单个字符
SELECT * FROM users WHERE name LIKE 'J_hn'; -- John
-- 组合使用
SELECT * FROM users WHERE email LIKE '%@%.com';
-- NOT LIKE
SELECT * FROM users WHERE name NOT LIKE 'J%';
4.6 NULL值判断 #
sql
-- IS NULL
SELECT * FROM users WHERE email IS NULL;
-- IS NOT NULL
SELECT * FROM users WHERE email IS NOT NULL;
-- 错误写法
SELECT * FROM users WHERE email = NULL; -- 不会返回结果
SELECT * FROM users WHERE email != NULL; -- 不会返回结果
4.7 安全等于 #
sql
-- <=> 安全等于(可以比较NULL)
SELECT * FROM users WHERE email <=> NULL;
-- 等价于
SELECT * FROM users WHERE email IS NULL;
五、ORDER BY排序 #
5.1 升序排序 #
sql
-- 默认升序(ASC)
SELECT * FROM users ORDER BY age;
SELECT * FROM users ORDER BY age ASC;
5.2 降序排序 #
sql
-- 降序(DESC)
SELECT * FROM users ORDER BY age DESC;
5.3 多列排序 #
sql
-- 先按status排序,再按age排序
SELECT * FROM users ORDER BY status ASC, age DESC;
+----+---------+------+--------------------+--------+
| id | name | age | email | status |
+----+---------+------+--------------------+--------+
| 2 | Jane | 30 | jane@example.com | 1 |
| 1 | John | 25 | john@example.com | 1 |
| 4 | Alice | 22 | alice@example.com | 1 |
| 5 | Charlie | 35 | charlie@example.com| 0 |
| 3 | Bob | 28 | bob@example.com | 0 |
+----+---------+------+--------------------+--------+
5.4 按表达式排序 #
sql
-- 按计算结果排序
SELECT name, age, age * 2 AS double_age
FROM users
ORDER BY double_age;
-- 按函数结果排序
SELECT * FROM users ORDER BY LENGTH(name);
-- 按列位置排序
SELECT name, age FROM users ORDER BY 2; -- 按第二列(age)排序
5.5 自定义排序 #
sql
-- 使用FIELD函数自定义排序
SELECT * FROM users
ORDER BY FIELD(status, 1, 0);
-- 使用CASE WHEN
SELECT * FROM users
ORDER BY CASE status
WHEN 1 THEN 1
WHEN 0 THEN 2
ELSE 3
END;
六、LIMIT分页 #
6.1 限制返回行数 #
sql
-- 返回前3条
SELECT * FROM users LIMIT 3;
+----+------+------+------------------+--------+
| id | name | age | email | status |
+----+------+------+------------------+--------+
| 1 | John | 25 | john@example.com | 1 |
| 2 | Jane | 30 | jane@example.com | 1 |
| 3 | Bob | 28 | bob@example.com | 0 |
+----+------+------+------------------+--------+
6.2 分页查询 #
sql
-- LIMIT offset, count
-- offset:偏移量(从0开始)
-- count:返回行数
-- 第1页(每页3条)
SELECT * FROM users LIMIT 0, 3;
-- 第2页
SELECT * FROM users LIMIT 3, 3;
-- 第3页
SELECT * FROM users LIMIT 6, 3;
-- 推荐写法(MySQL 8.0+)
SELECT * FROM users LIMIT 3 OFFSET 0;
SELECT * FROM users LIMIT 3 OFFSET 3;
6.3 分页公式 #
sql
-- 第n页,每页m条
-- offset = (n - 1) * m
-- 例如:第3页,每页10条
SELECT * FROM users LIMIT 20, 10;
SELECT * FROM users LIMIT 10 OFFSET 20;
6.4 LIMIT与ORDER BY #
sql
-- 通常配合使用
SELECT * FROM users
ORDER BY created_at DESC
LIMIT 10;
-- 获取最年长的3人
SELECT * FROM users
ORDER BY age DESC
LIMIT 3;
七、聚合函数 #
7.1 常用聚合函数 #
| 函数 | 说明 |
|---|---|
| COUNT() | 计数 |
| SUM() | 求和 |
| AVG() | 平均值 |
| MAX() | 最大值 |
| MIN() | 最小值 |
7.2 COUNT函数 #
sql
-- 统计行数
SELECT COUNT(*) FROM users;
-- 统计非NULL值数量
SELECT COUNT(email) FROM users;
-- 统计不重复值的数量
SELECT COUNT(DISTINCT age) FROM users;
7.3 SUM函数 #
sql
-- 求和
SELECT SUM(age) FROM users;
-- 条件求和
SELECT SUM(CASE WHEN status = 1 THEN age ELSE 0 END) FROM users;
7.4 AVG函数 #
sql
-- 平均值
SELECT AVG(age) FROM users;
-- 保留小数位
SELECT ROUND(AVG(age), 2) FROM users;
7.5 MAX和MIN函数 #
sql
-- 最大值
SELECT MAX(age) FROM users;
-- 最小值
SELECT MIN(age) FROM users;
-- 同时获取
SELECT MAX(age) AS max_age, MIN(age) AS min_age FROM users;
7.6 组合使用 #
sql
SELECT
COUNT(*) AS total,
SUM(age) AS total_age,
AVG(age) AS avg_age,
MAX(age) AS max_age,
MIN(age) AS min_age
FROM users;
八、GROUP BY分组 #
8.1 基本分组 #
sql
-- 按状态分组统计
SELECT status, COUNT(*) AS count
FROM users
GROUP BY status;
+--------+-------+
| status | count |
+--------+-------+
| 0 | 2 |
| 1 | 3 |
+--------+-------+
8.2 多列分组 #
sql
-- 按多列分组
SELECT status, age, COUNT(*) AS count
FROM users
GROUP BY status, age;
8.3 GROUP BY与聚合函数 #
sql
SELECT
status,
COUNT(*) AS count,
AVG(age) AS avg_age,
MAX(age) AS max_age,
MIN(age) AS min_age
FROM users
GROUP BY status;
8.4 GROUP_CONCAT #
sql
-- 将分组内的值连接成字符串
SELECT
status,
GROUP_CONCAT(name) AS names,
GROUP_CONCAT(name SEPARATOR ', ') AS names_with_separator
FROM users
GROUP BY status;
+--------+-------------------+-------------------------+
| status | names | names_with_separator |
+--------+-------------------+-------------------------+
| 0 | Bob,Charlie | Bob, Charlie |
| 1 | John,Jane,Alice | John, Jane, Alice |
+--------+-------------------+-------------------------+
九、HAVING过滤 #
9.1 HAVING与WHERE区别 #
sql
-- WHERE:过滤行,在分组前执行
SELECT status, COUNT(*) AS count
FROM users
WHERE age > 25
GROUP BY status;
-- HAVING:过滤分组,在分组后执行
SELECT status, COUNT(*) AS count
FROM users
GROUP BY status
HAVING COUNT(*) > 1;
9.2 HAVING使用聚合函数 #
sql
-- 筛选平均年龄大于25的组
SELECT status, AVG(age) AS avg_age
FROM users
GROUP BY status
HAVING AVG(age) > 25;
-- 筛选人数大于2的组
SELECT status, COUNT(*) AS count
FROM users
GROUP BY status
HAVING COUNT(*) > 2;
9.3 组合使用 #
sql
SELECT
status,
COUNT(*) AS count,
AVG(age) AS avg_age
FROM users
WHERE age >= 20
GROUP BY status
HAVING count > 1 AND avg_age > 25
ORDER BY avg_age DESC;
十、SELECT执行顺序 #
10.1 完整语法 #
sql
SELECT DISTINCT column_list
FROM table_name
JOIN another_table ON condition
WHERE row_condition
GROUP BY column_list
HAVING group_condition
ORDER BY column_list
LIMIT offset, count;
10.2 执行顺序 #
text
1. FROM → 确定数据来源
2. JOIN → 连接表
3. ON → 连接条件
4. WHERE → 过滤行
5. GROUP BY → 分组
6. HAVING → 过滤分组
7. SELECT → 选择列
8. DISTINCT → 去重
9. ORDER BY → 排序
10. LIMIT → 限制行数
10.3 示例说明 #
sql
SELECT status, COUNT(*) AS count, AVG(age) AS avg_age
FROM users
WHERE age >= 20
GROUP BY status
HAVING count > 1
ORDER BY avg_age DESC
LIMIT 2;
-- 执行顺序:
-- 1. FROM users → 获取users表数据
-- 2. WHERE age >= 20 → 过滤年龄>=20的行
-- 3. GROUP BY status → 按status分组
-- 4. HAVING count > 1 → 过滤分组
-- 5. SELECT ... → 选择列并计算聚合
-- 6. ORDER BY avg_age → 排序
-- 7. LIMIT 2 → 限制返回2条
十一、总结 #
查询要点:
| 子句 | 说明 | 示例 |
|---|---|---|
| SELECT | 选择列 | SELECT name, age |
| FROM | 指定表 | FROM users |
| WHERE | 过滤行 | WHERE age > 20 |
| GROUP BY | 分组 | GROUP BY status |
| HAVING | 过滤分组 | HAVING COUNT(*) > 1 |
| ORDER BY | 排序 | ORDER BY age DESC |
| LIMIT | 限制行数 | LIMIT 10 |
最佳实践:
- 只查询需要的列,避免SELECT *
- 使用索引优化WHERE条件
- 大表查询使用LIMIT
- 合理使用聚合函数和分组
下一步,让我们学习高级查询!
最后更新:2026-03-26