繁体   English   中英

在mysql和oracle中按查询分组

[英]Group by query in mysql and oracle

我已经创建了一个表,并试图学习如何使用分组查询,但是它给出了奇怪的输出。

create table student(bid char(3), sname varchar(15), totfee float, feepaid float,
  feebal float, branch char(3), city char(4));


insert into student values(101,'student1',16000,8000,8000,'mat','bang');
insert into student values(102,'student2',17000,8000,9000,'mar','bang');
insert into student values(103,'student3',16000,9000,7000,'btm','bang');
insert into student values(104,'student4',12000,8000,4000,'amr','hyde');
insert into student values(105,'student5',14000,6000,8000,'mat','bang');
insert into student values(106,'student6',18000,8000,10000,'mar','bang');
insert into student values(107,'student7',16000,4000,12000,'btm','bang');
insert into student values(108,'student8',11000,2000,9000,'amr','bang');
insert into student values(109,'student9',13000,5000,8000,'btm','bang');
insert into student values(110,'student10',16000,3000,13000,'amr','hyde');

现在,我正在尝试根据分支对学生进行排序。 为此,我尝试了以下查询

在甲骨文

select * from student group by branch;

产量

错误-不是group by表达式group by

在MySQL中

输出是:

  +------+-----------+--------+---------+--------+--------+------+
  | bid  | sname     | totfee | feepaid | feebal | branch | city |
  +------+-----------+--------+---------+--------+--------+------+
  | 104  | student4  |  12000 |    8000 |   4000 | amr    | hyde |
  | 103  | student3  |  16000 |    9000 |   7000 | btm    | bang |
  | 113  | student13 |  36000 |   18000 |  18000 | mal    | bang |
  | 102  | student2  |  17000 |    8000 |   9000 | mar    | bang |
  | 101  | student1  |  16000 |    8000 |   8000 | mat    | bang |
  +------+-----------+--------+---------+--------+--------+------+

实际上,我希望所有这些都可以根据分支将所有学生分组。.那我该怎么做呢? 分组查询的实际用途是什么? 我什至尝试从像w3school和tpoint这样的网站进行引用。 但是不明白。

仅当与其他聚合函数(例如sum()或其他)一起使用时,分组依据才有意义。 这些聚合函数合并一列几行的值。 例如,sum()计算指定列的所有值的总和。 在您的示例中,这些列可能是totfee或已付费 但这会计算所有行的总和,如果您想分别计算每个分支的总和,则可以在分支列上使用group by子句。 现在,您的数据库对具有相同分支值的行计算聚合函数,并且结果包含相同数量的行,因为表中存在不同的分支值。

您不能选择未聚合且不在GROUP BY子句中的字段。 与MySQL相比,Oracle在此规则上更为严格。 MySQL仅取第一个值,但Oracle引发错误。

此外, GROUP BY用于对记录进行分组(汇总)。 要对结果进行排序,您应该使用ORDER BY

“按分支分组”将为“分支”字段返回所有不同的值。 如果要基于“分支”字段订购学生,则应使用“按分支ASC订购”(或DESC)。

正如您所说的,您要基于分支对学生进行排序 ,您可以使用“排序依据”,而不是使用“分组依据”。

select * from student order by branch;

在oracle中,您可以使用此查询来获取最终结果:

with Tab AS (SELECT min(BID) AS ID FROM STUDENT GROUP BY BRANCH)
SELECT * FROM STUDENT WHERE BID IN (SELECT ID FROM Tab);

在Oracle中,您必须在select语句中按表达式命名分组中使用的每一列,如果在select语句中使用*,则必须在表达式中命名所有列:从学生的group by中选择* s.bid,s.sname,s.totfee,s.feepaid,s.feebal,s.branch,s.city不是真正的分组,并且上面的查询等于从学生中选择*,并且没有真正进行分组。 您可以在Oracle中进行以下查询:

每个分支机构的最大托运费:

select s.branch,max(s.totfee) from student s group by s.branch  

在此查询中,oracle根据其分支对所有数据进行分组。 基于分支的分组意味着您的输出中每个分支(例如“ amr”)应该只有1条记录,通常,分支“ amr”具有3条记录,因此您应该做一些工作以删除多余的行,并且应该告诉oracle应该删除行并保留剩余的行,这是存在max(s.totfee)的原因,使用max函数,您说oracle只保留具有最大totfee的行并删除其他行,现在您可以拥有1每个分支的输出记录。

提示:如果您想暗示条件,则应使用“具有”而不是上面查询中的位置。

拥有2个以上学生的分支机构数量:

select s.branch,count(*) from student  s group by s.branch having count(*)>2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM