独立开发者系列(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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大梁来了

千山万水总是情,打赏一块行不行

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值