【原创】SQL语句中你可能用到的地方

【原创】SQL语句中你可能用到的地方

1、统计user表中,fpuid的长度值为28或者36的数据有多少条?

SELECT sum(case when (length(fpuid) = 36 || length(fpuid) = 28) then 1 else 0 end) as total FROM user;
SELECT sum(if ((length(fpuid) = 36 || length(fpuid) = 28),1 ,0 ) as total FROM user;

2、给时间字段统一增加时间

update order set service_end_time=DATE_ADD(service_end_time , INTERVAL 3 HOUR) where order_id =1;

3、统计user表中,fpuid值为纯数字的数据有多少条?

SELECT count(id) as total FROM user WHERE length(0+fpuid)=length(fpuid);

4、统计支付记录表 order_record中总的付费用户数量:每个用户(fpuid)有可能多次付费,也有可能在不同的游戏服中付费(fsid),也有可能在不同服务器中不同的平台(fpid)上付费,要求,同一用户在同一服务器同一平台上的多次付费行为视为一个付费用户,其他情况,则视为多个付费用户,写出对应的SQL思路?

SELECT COUNT(DISTINCT fsid,fpid,fpuid) as user_pay_total FROM order_record;  // COUNT(DISTINCT fsid,fpid,fpuid),这种唯一的统计方法是为了判断用户的唯一性

5、统计user表中每天的注册用户数量:依据是注册时间(reg_time),注册时间为时间戳,写出对应的SQL【将时间转化成日期,并进行分组统计】(更多时间函数)。

SELECT count(id) as total,FROM_UNIXTIME(reg_time,‘%Y-%m-%d’) as date FROM t_user  GROUP BY date;

6、统计order表中每天购买2次及以上的用户数量:在特定时间范围内,订单状态在2、3、4、5四个状态下视为购买。

SELECT count(1) as total from xhm_xorder where create_time >= ‘2017-07-28 00:00:00’ AND STATUS in(2,3,4,5) GROUP BY `fk_customer_id` HAVING total >= 2;

7、将user表中name字段中的所有包含blog的值,将其中的blog替换成bbs:例如将blogname、blogppy等中的blog进行替换,结果为bbsname、bbsppy等。

UPDATE `user` SET name= REPLACE ( name, ‘blog’, ‘bbs’ );

8、REPLACE INTO\INSERT INTO之间的区别?

// 附属说明replace into的用法
replace into `user` values(1,1,5,‘2017-06-02’);

REPLACE的运行与INSERT很相像。只有一点除外,如果表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具有相同的值,则在新记录被插入之前,旧记录被删除。

注意:除非表有一个PRIMARY KEY或UNIQUE索引,否则,使用一个REPLACE语句没有意义。该语句会与INSERT相同,因为没有索引被用于确定是否新行复制了其它的行。

9、SQL语句执行异常分析:

1)一条SQL语句,在数据库管理工具上能执行成功,但是在PHP程序中却执行不了,通常是更新、插入等操作,最终原因,应该是某个字段缺少默认值,所以,更新和插入没办法操作,但是查询没问题。

2)代码一致,但是测试没问题,线上有问题(添加、更新不了商品),始终查找不到问题,最终你会发现,其原因也是某个字段缺少默认值导致。

10、SQL语句中的正则使用(REGEXP),字段main_json中包含2,或者sub_json包含12或者15:

select * from cds where main_json REGEXP ‘(2)‘ OR sub_json REGEXP ‘(12|15)
11、SQL中变量的使用方法:

SELECT
@dayDate AS ‘日期’,
@dayDate := @dayDate+1 as ‘序号’,
count( DISTINCT aaa.company_id ) AS ‘公司数量’
FROM
(
SELECT DISTINCT
company_id
FROM
cc_serve_order AS cco
WHERE
DATE_FORMAT( cco.create_time, ‘%Y-%m’ )= @dayDate
GROUP BY
cco.company_id
HAVING
count( cco.id ) >= 100
) AS aaa,
( SELECT @dayDate := ‘2022-08’ ) AS u;

12、SQL语句中的子查询使用:

SELECT
cc.mm AS 月份,
cc.A AS 体检订单数量,
ROUND( cc.D, 0 ) AS 体检订单总额,
cc.B AS 商户数量,
cc.C AS 门店数量,
(SELECT (cc.B – count( DISTINCT company_id )) FROM spo WHERE pay_time < cc.end_time AND FIND_IN_SET(  company_id, cc.E ) AND `status`>1) AS 新增付费商户,
(SELECT (cc.A – count( id )) FROM spo WHERE company_id IN ( SELECT DISTINCT company_id FROM spo WHERE pay_time < cc.end_time AND FIND_IN_SET( company_id, cc.E ) AND `status`>1) AND DATE_FORMAT( pay_time, ‘%Y-%m’ ) = cc.mm AND `status`>1) AS 新增付费订单,
ROUND( cc.A / cc.C, 0 ) AS 门店月均体检单量,
ROUND( cc.D / cc.C, 0 ) AS 门店月均体检金额
FROM
(
SELECT
DATE_FORMAT( spo.pay_time, ‘%Y-%m’ ) AS mm,
DATE_FORMAT( spo.pay_time, ‘%Y-%m-01 00:00:00’ ) AS end_time,
count( spo.id ) AS A,
count(DISTINCT ( spo.company_id )) AS B,
count(DISTINCT ( spo.store_id )) AS C,
SUM( spo.pay_amount ) AS D,
GROUP_CONCAT( DISTINCT spo.company_id SEPARATOR ‘,’ ) AS E
FROM
spo
WHERE
spo.STATUS > 1
GROUP BY
mm
ORDER BY
spo.pay_time DESC
) AS cc

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据