1

例如...

SELECT * 
  FROM ( SELECT RANK() OVER (ORDER BY stud_mark DESC) AS ranking,
                stud_id, 
                stud_name, 
                stud_mark 
           FROM tbl_student ) AS foo 
 WHERE ranking = 10

这里foo是存在的......实际上它做了什么?......

4

4 回答 4

6

在本例中,foo是一个表别名。下面是你如何使用它:

SELECT foo.* 
  FROM ( SELECT RANK() OVER (ORDER BY ts.stud_mark DESC) AS ranking,
                ts.stud_id, 
                ts.stud_name, 
                ts.stud_mark 
           FROM tbl_student ts) AS foo 
 WHERE foo.ranking = 10

如果您没有为派生表(AKA 内联视图)指定表别名,SQL Server(和 MySQL)将引发错误。

于 2010-06-01T15:55:05.813 回答
4

它只是一个别名。

别名可帮助您减少编写查询时可能需要输入的文本量。

例如这个:

SELECT customer.Name, customer.OpenDate FROM customer

可以缩短为:

SELECT c.Name, c.OpenDate FROM customer c

在您的示例中,它是一个派生表(不是物理表),现在您实际上可以说:

SELECT foo.someField 而不是 SELECT *

于 2010-06-01T15:52:59.110 回答
3

最好问一下:“ AS”后面的表达式在SQL中是什么意思?

正如乔恩所说,这是一个别名。您可以使用它代替 AS 之前的表达式。

SELECT veryverylongname AS V FROM dummy_table AS D WHERE D.V = 10

在这里,您可以看到字段的两个别名 V 和表的别名 D。

您还可以使用它来SELECT为您的示例中的完整 -statements 起别名。然后,别名将代表子查询产生的表,并将在您的SELECT-keyword 之后在子查询中指定字段。

于 2010-06-01T15:56:11.333 回答
3

它是派生查询的表别名/标识符

没有它,你会得到一个错误,因为派生表没有标识符

SELECT * FROM 
 ( SELECT RANK() OVER (ORDER BY stud_mark DESC) AS ranking, stud_id, stud_name, stud_mark FROM tbl_student )
WHERE ranking = 10
于 2010-06-01T15:52:36.320 回答