在连接多个表和查询时将字段放在select子句中的规则具有group by子句

时间:2013-11-15 08:23:19

标签: mysql sql

我正在学习SQL加入,想清楚一个想法。 我知道所有选择列都应该出现在group by子句中。 例如,

select a, b
from table_one
group by a,b;

我想加入两个表,类似于这个 -

select table_one.a
from table_one, table_two
where table_one.id = table_two.id
group by table_two.c

问题是 - 我应该把table_two.c放在select中,因为它是在group by子句中吗?

2 个答案:

答案 0 :(得分:2)

如果您具有分析功能,则group by子句是neede。简单的例子:

select order_date, sum(orders)
from orders_table
group by order_date;

从逻辑上讲,仅对列进行分组,这些列也在select子句中。否则,您可能会为最终用户提供奇怪的数据。例如:

select order_date, sum(orders)
from orders
group by country. order_date;

这会为每个日期和国家/地区提供单独的行,但您只能在结果中看到日期。

所以简单的规则是:将所有列添加到不使用分析函数的语句组(即min(),max(),avg(),count()),并且不要使用组中的列by语句不在select子句中。 加入时不会改变。分组完全独立于连接。唯一重要的是,你使用哪些列。

答案 1 :(得分:1)

加入表格时,您可以使用JOIN - 语句代替

查询示例:

SELECT t1.a
FROM table_one t1 /*(t1 is the alias for the table)*/
INNER JOIN table_two t2 ON t1.id = t2.id
GROUP BY t2.c

如果您没有在结果中特别想要它,则无需将t2.c放在您的选择中。由于您只选择t1.a,这就是您要获得的全部内容。

关于GROUP BY的SO的另一个答案值得一读。 :) https://stackoverflow.com/a/1591976/1025823