美文网首页
6.数据的分组、子查询

6.数据的分组、子查询

作者: LucXion | 来源:发表于2023-04-23 21:21 被阅读0次
使用 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的值。

子查询

子查询的应用场景:无法直接从数据表中得到查询结果的情况,我下面会举例具体说明。
子查询关键字: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)

其他子查询关键字

// 使用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效率会更高。

相关文章

  • MySQL03

    DQL查询语句 分页查询 分组函数 分组查询 子查询 多表连接查询 1、分页查询 当数据库中数据过多时,不能一次全...

  • MySQL 13-16章实操

    第十三章 分组数据 创建分组 过滤分组 分组和排序 第十四章 使用子查询 作为计算字段使用子查询 第十五章 联结表...

  • 关系数据库SQL之高级数据查询:去重复、组合查询、连接查询、虚拟

    前言 接上一篇关系数据库SQL之基本数据查询:子查询、分组查询、模糊查询,主要是关系型数据库基本数据查询。包括子查...

  • SQL数据查询

    关系数据库SQL之基本数据查询:子查询、分组查询、模糊查询 字数1843阅读1707评论10喜欢115 前言 上一...

  • java基础-day31-数据库2.0

    7.7 分组查询 7.8 分组过滤查询 7.9 限定查询 7.10 基本查询总结 7.11 子查询 7.11.1 ...

  • MySQL——分组函数、distinct、分组查询、连接查询、子

    MySQL——分组函数、distinct、分组查询、连接查询、子查询 一、分组函数(聚合函数)1、 会自动忽略空值...

  • Mysql学习之二 Mysql概念及安装

    一、程序员的数据库要求 基本的SQL操作、CRUD操作 多表连接查询、分组查询和子查询。 常用数据库的的单行函数。...

  • SQL 学习笔记

    SQL基础 参考书籍: 《SQL必知必会》 检索数据 过滤数据 函数 分组数据 子查询 简单联结 法一: 法二: ...

  • Sql分组后查询条数

    先看下一般的查询sql语句和分组sql语句 但是想知道分组后,一共有多少组数据怎么做呢,下面我们用子查询的方式实现...

  • SQL,从入门到熟练

    本章目录 数据库关系图 检索数据 排序数据 过滤数据 计算字段 数据处理函数 汇总数据 分组数据 子查询 联结表 ...

网友评论

      本文标题:6.数据的分组、子查询

      本文链接:https://www.haomeiwen.com/subject/faqjjdtx.html