在 MySQL 中,查询数据是最常见的操作之一。MySQL 提供了多种方式来查询数据,包括基础查询、条件查询、排序、分组、聚合、联接、子查询等。以下是 MySQL 查询数据的常用方法 汇总,以及具体的案例和笔记。
1. 基础查询 (SELECT)
最基础的查询方法就是 SELECT 语句,用来从数据库中检索数据。
语法:
SELECT column1, column2, ...
FROM table_name
WHERE condition;
-
column1, column2, ...:需要查询的列。 -
table_name:数据表的名称。 -
WHERE condition:用于指定查询条件(可选)。
SELECT * FROM userTable;
这个查询返回 userTable 表的所有列和所有行。
2. 条件查询 (WHERE)
条件查询可以用来限制返回的记录。常用的条件操作符包括:=, >, <, >=, <=, <>, IN, BETWEEN, LIKE 和 IS NULL。
SELECT * FROM userTable WHERE age > 30;
只返回 age 大于 30 的记录 ↑。
SELECT * FROM userTable WHERE gender = 'female' AND age <= 25;
查询 gender 为 female 且 age 小于等于 25 的记录 ↑。
SELECT * FROM userTable WHERE name LIKE '%John%';
使用 LIKE 操作符模糊查询名字包含 John 的记录 ↑。
SELECT * FROM userTable WHERE email IS NULL;
查询 email 字段为空(NULL)的记录 ↑。
3. 排序查询 (ORDER BY)
ORDER BY 用来对查询结果进行排序,默认是升序 ASC,如果需要降序排序,可以使用 DESC。
SELECT * FROM userTable ORDER BY age DESC;
按 age 降序排序 ↑。
SELECT * FROM userTable ORDER BY created_at ASC;
按 created_at 升序排序 ↑。
SELECT * FROM userTable ORDER BY name DESC, age ASC;
按 name 降序排序,age 升序排序 ↑。
4. 限制返回结果数量 (LIMIT)
LIMIT 用于限制查询返回的记录数,通常用于分页查询。
SELECT * FROM userTable LIMIT 5;
只返回前 5 条记录 ↑。
SELECT * FROM userTable LIMIT 5 OFFSET 10;
跳过前 10 条记录,返回接下来的 5 条记录 ↑。
5. 聚合函数
MySQL 提供了多种聚合函数,如 COUNT(), SUM(), AVG(), MIN(), MAX(),用来进行汇总统计。
SELECT COUNT(*) FROM userTable;
返回 userTable 表中的总记录数 ↑。
SELECT AVG(age) FROM userTable;
返回 age 字段的平均值 ↑。
SELECT MAX(age) FROM userTable;
返回 age 字段的最大值 ↑。
SELECT MIN(age) FROM userTable;
返回 age 字段的最小值 ↑。
SELECT gender, COUNT(*) FROM userTable GROUP BY gender;
按 gender 分组,统计每个性别的记录数 ↑。
6. 分组查询 (GROUP BY)
GROUP BY 用于对结果集进行分组,并常与聚合函数一起使用。
SELECT gender, COUNT(*) FROM userTable GROUP BY gender;
按 gender 字段分组,并统计每个性别的数量 ↑。
SELECT gender, AVG(age) FROM userTable GROUP BY gender;
按 gender 字段分组,计算每个性别的平均 age ↑。
SELECT age, COUNT(*) FROM userTable
GROUP BY age
HAVING COUNT(*) > 1;
按 age 字段分组,统计每个年龄的用户数量,并筛选出数量大于 1 的组 ↑。
7. 联接查询 (JOIN)
JOIN 用于联合查询多个表中的数据。常用的 JOIN 类型有 INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN(MySQL 不支持 FULL JOIN)。
SELECT u.name, d.phone FROM userTable u
INNER JOIN userDetails d ON u.id = d.user_id;
-
INNER JOIN:返回userTable和userDetails中id和user_id匹配的记录。 -
只返回有匹配的记录,如果有一方没有匹配的记录,则不返回 ↑。
SELECT u.name, d.phone FROM userTable u
LEFT JOIN userDetails d ON u.id = d.user_id;
LEFT JOIN:返回 userTable 中所有记录,以及 userDetails 中匹配的记录。没有匹配的记录,userDetails 对应的列会显示 NULL ↑。
SELECT u.name, d.phone FROM userTable u
RIGHT JOIN userDetails d ON u.id = d.user_id;
RIGHT JOIN:返回 userDetails 中所有记录,以及 userTable 中匹配的记录。没有匹配的记录,userTable 对应的列会显示 NULL ↑。
8. 子查询
子查询是嵌套在另一个查询中的查询,通常用于更复杂的查询场景。
SELECT * FROM userTable
WHERE id IN (SELECT user_id FROM userDetails WHERE phone = '1234567890');
查询 userTable 中所有 id 在子查询结果中的记录,子查询从 userDetails 表中查找 phone = '1234567890' 的记录 ↑。
SELECT name FROM userTable
WHERE age = (SELECT MAX(age) FROM userTable);
查询 userTable 中 age 等于最大年龄的用户 ↑。
9. 联合查询 (UNION)
UNION 用于将两个或多个 SELECT 查询的结果合并成一个结果集,且去除重复记录。如果你想保留重复记录,可以使用 UNION ALL。
SELECT name FROM userTable WHERE age > 30
UNION
SELECT name FROM userTable WHERE gender = 'female';
将两个查询结果合并,并去除重复的 name ↑。
SELECT name FROM userTable WHERE age > 30
UNION ALL
SELECT name FROM userTable WHERE gender = 'female';
将两个查询结果合并,并保留所有记录,包括重复的 name ↑。
10. 分页查询
分页查询通常用于显示大数据集时,只显示一部分记录。
SELECT * FROM userTable
ORDER BY created_at DESC
LIMIT 10 OFFSET 20;
查询 userTable 表,按照 created_at 降序排列,跳过前 20 条记录,返回接下来的 10 条记录 ↑。
11. DISTINCT 去重查询
DISTINCT 用于去除查询结果中的重复记录。
SELECT DISTINCT gender FROM userTable;
查询 userTable 中所有不同的 gender 值 ↑。
12. 总结
| 方法 | 说明 | 示例 |
|---|---|---|
| SELECT | 基础查询,返回表中的数据 | SELECT * FROM userTable; |
| WHERE | 添加查询条件 | SELECT * FROM userTable WHERE age > 30; |
| ORDER BY | 对查询结果进行排序 | SELECT * FROM userTable ORDER BY age DESC; |
| LIMIT | 限制返回的记录数量 | SELECT * FROM userTable LIMIT 5; |
聚合函数 (COUNT, AVG, SUM) | 计算总数、平均值、求和等 | SELECT COUNT(*) FROM userTable; |
| GROUP BY | 按某字段分组并进行汇总 | SELECT gender, COUNT(*) FROM userTable GROUP BY gender; |
| JOIN | 联接多个表,进行联合查询 | SELECT u.name, d.phone FROM userTable u INNER JOIN userDetails d ON u.id = d.user_id; |
子查询 (SUBQUERY) | 嵌套查询,用于更复杂的查询场景 | SELECT * FROM userTable WHERE age = (SELECT MAX(age) FROM userTable); |
| UNION | 合并多个查询结果 | SELECT name FROM userTable WHERE age > 30 UNION SELECT name FROM userTable WHERE gender = 'female'; |
| DISTINCT | 去除查询结果中的重复记录 | SELECT DISTINCT gender FROM userTable; |