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(统计)
相关推荐
先做个垃圾出来………2 小时前
Django vs Flask 异步视图性能对比:数据驱动的深度分析
数据库·django·flask
安卓机器2 小时前
安卓玩机自做小工具------用于ROM修改 解打包boot.img修改小工具
android
独自破碎E2 小时前
BISHI66 子数列求积
android·java·开发语言
tryCbest2 小时前
Oracle恢复已损坏定时任务(Jobs)
数据库·oracle
蒸蒸yyyyzwd2 小时前
数据库学习笔记
数据库·笔记
TDengine (老段)2 小时前
TDengine IDMP 数据可视化——富文本
大数据·数据库·物联网·ai·时序数据库·tdengine·涛思数据
_千思_2 小时前
【小白说】数据库系统概念 8
数据库
城东米粉儿2 小时前
Android Flow 笔记
android
念越2 小时前
MySQL视图详解:从概念到实践
数据库·mysql