Mysql 如何解决此SQL错误:每个派生表都必须有自己的别名?

Mysql 如何解决此SQL错误:每个派生表都必须有自己的别名?,mysql,sql,database,Mysql,Sql,Database,此SQL有什么问题: SELECT dept_name, avg_salary FROM (SELECT dept_name, AVG(salary) AS avg_salary FROM instructor GROUP BY dept_name) WHERE avg_salary > 42000; 我得到这个错误: ERROR 1248 (42000): Every derived table must have its own

此SQL有什么问题:

SELECT dept_name, avg_salary
FROM    (SELECT dept_name, AVG(salary) AS avg_salary                
        FROM instructor GROUP BY dept_name)
WHERE avg_salary > 42000;
我得到这个错误:

ERROR 1248 (42000): Every derived table must have its own alias

有人帮帮我,谢谢。

在派生表后添加别名:

FROM    (SELECT dept_name, AVG(salary) AS avg_salary                
        FROM instructor GROUP BY dept_name) as tab
(SELECT dept_name, AVG(salary) AS avg_salary                
            FROM instructor GROUP BY dept_name)
尽管您可以跳过派生表并使用have:


在派生表后添加别名:

FROM    (SELECT dept_name, AVG(salary) AS avg_salary                
        FROM instructor GROUP BY dept_name) as tab
(SELECT dept_name, AVG(salary) AS avg_salary                
            FROM instructor GROUP BY dept_name)
尽管您可以跳过派生表并使用have:


错误消息准确描述了您必须执行的操作:

SELECT dept_name, avg_salary
FROM    (SELECT dept_name, AVG(salary) AS avg_salary                
        FROM instructor GROUP BY dept_name) as a
--    Add the alias HERE -------------------^^^^^
WHERE avg_salary > 42000;

如果将子查询用作数据源,则必须为其分配别名。

错误消息准确描述了您必须执行的操作:

SELECT dept_name, avg_salary
FROM    (SELECT dept_name, AVG(salary) AS avg_salary                
        FROM instructor GROUP BY dept_name) as a
--    Add the alias HERE -------------------^^^^^
WHERE avg_salary > 42000;

如果将子查询用作数据源,则必须为其分配别名。

通过添加如下别名

SELECT dept_name, avg_salary
FROM    (SELECT dept_name, AVG(salary) AS avg_salary                
        FROM instructor GROUP BY dept_name) xxx <-- Here
WHERE avg_salary > 42000;
SELECT dept_name, AVG(salary) AS avg_salary 
FROM  instructor 
GROUP BY dept_name
HAVING AVG(salary) > 42000;

通过添加如下所示的别名

SELECT dept_name, avg_salary
FROM    (SELECT dept_name, AVG(salary) AS avg_salary                
        FROM instructor GROUP BY dept_name) xxx <-- Here
WHERE avg_salary > 42000;
SELECT dept_name, AVG(salary) AS avg_salary 
FROM  instructor 
GROUP BY dept_name
HAVING AVG(salary) > 42000;

在MySQL中,用外行的话说,每个派生表:一个子查询必须有一个表别名,即使您不使用它。 只需添加一个,您就可以了:

SELECT dept_name, avg_salary
FROM   (SELECT   dept_name, AVG(salary) AS avg_salary                
        FROM     instructor 
        GROUP BY dept_name) t -- t is a table alias
WHERE avg_salary > 42000;

在MySQL中,用外行的话说,每个派生表:一个子查询必须有一个表别名,即使您不使用它。 只需添加一个,您就可以了:

SELECT dept_name, avg_salary
FROM   (SELECT   dept_name, AVG(salary) AS avg_salary                
        FROM     instructor 
        GROUP BY dept_name) t -- t is a table alias
WHERE avg_salary > 42000;

让我们将其分解,以便您了解此错误的原因以及错误消息的含义。通过这种方式,您也将了解下次收到此消息时要做什么

查询的这一部分是派生表:

FROM    (SELECT dept_name, AVG(salary) AS avg_salary                
        FROM instructor GROUP BY dept_name) as tab
(SELECT dept_name, AVG(salary) AS avg_salary                
            FROM instructor GROUP BY dept_name)
这意味着它在查询中充当一个表。为了使数据库引擎正常工作,所有表都必须有一个名称。这就是它需要您添加别名的原因

因此,您的查询变成:

SELECT a.dept_name, a.avg_salary
FROM    (SELECT dept_name, AVG(salary) AS avg_salary                
        FROM instructor GROUP BY dept_name) as a
WHERE a.avg_salary > 42000;

请注意,我在整个查询中使用了别名,而不仅仅是命名表。这是因为最佳做法是引用所有字段及其关联的表名或别名。当您只有一个表(如此表)或字段名仅存在于一个表中时,这是不必要的,但它有助于维护相信我,当您有12个表连接在一起时,您不想尝试找出字段来自哪个表,这是一个好习惯

让我们将其分解,以便您了解此错误的原因以及错误消息的含义。通过这种方式,您也将了解下次收到此消息时要做什么

查询的这一部分是派生表:

FROM    (SELECT dept_name, AVG(salary) AS avg_salary                
        FROM instructor GROUP BY dept_name) as tab
(SELECT dept_name, AVG(salary) AS avg_salary                
            FROM instructor GROUP BY dept_name)
这意味着它在查询中充当一个表。为了使数据库引擎正常工作,所有表都必须有一个名称。这就是它需要您添加别名的原因

因此,您的查询变成:

SELECT a.dept_name, a.avg_salary
FROM    (SELECT dept_name, AVG(salary) AS avg_salary                
        FROM instructor GROUP BY dept_name) as a
WHERE a.avg_salary > 42000;

请注意,我在整个查询中使用了别名,而不仅仅是命名表。这是因为最佳做法是引用所有字段及其关联的表名或别名。当您只有一个表(如此表)或字段名仅存在于一个表中时,这是不必要的,但它有助于维护相信我,当您有12个表连接在一起时,您不想尝试找出字段来自哪个表,这是一个好习惯

对于每个需要提供别名的子查询,只有别名才起作用

选择部门名称、平均工资 从中选择部门名称、平均薪资作为平均薪资 来自讲师组,按部门名称命名为samplename 其中平均工资>42000


谢谢。

对于我们需要提供别名的每个子查询,只有它才能工作

选择部门名称、平均工资 从中选择部门名称、平均薪资作为平均薪资 来自讲师组,按部门名称命名为samplename 其中平均工资>42000


谢谢。

选择子查询后添加别名读取错误消息。不要因为得到一个而放弃。和你的查询一样:选择。。。。。。从选择…从…分组方式。。。至于D在哪里。外部查询的FROM子句中的子查询称为DerivedTable。因此,对于这个表,您应该对齐alias。例如,我使用D作为派生表的别名。整个查询将是SELECT。。。从D开始,其中…在选择子查询X读取错误消息后添加别名。不要因为得到一个而放弃。和你的查询一样:选择。。。。。。从选择…从…分组方式。。。至于D在哪里。外部查询的FROM子句中的子查询称为DerivedTable。因此,对于这个表,您应该对齐alias。例如,我使用D作为派生表的别名。整个查询将是SELECT。。。从D那里。。。