#### B.3.4.4 列别名问题

[](<>)[](<>)[](<>)

可以在查询选择列表中使用别名来为列指定不同的名称。您可以在中使用别名`通过...分组`,`订购方式`， 要么`拥有`引用列的子句：

```
SELECT SQRT(a*b) AS root FROM tbl_name
  GROUP BY root HAVING root > 0;
SELECT id, COUNT(*) AS cnt FROM tbl_name
  GROUP BY id HAVING cnt > 0;
SELECT id AS 'Customer identity' FROM tbl_name;
```

标准 SQL 不允许在`在哪里`条款。施加此限制是因为当`在哪里`子句被评估，列值可能尚未确定。例如，以下查询是非法的：

```
SELECT id, COUNT(*) AS cnt FROM tbl_name
  WHERE cnt > 0 GROUP BY id;
```

这`在哪里`子句确定哪些行应包含在`通过...分组`子句，但它指的是列值的别名，在选择行并按`通过...分组`.

在查询的选择列表中，可以使用标识符或字符串引用字符指定带引号的列别名：

```
SELECT 1 AS `one`, 2 AS 'two';
```

在语句的其他地方，对别名的引用引用必须使用标识符引用，否则引用被视为字符串文字。例如，此语句按列中的值分组`id`, 使用别名引用`一种`：

```
SELECT id AS 'a', COUNT(*) AS cnt FROM tbl_name
  GROUP BY `a`;
```

此语句按文字字符串分组`'一种'`并且不像您预期​​的那样工作：

```
SELECT id AS 'a', COUNT(*) AS cnt FROM tbl_name
  GROUP BY 'a';
```
