MySQL的查询操作主要通过SELECT语句实现,既可以查询单张表的数据,也可以关联多张表获取需要的信息,是数据库使用中最核心的操作之一。

基础查询语法
最基础的查询是查询表中所有字段或者指定字段的数据,语法结构非常简单。
查询所有字段
使用星号*可以代表所有字段,查询表中全部数据:
-- 查询users表的所有数据 SELECT * FROM users;
查询指定字段
如果只需要部分字段,可以在SELECT后面列出需要的字段名,多个字段用逗号分隔:
-- 查询users表的id和name字段 SELECT id, name FROM users;
条件查询
实际使用中很少需要查询所有数据,通常会加上条件筛选符合要求的数据,使用WHERE子句来实现。
常用条件运算符
- 等于:=
- 不等于:!= 或者 <>
- 大于:>
- 小于:<
- 范围查询:BETWEEN 起始值 AND 结束值
- 集合查询:IN (值1, 值2, ...)
- 模糊查询:LIKE,配合%匹配任意多个字符,_匹配单个字符
- 空值判断:IS NULL、IS NOT NULL
条件查询示例
-- 查询年龄大于18岁的用户 SELECT id, name, age FROM users WHERE age > 18; -- 查询名字以张开头的用户 SELECT id, name FROM users WHERE name LIKE '张%'; -- 查询年龄在18到30之间的用户 SELECT id, name, age FROM users WHERE age BETWEEN 18 AND 30; -- 查询id为1、3、5的用户 SELECT id, name FROM users WHERE id IN (1, 3, 5);
排序与分页
查询到数据后,可以按照指定字段排序,也可以对结果进行分页展示。
排序查询
使用ORDER BY子句排序,ASC代表升序(默认),DESC代表降序:
-- 按照年龄升序排序查询用户 SELECT id, name, age FROM users ORDER BY age ASC; -- 按照年龄降序排序查询用户 SELECT id, name, age FROM users ORDER BY age DESC; -- 先按年龄降序,年龄相同再按id升序排序 SELECT id, name, age FROM users ORDER BY age DESC, id ASC;
分页查询
使用LIMIT子句实现分页,第一个参数是偏移量(从0开始),第二个参数是每页条数:
-- 查询第1页,每页10条数据 SELECT id, name FROM users LIMIT 0, 10; -- 查询第2页,每页10条数据 SELECT id, name FROM users LIMIT 10, 10;
分组查询
如果需要按照某个字段分组统计,可以使用GROUP BY子句,通常配合聚合函数使用。
常用聚合函数
| 函数名 | 作用 |
|---|---|
| COUNT() | 统计行数 |
| SUM() | 求和 |
| AVG() | 求平均值 |
| MAX() | 求最大值 |
| MIN() | 求最小值 |
分组查询示例
-- 统计每个部门的用户数量 SELECT department_id, COUNT(*) AS user_count FROM users GROUP BY department_id; -- 统计每个部门的平均年龄,只保留平均年龄大于25的部门 SELECT department_id, AVG(age) AS avg_age FROM users GROUP BY department_id HAVING avg_age > 25;
注意分组后的条件筛选要用HAVING子句,不能用WHERE,WHERE是在分组前筛选数据,HAVING是在分组后筛选结果。
多表关联查询
当需要的字段分布在多张表中时,就需要使用关联查询,常用的关联方式有内连接、左连接、右连接。
内连接
内连接会返回两张表中匹配关联条件的记录,语法如下:
-- 查询用户和对应的部门信息,只返回有部门的用户 SELECT u.id, u.name, d.department_name FROM users u INNER JOIN departments d ON u.department_id = d.id;
左连接
左连接会返回左表所有记录,右表没有匹配的记录则对应字段为NULL:
-- 查询所有用户和对应的部门信息,没有部门的用户也会显示 SELECT u.id, u.name, d.department_name FROM users u LEFT JOIN departments d ON u.department_id = d.id;
右连接
右连接会返回右表所有记录,左表没有匹配的记录则对应字段为NULL:
-- 查询所有部门和对应的用户,没有用户的部门也会显示 SELECT u.id, u.name, d.department_name FROM users u RIGHT JOIN departments d ON u.department_id = d.id;
查询语句执行顺序
了解查询语句的执行顺序有助于写出正确的查询逻辑,标准SELECT语句的执行顺序如下:
- FROM:确定要查询的表
- ON:关联查询的匹配条件
- JOIN:关联其他表
- WHERE:筛选行数据
- GROUP BY:分组
- HAVING:分组后筛选
- SELECT:选择要查询的字段
- DISTINCT:去重
- ORDER BY:排序
- LIMIT:分页
掌握这个执行顺序后,就能理解为什么WHERE里不能使用聚合函数,而HAVING可以,因为聚合函数是在GROUP BY之后执行的,而WHERE在GROUP BY之前。