sql基础查询

一、基础 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 所有运算符,我们挑最常用的分类记,不用死记全部:

  1. 比较运算符=(等于)、>(大于)、>=(大于等于)、<(小于)、<=(小于等于)、!=/<> (不等于)
  2. 逻辑运算符AND(且)、OR(或)、NOT(非)
  3. 特殊运算符BETWEEN ... AND ...(在范围内)、IS NULL(为空)、IS NOT NULL(不为空)、LIKE(模糊匹配)
  4. 算术运算符+-*/(可在条件中做计算)

重点 2:运算符的优先级

运算符有执行先后顺序,不用死记优先级数字,记住 2 个核心规则即可:

  1. 算术运算符(*/+等)> 比较运算符(=/>等)> 逻辑运算符(AND/OR等)
  2. 拿不准优先级,直接加括号(),括号的优先级是最高的,这是生产环境的通用做法。

重点 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;

注意事项(必考 / 常用坑)

  1. 判断 NULL 不能用=/!= ,必须用IS NULL/IS NOT NULL(NULL 代表 "未知",不是一个具体值);
  2. 不要滥用NOT运算符,容易让语句可读性变差;
  3. 字符串条件值要用单引号' ' 包裹(比如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:给字段 / 表起别名

核心作用

  1. 简化字段 / 表的名称(比如长字段名、连表查询的表名);
  2. 计算字段 命名(比如sale_price * 2);
  3. 让查询结果的列名更易读。

基本语法

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:限制查询结果的行数

核心作用

  1. 只提取前 N 条记录;
  2. 结合OFFSET实现分页查询(前端展示数据的核心用法);
  3. 常和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 语句的执行顺序(核心重点!)

同学们,前面学的所有子句,组合在一起时不是按书写顺序执行 的,这是很多同学写复杂查询出错的根本原因,必须记住执行顺序

  1. FROM:确定查询的基础表(从哪张 / 哪些表查);
  2. WHERE :对表中的数据做分组前的筛选;
  3. GROUP BY:按指定字段对筛选后的数据分组;
  4. 聚合函数:对每个分组执行统计计算;
  5. HAVING :对分组后的结果做分组后的筛选;
  6. ORDER BY:对最终的结果集进行排序;
  7. LIMIT:限制最终结果集的行数。

书写顺序参考SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY → LIMIT(记不住书写顺序没关系,按执行顺序写也能运行,重点是执行顺序)

本节课小结

今天我们学的 SQL 基础查询,是所有 SQL 操作的基础,核心可以总结为 3 类:

  1. 基础提取:SELECT+FROM(查什么、从哪查);
  2. 数据筛选:WHERE(分组前)、HAVING(分组后);
  3. 结果处理:DISTINCT(去重)、AS(别名)、ORDER BY(排序)、LIMIT(分页)、聚合函数 + GROUP BY(统计)
相关推荐
这个DBA有点耶11 小时前
NULL不是空——数据库里最反直觉的设计,90%新人踩过的坑
数据库·mysql·代码规范
杉氧12 小时前
Navigation Compose 深度实践:如何优雅地串联起你的全栈 App?
android·架构·android jetpack
这个DBA有点耶13 小时前
AI写的SQL跑崩了生产库,这锅谁背?
数据库·人工智能·程序员
镜舟科技14 小时前
Databricks 再提 LTAP,AI 时代的数据底座为何重回大一统叙事?
数据库·架构·agent
Databend15 小时前
从湖仓升级为 Agent 时代的数据控制面,Snowflake 和 Databricks 有哪些布局
大数据·数据库·agent
雨白16 小时前
指针与数组的核心机制
android
ClouGence18 小时前
SQL Server CDC 能放到 Always On 备库读吗?一文讲透原理与实践
数据库·sql server
黄林晴20 小时前
Room 3.0 正式发布!包名彻底重构,KMP 成为核心主线
android·android jetpack
三少爷的鞋21 小时前
Kotlin 协程环境下的 DCL 懒加载:别把线程时代的经验直接搬过来
android
plainGeekDev21 小时前
Gson → kotlinx.serialization
android·java·kotlin