聚合键以外的列名不能在select 子句出现 啥意思 举代码例子
时间: 2024-03-17 18:44:20 浏览: 38
假设有一个学生考试成绩表格,有学生姓名、学科、成绩三个字段,数据如下:
| 姓名 | 学科 | 成绩 |
| --- | --- | --- |
| 小明 | 语文 | 80 |
| 小明 | 数学 | 90 |
| 小红 | 语文 | 85 |
| 小红 | 数学 | 95 |
如果要查询每个学生的总成绩和平均成绩,可以使用以下SQL语句:
```
SELECT 姓名, SUM(成绩) AS 总成绩, AVG(成绩) AS 平均成绩
FROM 成绩表格
GROUP BY 姓名;
```
这样可以得到每个学生的总成绩和平均成绩,但是如果在SELECT语句中还添加了学科这一列,如下所示:
```
SELECT 姓名, 学科, SUM(成绩) AS 总成绩, AVG(成绩) AS 平均成绩
FROM 成绩表格
GROUP BY 姓名;
```
就会出现错误提示"学科"不能在SELECT语句中出现,因为它不是聚合键。正确的做法是使用子查询等方式来实现:
```
SELECT t1.姓名, t1.学科, t2.总成绩, t2.平均成绩
FROM 成绩表格 t1
INNER JOIN (
SELECT 姓名, SUM(成绩) AS 总成绩, AVG(成绩) AS 平均成绩
FROM 成绩表格
GROUP BY 姓名
) t2
ON t1.姓名 = t2.姓名;
```
这样就可以在结果中显示学科这一列了。
相关问题
sql server 没有包含在聚合函数或 GROUP BY 子句中的字段 不能查询显示吗
在使用 GROUP BY 子句时,如果你在 SELECT 子句中使用了未包含在聚合函数中的字段,SQL Server 将会返回错误信息。
这是因为当你使用 GROUP BY 子句时,SQL Server 要求你的 SELECT 子句中只能包含被聚合函数包含或在 GROUP BY 子句中出现的字段。
如果你想要在 SELECT 子句中显示未包含在聚合函数或 GROUP BY 子句中的字段,可以使用聚合函数中的 GROUP BY 子句中的字段来创建子查询,然后在外部查询中将这些字段加入到 SELECT 子句中。例如:
```
SELECT t1.column_name1, t1.column_name2, t1.column_to_merge, t2.column_name3
FROM table_name t1
INNER JOIN (
SELECT column_name1, column_name3
FROM table_name
GROUP BY column_name1, column_name3
) t2 ON t1.column_name1 = t2.column_name1 AND t1.column_name3 = t2.column_name3;
```
在这个例子中,`column_name1`、`column_name2`、`column_to_merge` 和 `column_name3` 都是你的表中的列名,`table_name` 是你的表名。在子查询中,你使用 GROUP BY 子句来指定 `column_name1` 和 `column_name3` 字段,然后在外部查询中将这些字段添加到 SELECT 子句中。
select里的列名称和group by列名
在使用 GROUP BY 语句进行分组聚合时,SELECT 语句中的列名称应该与 GROUP BY 子句中的列名一致。也就是说,如果你想要按照某个列进行分组聚合,那么这个列名需要同时出现在 SELECT 和 GROUP BY 语句中。
举个例子,假设有一个表格包含以下列:id、name、age、gender、salary。如果你想要按照性别进行分组聚合,并计算每个性别的平均工资,则可以使用如下 SQL 语句:
```
SELECT gender, AVG(salary)
FROM table_name
GROUP BY gender;
```
在这个例子中,SELECT 语句中的列是 gender 和 AVG(salary),它们都需要在 GROUP BY 语句中出现。具体来说,gender 列用于分组,AVG(salary) 列用于计算平均工资。
阅读全文