文章目录
[1.1 最简单的查询](#1.1 最简单的查询)
[1.2 条件筛选 WHERE](#1.2 条件筛选 WHERE)
[1.3 去重 DISTINCT](#1.3 去重 DISTINCT)
[1.4 排序 ORDER BY](#1.4 排序 ORDER BY)
[1.5 限制行数 LIMIT](#1.5 限制行数 LIMIT)
[1.6 聚合函数](#1.6 聚合函数)
[1.7 分组 GROUP BY](#1.7 分组 GROUP BY)
[1.8 分组后筛选 HAVING](#1.8 分组后筛选 HAVING)
[🏁 收工](#🏁 收工)
概述
上回我们讲了外键和约束------数据能存得规矩了。但存进去不是目的,怎么查出来才是每天都要干的事。
SELECT 是 MySQL 里最常用的语句,没有之一。你可能一天写八遍 SELECT * FROM xxx,但它远不止"全查"这么简单。
今天把 SELECT 的所有常用方法捋一遍------条件筛选、排序、分组,全盘托出。搞懂这些,你基本上能应付 90% 的查询需求。
1.1 最简单的查询
sql
-- 全查(小心用,数据量大时别这么干)
SELECT * FROM users;
-- 只查指定列
SELECT name, age FROM users;
-- 给列起别名(AS 可以省略)
SELECT name AS 姓名, age AS 年龄 FROM users;
1.2 条件筛选 WHERE
sql
-- 等值条件
SELECT * FROM users WHERE age = 25;
-- 不等值
SELECT * FROM users WHERE age > 25;
SELECT * FROM users WHERE age BETWEEN 20 AND 30;
-- 模糊匹配(LIKE)
SELECT * FROM users WHERE name LIKE '张%'; -- 张开头
SELECT * FROM users WHERE name LIKE '%三%'; -- 包含三
-- 空值判断(NULL 不能用 =,得用 IS)
SELECT * FROM users WHERE email IS NULL;
SELECT * FROM users WHERE email IS NOT NULL;
-- 多条件组合(AND / OR)
SELECT * FROM users WHERE age > 20 AND city = '北京';
SELECT * FROM users WHERE city = '北京' OR city = '上海';
-- 集合匹配(IN)
SELECT * FROM users WHERE city IN ('北京', '上海', '深圳');
-- 排除(NOT IN)
SELECT * FROM users WHERE city NOT IN ('北京', '上海');
1.3 去重 DISTINCT
sql
-- 查看所有不重复的城市
SELECT DISTINCT city FROM users;
-- 多列组合去重
SELECT DISTINCT city, age FROM users;
1.4 排序 ORDER BY
sql
-- 升序(ASC 默认,可以省略)
SELECT * FROM users ORDER BY age ASC;
-- 降序
SELECT * FROM users ORDER BY age DESC;
-- 多列排序(先按 age 排,再按 name 排)
SELECT * FROM users ORDER BY age DESC, name ASC;
1.5 限制行数 LIMIT
sql
-- 只取前 5 条
SELECT * FROM users LIMIT 5;
-- 分页:跳过 10 条,取 5 条(第 3 页,每页 5 条)
SELECT * FROM users LIMIT 10, 5;
-- 或者写成 OFFSET 形式
SELECT * FROM users LIMIT 5 OFFSET 10;
1.6 聚合函数
| 函数 | 作用 |
|---|---|
COUNT() |
统计行数 |
SUM() |
求和 |
AVG() |
求平均 |
MAX() |
求最大值 |
MIN() |
求最小值 |
sql
SELECT
COUNT(*) AS 总人数,
AVG(age) AS 平均年龄,
MAX(age) AS 最大年龄,
MIN(age) AS 最小年龄
FROM users;
1.7 分组 GROUP BY
sql
-- 按城市分组,统计每个城市的人数
SELECT city, COUNT(*) AS 人数
FROM users
GROUP BY city;
-- 按城市分组,计算每个城市的平均年龄
SELECT city, AVG(age) AS 平均年龄
FROM users
GROUP BY city;
1.8 分组后筛选 HAVING
WHERE 是分组前筛选,HAVING 是分组后筛选。顺序不能乱。
sql
-- 找出平均年龄大于 25 的城市
SELECT city, AVG(age) AS 平均年龄
FROM users
GROUP BY city
HAVING AVG(age) > 25;
-- 找出人数大于 5 的城市
SELECT city, COUNT(*) AS 人数
FROM users
GROUP BY city
HAVING COUNT(*) > 5;
⚠️
WHERE和HAVING的区别:WHERE管"哪些行参与分组",HAVING管"哪些组留下来"。顺序是WHERE → GROUP BY → HAVING → ORDER BY → LIMIT,写错了会报错
🏁 收工
今天把 SELECT 的所有常用方法过了一遍:
基础查询 :WHERE、LIKE、IN、ORDER BY、LIMIT
分组聚合 :GROUP BY、HAVING、COUNT、SUM、AVG