SQL(1) 查找二度好友(mysql)、累积求和、每个班级的及格率

1、查找二度好友(mysql)

好友的好友
(1)自己的好友的好友
(2)不包括自己的好友
(3)好友的好友不包括自己

DROP TABLE IF EXISTS FRIEND;
CREATE TABLE friend(
    uid              BIGINT NOT NULL COMMENT '用户标识',
    friend_uid       BIGINT NOT NULL COMMENT '申请加为好友的用户标识',
    sys_create_date  DATETIME NOT NULL COMMENT '申请时间',
    sys_last_update  DATETIME NOT NULL COMMENT '更新时间',
    state            TINYINT NOT NULL COMMENT '好友状态 0 : 删除, 1:申请好友, 2 : 好友',
    PRIMARY KEY(uid, friend_uid)
)ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT '好友表';


SELECT friend_uid 
FROM friend 
WHERE state=2 AND uid IN (SELECT friend_uid 
                          FROM friend 
                          WHERE uid=13 AND state=2) # 好友的好友,不包括申请好友
       AND friend_uid NOT IN (SELECT friend_uid 
                              FROM friend 
                              WHERE uid=13 )  # 不包括一度好友
       AND friend_uid != 13   # 好友的好友不包括自己
LIMIT 6 # limit n,m 表示返回的记录数(n+1,n+m),m=-1 到末尾,n=0时可以省略。

2、实现累积求和

在这里插入图片描述

# 简单的方法
set @csum := 0;
select 日期, 净利润, (@csum := @csum + 净利润 ) as 累积利润
from lirun_table;

# 复杂的方法
select 日期,(select sum(利润) from lirun_table ss where ss.日期<= tt.日期) as 累积利润 
from lirun_table tt
group by 日期;

SELECT a.日期,a.利润,SUM(lt.利润)  AS cum
FROM lirun_table a 
JOIN lirun_table lt 
ON a.日期 >= lt.日期
GROUP BY a.日期;

# 累积减
ALTER TABLE lirun_table ADD id INT;
alter table lirun_table modify id int auto_increment primary key;

select a.id,a.日期,a.净利润,b.净利润,IFNULL(a.净利润-b.净利润,a.净利润) as cum
from lirun_table a
left join lirun_table b
on a.id = b.id+1
group by a.id;

在这里插入图片描述

3、求每个班级的及格率

假设有一个分数表 TScore,包含班级,学号,平均分这3个字段(class, no, score)
现在想求每个班级的及格率(>=60人数/总人数*100)

select Total.class, CONCAT(ROUND(Hit.num / Total.num * 100,2),'%') as pass_rate
from (select class, count(1) as num 
      from TScore 
      group by class) Total
left join (select class, count(1) as num 
			from TScore 
			where score >= 60 
			group by class) Hit
on Total.class = Hit.class

版权声明:本文为weixin_41725746原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。