2-3 MySQL-使用自连接的方法实现行转列
select a.`user_name`,kills from user1 a join user_kills b on a.id=b.user_id; select a.`user_name`,sum(kills) from user1 a join user_kills b on a.id=b.user_id group by a.user_name; select a.`user_name`,sum(kills) from user1 a join user_kills b on a.id=b.user_id group by a.user_name='孙悟空'; select * from ( select sum(kills) as '孙悟空' from user1 a join user_kills b on a.id=b.user_id group by a.user_name='孙悟空'; ) a cross join ( select sum(kills) as '猪八戒' from user1 a join user_kills b on a.id=b.user_id group by a.user_name='猪八戒'; ) b cross join ( select sum(kills) as '沙僧' from user1 a join user_kills b on a.id=b.user_id group by a.user_name='沙僧'; ) c
SELECT * FROM (SELECT sum(kills) as '沙僧' FROM user1 a JOIN user_kills b ON a.id=b.user_id and a.user_name='沙僧') a cross JOIN (SELECT sum(kills) as '猪八戒' FROM user1 a JOIN user_kills b ON a.id=b.user_id and a.user_name='猪八戒') b CROSS JOIN (SELECT sum(kills) as '孙悟空' FROM user1 a JOIN user_kills b ON a.id=b.user_id and a.user_name='孙悟空') c
使用自连接的方法实现行转列
随着用户增多,出现的缺点如下:
1)、要修改sql,增加复杂性,
2)、增加join连接次数,
3)、查询效率低
行转列,用到了笛卡尔积
行转列语法-cross join
行列转换,as, cross join
方法一:使用cross join来实现行转列
crooss join 行转列
cross join:笛卡尔积
缺点:随着用户的增加、连接次数增加,查询效率不高
select * from xxx cross join yyy;
行转列:cross join
SELECT *FROM ( SELECT SUM(kills) AS 'a' FROM a INNER JOIN b ON a.name=b.user_name WHERE a.name='a') AS a;CROSS JOIN( SELECT SUM(kills) AS 'b' FROM a INNER JOIN b ON a.name=b.user_name WHERE a.name='b') AS b;CROSS JOIN( SELECT SUM(kills) AS 'c' FROM a INNER JOIN b ON a.name=b.user_name WHERE a.name='c') AS c;
mysql cross join 实现行转列
select a.'user_name',sum(kills) from user1 a join user_kills b on a.id=b.userId groub by a.user_name
select a.'user_name',kills from user1 a join user_kills b on a.id=b.userId
@MySQL---使用自连接实现行转列
1.比如成绩
分别查询出不同同学的成绩,并将字段名改为同学的名字。
通过交叉连接,将不同的语句连接起来。
SELECT * FROM ( SELECT SUM(kills) AS 'a' FROM a INNER JOIN b ON a.name=b.user_name WHERE a.name='a') AS a; CROSS JOIN( SELECT SUM(kills) AS 'b' FROM a INNER JOIN b ON a.name=b.user_name WHERE a.name='b') AS b; CROSS JOIN( SELECT SUM(kills) AS 'c' FROM a INNER JOIN b ON a.name=b.user_name WHERE a.name='c') AS c;
2.缺点:是将原来查询的结果每一行单独查询出来,再进行拼接。
因此每增加一个同学就增加一个SELECT语句。并且是通过交叉连接,
要保证每个查询的结果只能是一个,不然没办法通过交叉连接实现转换。
cross join 行转列
最后的行列转换在oracle中没有实现