Java教程

关于group by常见的错误

本文主要是介绍关于group by常见的错误,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
一、把聚合键之外的列名书写在select子句中。 比如:select product_name,purchase_price,count(*) from product group by purchase_price;   运行结果会出错,出错的原因:   列名 product_name 并没有包含在group by子句中,此该列名也不能写在select子句中。   进一步解释:通过某个聚合键将表进行分组之后,一行就代表一组。例如,使用进货单价将表进行分组之后,一行就代表了一个进货单价,问题就出在这里,聚合键和商品名并不一定是一对一的   例如,进货单价是2800日元的商品有‘运动T恤’和‘菜刀’两种,但是用groop by 子句 进货单价分组 2800日元这一行应该对应那种商品名称呢?  

  题目描述:sql语句查询每个用户最近一天登录的日子,用户的名字,以及用户用的设备的名字,并且查询结果按照user的name升序排序。
select 子句中只能存在以下三种元素:常数、聚合函数、group by子句指定列(聚合键)
  所以下面这么写法错误:

复制代码
1 2 3 4 5 6 7 8 select u.name as u_n, c.name as c_n, max(l.date) as d  #列名c.name as c_n不能包含 from login as l inner join user as u on l.user_id=u.id inner join client as c on l.client_id=c.id group by u.name order by u.name asc

  解释:group by中只包含了u.name,但不包括c.name,因此c.name 不能出现在select里。

  正确的写法(多列名IN):

复制代码
1 2 3 4 5 6 7 select u.name as u_n,        c.name asc_n,        l.date from login l join user u on l.user_id=u.id              join client c on l.client_id=c.id where (l.user_id,l.date) in (select user_id,max(date) from login group by user_id) order by u_n
     另外:where语句可以多字段同时使用,   where (l.user_id,l.date) in (select user_id,max(date)  需要用户Id和日期同时满足in里的内容,即元组与元组的相等性。   二、在group by子句中写了列的别名    group by不像from,字段,表支持别名   三、在where子句中使用聚合函数   只能在having里使用聚合函数   另外having作用在group by分组查询后的结果上,不能作为筛选条件来select。   比如:

  SELECT a.date,COUNT(*)
  FROM(
  SELECT l.*,d.date 首次登录时间
  FROM login l
  LEFT JOIN(
  SELECT user_id,MIN(DATE) DATE
  FROM login
  GROUP BY user_id)d
  ON l.user_id=d.user_id) a
  GROUP BY a.date
  HAVING a.date=a.首次登录时间;

 


————————————————
版权声明:本文为CSDN博主「koding7879」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/koding7879/article/details/108985341

案例答案摘抄自牛客网MySQL刷题牛友109的答案
这篇关于关于group by常见的错误的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!