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

独立开发者系列(42)——MYSQL语句使用和进阶

绝大部分的业务逻辑,都需要和数据库进行交互,对数据库掌握是开发必不可少的基本功。这里对SQL语句进行一次概念回顾梳理。
入门级

1.增加 数据。字段对应,插入即可,基本现代的开发框架都有orm映射插入MYSQL数据表。对应tp框架里面的
db->insert方法
Db::table( ‘table_name’ ) -> insertAll( $data ); // 批量添加能大幅度提升导入效率,但是存在导入失败标记的问题。

//插入单条数据
INSERT INTO table_name (column1, column2, column3,...)VALUES (value1, value2, value3,...);
//插入多条数据INSERT INTO table_name (column1, column2, column3,...)VALUES(value1_1, value1_2, value1_3,...),(value2_1, value2_2, value2_3,...),(value3_1, value3_2, value3_3,...);

2.删除数据。如果是软删除,一般数据表额外新增一条is_del字段 是否被删除,而如果是日志类的,考虑到量非常大,基本都是实际删除。 如果是删除单条数据,直接 用id 等于即可,由于删除数据大部分都是日志类或者记录类场景,真正的用户/交易/订单数据很少使用删除逻辑。而当日志可能几百万条仔msyql里面,怕删除的时候,卡住系统,需要限定一次删除多少条日志,比如一次删除100W条日志(或者每天凌晨删除) 这个时候需要使用limit进行限定删除

DELETE FROM students WHERE age < 18 LIMIT 10;

3.修改数据 订单状态修改 之类的需要使用到。 需要注意的是,没有事物的时候,直接update是会互相串改修改结果的,典型的场景,三个用户连续点击网站,我们需要进行count,这个时候使用update直接会导致计数不准确。这个时候,如果需要一个比较准确的统计结果,需要使用insert插入,然后晚上的时候进行count。
第二个场景,就是有冲突的场景,比如用户的余额更新,用户点击了俩次,这个时候需要对余额进行更新俩次,但是因为是同时并发的,可能出现只扣款一次的情况。这个时候需要使用到CAS算法,比如一个学生购买了一瓶矿泉水点击了俩次,我们要扣除他的余额,这个时候,我们查询账户信息的时候,需要使用到id=2 + money=22 这种双重条件,消除并发同时读取到moeny =22 完成俩个订单,经过运算后更新20账户的余额场景。(这个通常意义也是乐观锁的概念)

 UPDATE students SET age = 22, name = '李四新'  WHERE id = 2; //简单的SQL语句修改
update students set money =20  where id=2 and money=22 ;//读取当前

4.查询数据,最常用也是最简单的:
SELECT * FROM students where class_id =1 ORDER BY name ASC LIMIT 10; // 读取某个班级的学生列表分页|
事物里面的相关查询: for update 有该条语句,执行事物的时候,会锁住,直到事物解锁
SELECT * FROM table_name WHERE condition FOR UPDATE;
//分组统计查询

 SELECT grade, class, COUNT(*)FROM studentsGROUP BY grade, class;

根据年级 班级统计学生的人数出来 开发里面统计基本都是用在系统后端的统计里面。
联表查询: join (join容易引起性能问题,所以需要特别注意优化)
join是分为left join inner join right join 一般我们用left join 居多,根据实际的查询

SELECT s.student_name, sc.score
FROM students s
INNER JOIN scores sc ON s.student_id = sc.student_id;

当俩张表的逻辑是关于某个字段的时候,需要使用到join。

MYSQL语句的进阶

基本复杂的部分都是查询部分,会引发很多概念。

1.数据库的慢查询检查
有的SQL语句由于涉及到的数据量比较大,在开始写的时候,只是为了尽快完成逻辑,没有考虑到相关性能问题。但是在执行的时候,非常缓慢,可能查询时间超过30秒,超过之后会被定义为慢查询。
EXPLAIN SELECT * FROM table1 WHERE column1 = 10;
通过 EXPLAIN 可以了解到以下重要内容:
select_type:查询的类型,如简单查询(SIMPLE)、连接查询(JOIN)等。
table:正在访问的表名。
type:连接类型,显示了如何查找表中的行,常见的有 ALL(全表扫描)、index(索引全扫描)、range(索引范围扫描)、
ref(非唯一索引匹配)、
eq_ref(唯一索引匹配)等。连接类型的效率从高到低通常为:system > const > eq_ref > ref > range > index > ALL 。possible_keys:可能用到的索引。
key:实际使用的索引。
key_len:索引字段的长度。
rows:预计扫描的行数。
Extra:一些额外的信息,如 Using filesort(表示需要额外的排序操作)、Using temporary(表示使用了临时表)等。

2.数据库的统计函数 having
HAVING 的作用类似于 WHERE 子句,但 WHERE 子句用于在分组之前筛选行,而 HAVING 子句用于在分组之后筛选分组:

SELECT product_id, SUM(sales_amount) as total_sales
FROM sales
GROUP BY product_id
HAVING SUM(sales_amount) > 1000;

例如统计销售金额大于1000的商品 当select里面有统计函数的时候,where是无效的,必须使用having,比如count(*)统计符合某个条件数量大于2也是如此。

3…msyql的常用函数整理 (简单编程里面最常用的函数)
COUNT(*):计算行数。 SUM(x):计算列的总和。 AVG(x):计算列的平均值。 MIN(x):返回列的最小值。 MAX(x)`:返回列的最大值

4.随机获取数据表里面的某个奖品信息返回出去 (随机读取数据表里面某一行的操作) 需要随机的时候,我们读取数据库。

SELECT id,prize
FROM prizes
ORDER BY RAND()
LIMIT 1;

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • SQL Server 2022的游标
  • 20240813在荣品RK3588S-AHD开发板的预置Android13中挂载ext4格式的256GB的TF卡
  • 【智能家居设备集成】智能家居设备的集成与互联互通
  • Revit二次开发_使用InnoSetup打包插件
  • Vue2.0 项目实战篇\部署篇
  • B3-111-A 小型挂轨式巡检机器人:智能巡检的突破之
  • MyBatis 配置与测试方式
  • 【纯干货级教程】YOLOv7如何添加注意力机制?
  • 排序算法之折半插入排序
  • 算法的学习笔记—打印从 1 到最大的 n 位数
  • SQL Server 2022的索引
  • The Sandbox 游戏制作教程第 4 章|使用装备制作游戏,触发独特互动
  • 信创教育:培养未来科技创新的生力军
  • 八、OpenCVSharp 中图像阈值处理
  • uniapp预览图片uni.previewImage图片放大
  • Google 是如何开发 Web 框架的
  • 时间复杂度分析经典问题——最大子序列和
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 2019.2.20 c++ 知识梳理
  • AHK 中 = 和 == 等比较运算符的用法
  • ECMAScript入门(七)--Module语法
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • es6--symbol
  • Java 23种设计模式 之单例模式 7种实现方式
  • Javascript 原型链
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • passportjs 源码分析
  • vue-router的history模式发布配置
  • Wamp集成环境 添加PHP的新版本
  • 翻译:Hystrix - How To Use
  • 搞机器学习要哪些技能
  • 给Prometheus造假数据的方法
  • 观察者模式实现非直接耦合
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 老板让我十分钟上手nx-admin
  • 前端性能优化--懒加载和预加载
  • 前端知识点整理(待续)
  • 删除表内多余的重复数据
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 原生 js 实现移动端 Touch 滑动反弹
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • 昨天1024程序员节,我故意写了个死循环~
  • ​configparser --- 配置文件解析器​
  • ​secrets --- 生成管理密码的安全随机数​
  • ​浅谈 Linux 中的 core dump 分析方法
  • #### go map 底层结构 ####
  • #1014 : Trie树
  • $ git push -u origin master 推送到远程库出错
  • (06)金属布线——为半导体注入生命的连接
  • (1)(1.13) SiK无线电高级配置(六)
  • (3)llvm ir转换过程
  • (算法)求1到1亿间的质数或素数
  • (五)activiti-modeler 编辑器初步优化
  • (转)Sql Server 保留几位小数的两种做法