一、基础 SELECT 语句:数据查询的 "入口"
核心作用
从指定数据表中,提取你需要的字段 / 所有字段的记录,是无筛选、无排序的基础查询。
基本语法
sql
sql
SELECT <字段名1, 字段名2, ...>
FROM <表名>;
关键用法
- 查询指定字段 :
SELECT product_name, sale_price FROM product;(查商品名和售价) - 查询所有字段 :用
*代替字段名,SELECT * FROM product;(快速查全量,生产环境不建议频繁用,效率低) - 无 WHERE 条件时,会查询表中所有记录。
二、WHERE 子句:按条件筛选数据
核心作用
给查询加筛选条件,只提取符合条件的记录,是最常用的筛选手段。
基本语法
sql
sql
SELECT <字段名...>
FROM <表名>
WHERE <条件表达式>;
比如:查询商品类型为 "衣服" 的所有商品,SELECT * FROM product WHERE product_type = '衣服';
重点 1:WHERE 支持的运算符
文档里列出了 MySQL 所有运算符,我们挑最常用的分类记,不用死记全部:
- 比较运算符 :
=(等于)、>(大于)、>=(大于等于)、<(小于)、<=(小于等于)、!=/<>(不等于) - 逻辑运算符 :
AND(且)、OR(或)、NOT(非) - 特殊运算符 :
BETWEEN ... AND ...(在范围内)、IS NULL(为空)、IS NOT NULL(不为空)、LIKE(模糊匹配) - 算术运算符 :
+、-、*、/(可在条件中做计算)
重点 2:运算符的优先级
运算符有执行先后顺序,不用死记优先级数字,记住 2 个核心规则即可:
- 算术运算符(
*/+等)> 比较运算符(=/>等)> 逻辑运算符(AND/OR等) - 拿不准优先级,直接加括号
(),括号的优先级是最高的,这是生产环境的通用做法。
重点 3:经典示例(必掌握)
sql
sql
-- 1. 条件中做算术运算:查询利润≥500的商品(售价-进价≥500)
SELECT product_name, sale_price, purchase_price FROM product WHERE sale_price - purchase_price >= 500;
-- 2. 判断NULL:查询进价为空的商品(切记不能用=NULL)
SELECT product_name, purchase_price FROM product WHERE purchase_price IS NULL;
-- 3. 非运算:查询售价<1000的商品(等价于sale_price < 1000)
SELECT product_name, product_type, sale_price FROM product WHERE NOT sale_price >= 1000;
注意事项(必考 / 常用坑)
- 判断 NULL 不能用
=/!=,必须用IS NULL/IS NOT NULL(NULL 代表 "未知",不是一个具体值); - 不要滥用
NOT运算符,容易让语句可读性变差; - 字符串条件值要用单引号
' '包裹(比如product_type = '衣服')。
三、DISTINCT:剔除查询结果的重复行
核心作用
当查询的单个 / 多个字段存在重复值时,剔除重复,只保留唯一行。
基本语法
sql
SELECT DISTINCT <字段名...>
FROM <表名>;
示例
sql
sql
-- 未去重:查询商品类型,会显示重复的(比如衣服可能出现多次)
SELECT product_type FROM product;
-- 去重:只显示所有唯一的商品类型(衣服、办公用品、厨房用具等)
SELECT DISTINCT product_type FROM product;
注意
DISTINCT 作用于后面的所有字段 ,不是单个字段(比如DISTINCT a,b会按 a+b 的组合去重)。
四、AS:给字段 / 表起别名
核心作用
- 简化字段 / 表的名称(比如长字段名、连表查询的表名);
- 给计算字段 命名(比如
sale_price * 2); - 让查询结果的列名更易读。
基本语法
sql
sql
-- 字段起别名
SELECT <字段名1> AS <别名1>, <字段名2> AS <别名2>, 计算字段 AS <别名>
FROM <表名>;
-- 表起别名(后续连表查询用)
SELECT p.product_name FROM product AS p;
示例
sql
sql
-- 英文别名可省略AS,中文别名必须用双引号""包裹
SELECT product_id id, product_name name, purchase_price AS "进货单价", sale_price * 2 AS "售价翻倍"
FROM product;
注意
别名只是查询结果的临时名称,不会修改数据库表的原始字段 / 表名。
五、ORDER BY:对查询结果排序
核心作用
将查询结果按单个 / 多个字段 、计算值进行升序 / 降序排列,是数据展示的常用操作。
基本规则
- 升序:
ASC(默认值,可省略); - 降序:
DESC(必须显式写); - 排序字段可以是普通字段 /计算字段 /别名。
经典示例
sql
sql
-- 1. 单个字段排序:按年龄升序(默认ASC,可省略)
SELECT * FROM students ORDER BY age;
-- 2. 单个字段降序:按年龄降序
SELECT * FROM students ORDER BY age DESC;
-- 3. 多个字段排序:先按年龄降序,年龄相同则按分数升序
SELECT * FROM students ORDER BY age DESC, score ASC;
-- 4. 按计算值排序:按学生语数外总分降序
SELECT * FROM students ORDER BY (chinese + math + english) DESC;
-- 5. 按别名排序:先计算总分,再按总分别名降序
SELECT id, name, (chinese + math + english) AS total FROM students ORDER BY total DESC;
注意
ORDER BY 总是在 WHERE 筛选后执行,先筛选再排序。
六、LIMIT:限制查询结果的行数
核心作用
- 只提取前 N 条记录;
- 结合
OFFSET实现分页查询(前端展示数据的核心用法); - 常和
ORDER BY搭配,比如 "取总分最高的前 3 名"。
基本语法
sql
sql
-- 语法1:直接取前n条
SELECT <字段名...> FROM <表名> LIMIT n;
-- 语法2:跳过offset条,再取n条(offset从0开始)
SELECT <字段名...> FROM <表名> LIMIT n OFFSET offset;
经典示例
sql
sql
-- 1. 取学生表前5条记录
SELECT * FROM students LIMIT 5;
-- 2. 取第6-10条记录(跳过前5条,再取5条)
SELECT * FROM students LIMIT 5 OFFSET 5;
-- 3. 分页公式:每页显示page_num条,查第n页(核心!)
SELECT * FROM <表名> LIMIT page_num OFFSET page_num * (n-1);
-- 4. 搭配ORDER BY:取总分最高的前3名学生
SELECT id, name, (chinese + math + english) AS total FROM students ORDER BY total DESC LIMIT 3;
七、聚合函数:对数据做统计计算
核心作用
对一组值 执行计算,返回单个值 ,用于数据的统计分析,常和GROUP BY搭配使用。
5 个常用聚合函数(必掌握)
| 函数 | 作用 |
|---|---|
COUNT() |
计算行数:COUNT(*)统计总行数;COUNT(字段)统计字段非 NULL的行数 |
SUM() |
计算数值列的总和,NULL 值不参与计算 |
AVG() |
计算数值列的平均值,NULL 值不参与计算 |
MAX() |
取列的最大值,支持数值 / 日期 / 字符串(字符串按字母序) |
MIN() |
取列的最小值,支持数值 / 日期 / 字符串(字符串按字母序) |
示例
sql
sql
-- 1. COUNT:统计员工总行数;统计有工资的员工数(salary非NULL)
SELECT COUNT(*) FROM employees;
SELECT COUNT(salary) FROM employees;
-- 2. SUM/AVG:计算员工工资总和、平均工资
SELECT SUM(salary) AS total_salary, AVG(salary) AS avg_salary FROM employees;
-- 3. MAX/MIN:取最高/最低工资,取最新/最早入职时间
SELECT MAX(salary), MIN(salary), MAX(hire_date), MIN(hire_date) FROM employees;
注意
聚合函数会忽略 NULL 值 (COUNT(*)除外,它统计所有行,包括 NULL)。
八、GROUP BY:分组查询(聚合函数的 "搭档")
核心作用
将查询结果按单个 / 多个字段 进行分组,然后对每个分组单独应用聚合函数(比如 "按部门统计员工数""按商品类型计算平均售价")。
基本语法
sql
sql
SELECT 分组字段, 聚合函数(统计字段) AS 别名
FROM 表名
[WHERE 分组前筛选条件] -- 可选
GROUP BY 分组字段
[HAVING 分组后筛选条件] -- 可选
[ORDER BY 排序字段] -- 可选
关键搭配:HAVING 子句
HAVING专门用于筛选分组后的结果 ,和WHERE的核心区别是:
WHERE:分组前筛选数据,不能使用聚合函数作为条件;HAVING:分组后 筛选分组,可以使用聚合函数作为条件。
经典示例(必掌握)
sql
sql
-- 1. 基础分组:按部门统计员工数
SELECT department, COUNT(*) AS employee_count FROM employees GROUP BY department;
-- 2. 多字段分组:按部门+职位统计员工数(先按部门分,再按职位分)
SELECT department, job_title, COUNT(*) AS employee_count FROM employees GROUP BY department, job_title;
-- 3. WHERE+GROUP BY:先过滤工资>5000的员工,再按部门统计数
SELECT department, COUNT(*) AS employee_count FROM employees WHERE salary > 5000 GROUP BY department;
-- 4. GROUP BY+HAVING:按部门统计员工数,只保留员工数>10的部门
SELECT department, COUNT(*) AS employee_count FROM employees GROUP BY department HAVING COUNT(*) > 10;
-- 5. 完整组合:WHERE+GROUP BY+HAVING+ORDER BY
SELECT department, AVG(salary) AS avg_salary
FROM employees
WHERE salary > 5000 -- 分组前筛掉工资≤5000的
GROUP BY department -- 按部门分组算平均工资
HAVING AVG(salary) > 8000 -- 分组后筛掉平均工资≤8000的
ORDER BY avg_salary DESC; -- 按平均工资降序
九、SELECT 语句的执行顺序(核心重点!)
同学们,前面学的所有子句,组合在一起时不是按书写顺序执行 的,这是很多同学写复杂查询出错的根本原因,必须记住执行顺序:
- FROM:确定查询的基础表(从哪张 / 哪些表查);
- WHERE :对表中的数据做分组前的筛选;
- GROUP BY:按指定字段对筛选后的数据分组;
- 聚合函数:对每个分组执行统计计算;
- HAVING :对分组后的结果做分组后的筛选;
- ORDER BY:对最终的结果集进行排序;
- LIMIT:限制最终结果集的行数。
书写顺序参考 :SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT(记不住书写顺序没关系,按执行顺序写也能运行,重点是执行顺序)
本节课小结
今天我们学的 SQL 基础查询,是所有 SQL 操作的基础,核心可以总结为 3 类:
- 基础提取:SELECT+FROM(查什么、从哪查);
- 数据筛选:WHERE(分组前)、HAVING(分组后);
- 结果处理:DISTINCT(去重)、AS(别名)、ORDER BY(排序)、LIMIT(分页)、聚合函数 + GROUP BY(统计)