当前位置: 首页 > news >正文

6. MySQL基本查询

1. 表的增删改查

Create(创建), Retrieve(读取), Update(更新), Delete(删除)

2. Create & Insert

语法: insert [info] table_name () values ()

2.1. 案例: 创建一个学生表

指定列单行插入, 如果values前省略, 则默认是全属性插入多行指定列插入, 中间分隔符为','

3. 插入替换

3.1. on duplicate: 语句1 on duplicate 语句2

insert into students values () on duplicate key update sn=132,name='xuyou',qq='111'
执行逻辑: 如果语句1插入失败, 则执行语句2, 语句2执行失败, 则报错
现象:
  • 1 row affected: 表中没有冲突数据, 数据被插入
  • 2 row affected: 表中存在冲突数据, 数据被更新
  • 0 row affected: 表中有冲突数据, 且冲突数据的值和update的值相等(update执行失败)

3.2. replace: replace 语句1

执行逻辑: 主键 or 唯一键 没有冲突, 则直接插入; 主键 or 唯一键 存在冲突, 则删除后再插入
现象:
  • 1 row affected: 表中没有冲突数据, 数据被插入
  • 2 row affected: 表中存在冲突数据, 删除后重新插入

4. 基本select指令(查询)

4.1. 全列查询

举例: select * from table_name
可能会影响到索引的使用, 效率比较低
  • 指定一/多列查询 select id, math from table_name
  • select 后可以跟表达式 select math+chinese+english from table_name(计算总成绩)
  • select 可以对表达式重命名 select math+chinese+english as(可省略) total from table_name(计算总成绩)
  • select 支持去重 select distinct math from table_name

5. where子句 判断条件(过滤条件)

语法符号:
  • >, >=, <, <=
  • = 注: null不安全
  • <=>注: null安全
  • != 注: null不安全
  • <>
  • between a0 and a1 范围匹配
  • in (option...)
  • is null
  • is not null
  • like(% _) 模糊匹配
  • and or not

5.1. 知识点: select * from table_name where 语句的执行顺序(⭐⭐⭐)

  • 明确从哪个数据表中拿数据 from table_name
  • 其次看要筛选哪些条件 where 语句
  • 最后进行显示 select *

5.2. 案例

  • 案例1: 找出成绩单中英语不及格(<60)的人的姓名 以及 对应的英语成绩
  • 案例2: 语文成绩在[80, 90]区间的同学的姓名 + 对应的语文成绩
  • 案例3: 数学成绩在58 || 59 || 98 || 99分的同学姓名 + 成绩
  • 案例4: 找一下成绩单中姓孙的同学
  • 案例5: 语文成绩好于英语成绩的同学
  • 案例6: 总分在200分以下的同学
  • 案例7: 语文成绩>80分 并且 不姓孙的同学
  • 案例8: 孙某同学,否则要求总成绩>200 并且 语文成绩<数学成绩 并且 英语成绩>80
  • 案例9: null的查询
  • name is null
  • "" 与 null区分
  • 查询不为空

6. order by子句(排序指令)

语法: select ... from table_name where ... order by column (asc/desc);
  • asc 升序(默认)
  • desc 降序

6.1. 执行顺序: select ... from table_name where ... order by ...

  • FROM:先确定表的来源,并且进行表连接操作(要是有多个表的话)。
  • WHERE:对 FROM 子句产生的记录进行过滤,筛选出符合条件的记录。
  • GROUP BY:按照指定的列对记录进行分组。
  • HAVING:对分组后的结果进行过滤。
  • SELECT:从符合条件的记录中选择需要返回的列。
  • ORDER BY:对查询结果按照指定的列进行排序。
  • LIMIT/OFFSET:限制返回记录的数量或者跳过前面的若干条记录。

6.2. 案例

  • 案例1: 同学及数学成绩, 按照升序显示
  • 案例2: 同学以及qq号进行排序
  • 案例3: 依次查询同学们的各科成绩, 如果有相等的, 按照数学降序, 语文降序, 英语升序的排序进行类推排序显示
  • 案例4: 查询同学的总分, 从高到低查询显示
  • 案例5: 查询姓孙或姓曹的同学, 结果按照数学成绩从高到低进行显示(降序)

7. limit 子句(显示分页)

语法: limit offset_rows(default: 0) rows; || limit rows offset offset_rows;limit的本质是控制最后的显示, 前面经过筛选条件判断的数据要显示什么
建议: 对未知表进行查询时, 最好加一条limit 10, 避免因为表中数据过大造成数据库卡死.
应用: 网站过长文章分页显示.

8. update

语法: update table_name set column = exp where ...(一般是加条件筛选的!) order by ... limit ...

8.1. 案例

  • 案例1: 把孙悟空同学的数学成绩变更为80分
  • 案例2: 将曹孟德同学的数学成绩变更为60分, 语文成绩变更为70分
  • 案例3: 将总成绩倒数前三的三位同学, 数学成绩 += 30分
  • 确定目标表:明确要更新的表是 student。
  • 生成待更新记录集合:对 student 表的所有记录按 math + chinese + english 的总分升序排序,取前 3 条记录形成临时待更新集合。
  • 执行更新操作:对临时集合中的每条记录,将其 math 列的值增加 30。
  • 要点:
    • 排序与限制的作用:ORDER BY 和 LIMIT 这两个子句是在确定最终要更新哪些记录时发挥作用的,而不是在更新操作执行之后才起作用。
    • 更新的原子性:一旦确定了要更新的 3 条记录,更新操作就会按照这 3 条记录原本的顺序依次执行。即便在更新过程中某些记录的总分发生了变化,也不会影响后续其他记录的更新。
    • 与 SELECT 执行顺序的差异:UPDATE 语句不存在 SELECT 语句里那种先投影列(SELECT 子句)再排序的过程。在 UPDATE 中,排序是直接基于原始表的数据进行的。
  • 案例4: 将所有同学的语文成绩更新为原来的两倍
  • 没有筛选条件的时候, 直接是做整表的更新

9. delete

语法: delete from table_name where ... order by ... limit ...

9.1. 案例

  • 案例1: 删除孙悟空的考试成绩
  • 案例2: 删除班级里总成绩倒数第一的人
  • 案例3: 删除整张表(内容)
      • delete from test_table(删除整表)
  • truncate
  • 只能对整表使用, 不能像delete一样针对部分数据操作
  • 实际上mysql不对数据操作, 所以比delete更快, 但是在删除数据的时候不经过真正的事务, 因此不能回滚.
  • 会重置 auto_increment

10. 去重表数据

distinct作用: 删除表中的重复记录, 重复的数据只会存在一份.

11. 聚合统计

函数:
  • COUNT([DISTINCT] expr) 返回查询到的数据的 数量
  • SUM([DISTINCT] expr) 返回查询到的数据的 总和,不是数字没有意义
  • AVG([DISTINCT] expr) 返回查询到的数据的 平均值,不是数字没有意义
  • MAX([DISTINCT] expr) 返回查询到的数据的 最大值,不是数字没有意义
  • MIN([DISTINCT] expr) 返回查询到的数据的 最小值,不是数字没有意义

11.1. 案例:

  • 案例1: 统计班级共有多少同学 (注: 使用表达式统计随便写一个数字也可以)
  • 案例2: 统计班级收集的 qq 号有多少
  • 案例3: 统计本次考试的数学成绩分数个数
  • 案例4: 统计数学成绩总分
  • 案例5: 统计平均总分
  • 案例6: 返回英语最高分
  • 不同的数据类型无法聚合
  • 案例7: 返回 > 70 分以上的数学最低分

12. 分组聚合统计

分组的目的: 方便聚合统计

12.1. 案例:

  • 案例1: 如何显示每个部门的平均工资和最高工资
  • 案例2: 显示每个部门的每种岗位的平均工资和最低工资
  • 案例3: 显示平均工资低于2000的部门和它的平均工资
  • 统计各个部门的平均工资
  • having和group by配合使用,对group by结果进行过滤

相关文章:

  • 如何安装并使用RustDesk
  • 【BUG解决】关于BigDecimal与0的比较问题
  • MySQL 表的内连和外连
  • RAG-Gym:一个用于优化带过程监督的代理型RAG的统一框架
  • 关于Dify聊天对话名称无法自动生成的原因和解决方法
  • java的纪录类--Record类
  • Elasticsearch中的自定义分析器(Custom Analyzer)介绍
  • JavaScript基础:运算符
  • 使用cephadm离线部署reef 18版并配置对接openstack
  • 使用Prometheus实现微服务架构的全面监控
  • Java Stream 高级实战:并行流、自定义收集器与性能优化
  • 2025.6.4总结
  • Python Day43
  • linux_centos7.x的ifconfig命令显示内容详解
  • Vehicle HAL(4)--vhal 的属性如何配置?
  • 泰迪杯特等奖案例深度解析:基于量子启发优化与多尺度时空建模的港口物流智能调度系统
  • unix/linux,sudo,其内部结构机制
  • 分布式训练下的多进程环境
  • 无人机光纤FC接口模块技术分析
  • winform下DevExpress中datagridview中数据批量保存不上
  • 信息门户网站制作/百度秒收录技术
  • asp个人网站建设/小广告图片
  • 5151ppt网站建设/产品免费推广网站有哪些
  • 网站建设市场/做百度推广的网络公司
  • 兰州金建工程建设监理网站/外国黄冈网站推广平台
  • 寮步网站制作/目前搜索引擎排名