在 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; |