用子查询和表关联解决查询问题

86 阅读1分钟

有如下表关系,请完成对应查询
玩家表Player
ID            NAME            BIRTHDAY            SCORE            GAMEID
10011        BOB             1998-01-07            15894.86        001
10023        TOM            1989-09-08            15733.91        003
10089        LEO             1997-08-08            15633.25        001
10073        JAMES          1999-03-10            17888.29        002
10025        SMITH          1987-01-06            19331.79        003

游戏表GAME
GAMEID           GAMENAME            COMPANY            COUNTRY
001              CRAZYBIRD            NEUSOFT           CHINA
002              SUPERMARIO         RENTIANTANG        JAPAN
003             RUNNINGMAN         MIRSOFT       AMERICA    
004              DNF                 NEOPLE             KOREA

(1)查询出与JAMES玩家玩相同游戏,分数比他高的玩家信息。 (2)查询出高于自己所玩游戏平均分数的玩家信息。

解题思路: 1,捉关键词“与,相同游戏,分数比”,我们就可以展开分析,三个关键字都来自同一张表player,那就不用搭理第二张表了,直接用子查询开干 注意:第二张表就相当于来诱惑你偏离轨道的,我就是例子,因为我觉得两张表肯定是有用的,结果还真没联系,踩坑了,新手一般就有可能被迷惑住了,记住重要的四个字:仔细读题 select * from player where gameid=(select gameid from player where name='JAMES') and score>(SELECT score FROM PLAYER where name='JAMES')

2,这道题同样捉关键字“高,平均分数”,有三种思路,第一种用子查询,第二种用表关联也就是自连接,然后利用分组来,与第二张表没关 第一种 select * from player p where score > (select avg(score) from player where p.gameid=gameid)

第二种 select p.* from player p join player p1 on p.gameid=p1.gameid group by p.score,p.gameid having p.score>avg(p1.score)

第三种 SELECT p.* FROM player p,(SELECT gameid,AVG(score) avgsal FROM player GROUP BY gameid) f WHERE p.gameid = f.gameid AND score > avgsal