12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394-- 给定用户登录表,求表中每一天的"3天留存率"-- step 0 表准备,用户ID,登录时间create table cm.tb_user_logs( user_id int, visit_time datetime);insert into cm.tb_user_logs(user_id, visit_time)values(1001, '2022-10-01 08:01:23'),(1001, '2022-10-01 08:11:15'),(1002, '2022-10-01 08:22:19'),(1003, '2022-1 ...
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144-- 求占据前90%销售额的商品类型-- step0. 准备数据create table cm.tb_sale_amount( good_category int comment '商品类型ID', sale_date date comment '销售日期', amount int comme ...
引言在开发和维护MySQL数据库时,优化SQL查询语句是提高数据库性能和响应速度的关键。通过合理优化SQL查询,可以减少数据库的负载,提高查询效率,为用户提供更好的用户体验。本文将介绍常用的30种MySQL SQL查询优化方法,并通过实际案例演示它们的应用。
第一部分:基础优化方法1.使用索引索引是提高数据库查询性能的基础,通过为查询字段添加合适的索引,可以加快查询速度。在创建索引时,需要考虑查询的频率和数据的更新频率,避免过度索引或不必要的索引。
123-- 创建索引CREATE INDEX idx_column ON table_name(column_name);
2.避免使用SELECT *在查询数据时,尽量避免使用SELECT *,而是明确指定需要查询的字段。这样可以减少返回的数据量,提高查询效率。
1234567-- 不推荐 SELECT * FROM table_name; -- 推荐 SELECT column1, column2 FROM table_name;
3.使用EXPLAIN分析查询计划使用EXPLAIN命令可以分析查询的执行计划,帮 ...
SQL每日一题F1025,复杂逻辑处理123456789101112131415create table F1025(id int,num int)insert into F1025 values(1,5);insert into F1025 values(2,11);insert into F1025 values(3,0);insert into F1025 values(4,-2);insert into F1025 values(5,2);insert into F1025 values(6,9);insert into F1025 values(7,1);insert into F1025 values(8,-4);insert into F1025 values(9,-7);
– Q:要求当Num中的数据同时大于上下两行数据,返回值为“是”,– 当Num中的数据小于上下两行数据中的任何一行,返回值为“否”– 例如:11大于5,11大于0,所以11那行返回值为“是”;5小于11,所以5那行返回值为“否”
12345678910SELECT a.id ...
SQL每日一题F0215,多种方法及思路讲解123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132CREATE TABLE F0215(StuID INT,CID VARCHAR(10),Course INT) INSERT INTO F0215 VALUES(1,'001',67),(1,'002',89),(1,'003',94),(2,'001',95),(2,'002 ...
SQL每日一题F1028,关联子查询create table F1028A(aid varchar(20),bid varchar(20))insert into F1028A values (‘跑步’,’张三’);insert into F1028A values (‘游泳’,’张三’);insert into F1028A values (‘跳远’,’李四’);insert into F1028A values (‘跳高’,’王五’);
create table F1028B(aid varchar(20),bid varchar(20),cid varchar(20))insert into F1028B values (‘跑步’,’张三’,’胜利’);insert into F1028B values (‘游泳’,’张三’,’胜利’);insert into F1028B values (‘跳高’,’王五’,’胜利’);
– Q:anum表示每个人参加的项目数,bnum表示每个人在各自项目中胜利的次数,该如何写这个查询?
–解法一:SELECTISNULL(t1.bid, t2 ...
SQL每日一题(20230814)题目有如下两张表G0227A(客户表)
Id
Name
1
曹操
2
关于
3
刘备
4
张飞
G0227B(订单表)
Id
CustomerId
1
3
2
1
查询G0227B表(订单表)中找出从来没有买过商品的用户。
预计结果如下:
Id
Name
2
关于
要求:用至少四种方法求解。123456789101112131415161718create table G0814A ( Id int, Name varchar(20) ) insert into G0814A values (1,'曹操'); insert into G0814A values (2,'关羽'); insert into G0814A values (3,'刘备'); insert into G0814A values (4,'张飞'); create table G0814B( Id int, C ...
SQL每日一题F1021,while循环操作/*写一个查询语句要求求出整数1到100之间排除55后的和预计结果是4995该如何写这个查询?
要求:使用while循环*/
DECLARE @i INTDECLARE @sum INTSET @i=0SET @sum=0WHILE @i<100BEGINSET @i=@i+1IF @i=55CONTINUEELSESET @sum=@sum+@iENDPRINT @sum
1234567891011121314151617181920212223242526272829303132333435363738-- 查询连续登陆3天的用户id和登陆天数-- step1:用户登录日期去重select distinct user_id, date(visit_time) as dtfrom cm.tb_user_logs;-- step2:用row_number()计数select *, row_number() over (PARTITION by user_id order by dt) as xrankfrom (select distinct user_id, date(visit_time) as dt from cm.tb_user_logs) a;-- step3: 日期减去计数值得到差值deltaselect *, date_sub(dt, INTERVAL xrank DAY) as deltafrom (select *, row_number() over (P ...
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116-- step0 建表-- drop table cm.tb_live_logs;create table cm.tb_live_logs( live_id int, user_id int, ts datetime, type varchar(10));-- step1 插入数据insert into cm.tb_live_logs(live_id, user_id, ts, type) values(901,1001,'2022-10-01 12:00:00& ...
