使用 GROUP BY 子句进行分组
// 根据Group By 后面的role_main、role_assist条件进行分组,只要有一组role_main、role_assist不完全相同,就会输出一行数据,输出的数据根据 Order By 后面的 num 进行排序
SELECT COUNT(*) as num, role_main, role_assist FROM heros GROUP BY role_main, role_assist ORDER BY num DESC
每一种role_main、role_assist的不同组合都会输出一条数据,这条数据同时携带三个信息,分别是heros表中与该分组匹配的行的个数,role_main的值,role_assist的值。
![](https://img.haomeiwen.com/i3478571/45b7097d76758545.png)
子查询
子查询的应用场景:无法直接从数据表中得到查询结果的情况,我下面会举例具体说明。
子查询关键字:exists、in、some、any、all。
子查询分类:关联子查询,非关联子查询。
相应的SQL语句可以从这里下载。
SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ...
// 需求:查询 player 表中身高最高的球员
// 1.作为初学者的我最先想到的就是下面的语句,但这句语句直接报错,错误说明 "misuse of aggregate function MAX()",简单的说就是滥用了MAX函数,因为SQL中语句的执行顺序有着严格的要求,MAX作为聚集函数,不能放在Where后面
SELECT player_name, height FROM player WHERE height = MAX(height);
// 2.接着我想到了下面这句,这句话成功的返回了最高的球员信息,但注意,MAX作为聚集函数只会返回单行数据,要是表中有多个球员同时拥有最高身高,那么查询的结果只会返回其中一个。
SELECT MAX(height) , player_name FROM player;
// 3.这个时候我们就需要有一种格式,将MAX作为条件封装起来,这个格式就是子查询,下面是正确的SQL语句:
SELECT player_name, height FROM player WHERE height = (SELECT max(height) FROM player)
关联子查询,和非关联子查询的区别
非关联子查询,只需要执行一次。比如上面的例子中,max(height)只需要执行一次获取最高身高。
非关联子查询,需要主句传递条件给从句进行查询,从句需要被执行多次。
// 每次主句执行前,都会将team_id传给从句
SELECT player_name, height, team_id FROM player AS a WHERE height > (SELECT AVG(height) FROM player AS b WHERE a.team_id == b.team_id)
EXISTS、NO EXISTS关键字:关联子查询
// 使用exists查询比赛中出场的球员
SELECT player_id, team_id, player_name FROM player WHERE EXISTS (SELECT player_id FROM player_score WHERE player.player_id = player_score.player_id)
其他子查询关键字
![](https://img.haomeiwen.com/i3478571/0ce997e9f9e52fb1.png)
// 使用in查询比赛中出场的球员
SELECT player_id, team_id, player_name FROM player WHERE player_id in (SELECT player_id FROM player_score WHERE player.player_id = player_score.player_id)
上面的两句SQL得到的相同的结果,都是查询比赛中的出场队员,但exists与in的效率不同,将上面的两句SQL抽象化:
SELECT * FROM A WHERE EXIST (SELECT cc FROM B WHERE B.cc=A.cc)
SELECT * FROM A WHERE cc IN (SELECT cc FROM B)
cc列建立了索引,in是由B表建立了cc列的索引,exists表示cc列的索引由A表建立,通俗上来说,就是in扫描的是内表B,exists扫描的是外表A,上面的情况,A表比B表大,所以使用in效率会更高。
网友评论