当前位置: 首页 > 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 students
   GROUP 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;

相关文章:

  • Pod的调度机制
  • 详解Xilinx FPGA高速串行收发器GTX/GTP(11)--详解GTX的示例工程
  • 记录一次绕过 Android 服务端的证书校验的详细过程
  • PyTorch深度学习实战(10)—— 神经网络工具箱nn.Module
  • 二叉树------最小堆,最大堆。
  • 杂项复现-中间件
  • 秃姐学AI系列之:PyTorch模型构造 | 参数管理 | 自定义层 | 读写文件
  • Java反射机制深度解析与实践应用
  • Electron-builder 打包
  • Unity教程(十)Tile Palette搭建平台关卡
  • ISP代理与双ISP代理的区别
  • 斯坦福UE4 C++课学习补充19:黑洞技能
  • 【TabBar嵌套Navigation案例-按钮交换图片和文字的位置-分类 Objective-C语言】
  • Linux服务器监控实战:使用Prometheus与Grafana
  • React 中的useRef 和 useTransition
  • 实战经验分享:如何申诉并成功解封谷歌开发者账号?
  • vim中跳转头文件
  • 如何设置 Visual Studio Code 的滚轮缩放功能
  • 算法定制与双光谱技术融合:提升巡检车入侵检测系统效能
  • WebAssembly最详教程
  • https://app.hackthebox.com/machines/Inject
  • Spring —— Spring简单的读取和存储对象 Ⅱ
  • 渗透测试之冰蝎实战
  • Mybatis、TKMybatis对比
  • Microsoft Office 2019(2022年10月批量许可版)图文教程
  • 《谷粒商城基础篇》分布式基础环境搭建
  • 哈希表题目:砖墙
  • Vue 3.0 选项 生命周期钩子
  • 【车载嵌入式开发】AutoSar架构入门介绍篇
  • 【计算机视觉 | 目标检测】DETR风格的目标检测框架解读