7. mysql 学习笔记 - 查询数据

32 阅读5分钟

在 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, LIKEIS NULL

SELECT * FROM userTable WHERE age > 30;

只返回 age 大于 30 的记录 ↑。

SELECT * FROM userTable WHERE gender = 'female' AND age <= 25;

查询 genderfemaleage 小于等于 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 JOINLEFT JOINRIGHT JOINFULL JOIN(MySQL 不支持 FULL JOIN)。

SELECT u.name, d.phone FROM userTable u
INNER JOIN userDetails d ON u.id = d.user_id;
  • INNER JOIN:返回 userTableuserDetailsiduser_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);

查询 userTableage 等于最大年龄的用户 ↑。

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;