解释SQL语​​法:选择tbl。*

时间:2015-03-24 13:02:32

标签: sql syntax subquery

我有一个我不太明白的问题:

SELECT DISTINCT TBL.*
FROM (
SELECT
     attribute1,
     attribute2,
     etc...
FROM table) TBL

我猜测TBL给结果集一个名字,但为什么在select语句中有必要以及'。'是什么?做?

4 个答案:

答案 0 :(得分:2)

.表示您正在访问表TBL的列(或所有列)(在您的情况下是子查询)

外部查询只将DISTINCT应用于内部查询的每一列

请注意,在您的情况下,嵌套查询没有多大意义,您可以像这样重写查询:

SELECT DISTINCT att1, att2, ... FROM table

另请注意,如果您不使用聚合,则查询在功能上等同于Group by:

SELECT att1, att2, ... FROM table GROUP BY att1, att2, ...

答案 1 :(得分:1)

在您的示例中,TBL.**之间没有区别,但假设您的查询类似于

 Select * from Customer 
   Inner Join Country on Country.ID = Customer.CountryID
  where Country.Code = 'UK'

这将返回两个客户和国家/地区表格中的每一列,而

 Select Customer.* from Customer 
   Inner Join Country on Country.ID = Customer.CountryID
  where Country.Code = 'UK'

只会返回customer表中的列

答案 2 :(得分:0)

同样如此:

SELECT DISTINCT TBL.*
FROM (
    SELECT
         attribute1,
         attribute2,
         etc...
    FROM (
        SELECT
            attribute1,
            attribute2,
            etc...
        FROM table
        ) TBL2
    ) TBL

有点傻,不是吗?

TBL和TBL2是仅存在"的名称。为了引用查询中的内容。我指出,无论何时你在FROM条款中提到table TBLn的表格,它基本上等同于(SELECT * FROM table) TBLn

在查询中嵌入这些表达式(也就是派生表,嵌套视图,内联视图)有很多很好的理由,但只有当你看到一个不像你所做的那样毫无意义的例子时,它们的实用价值才会变得更加明显。我到了那里。

我不知道任何需要名称的平台TBL。在某些情况下,将其排除在外是很方便的。在我的查询中,列引用中没有含糊不清,我甚至不必提及`TBL2'一点都不从这个意义上来说,我并没有"做"什么都没有。

在一个过程语言中,我可以制作一整套无意义的变量赋值(比如a1 = 42; a2 = a1; a3 = a2; a4 = a3; a5 = a4; ...),编译器可能会意识到大多数变量从未被使用过,所以它不会浪费内存或CPU在它们上循环。它基本上承认你并没有真正地做着#34;什么与他们。不要将SQL视为过程语言,但以类似的方式,SQL解析器(和优化器)将解析所有这些临时/速记名称,并找出返回查询结果的最佳方法。 / p>

答案 3 :(得分:0)

正如我所看到的那样,问题启动者仍然不明白。我相信他知道一些OOP基础知识。 假设你的OOP编程语言中有一些类的数组。让我们说它是这样的:

<classA>Array[] TBL = new classA();

课程类似于:

class classA {
 int   attribute1,
 string    attribute2,
...
}

然后假设您已经拥有该类中的数据,因此数组TBL内部包含一些元素。 如果你想从这个数组中获取一些元素,你就会做类似TBL[1].getAttribute1, TBL[1].getAttribute2....

的事情

因此,在您的问题中,您拥有在SQL世界中称为SUBQUERY的数据数组,并将其命名为“TBL”(您可以选择任何您喜欢的名称)。

(
SELECT
     attribute1,
     attribute2,
     etc...
FROM table) TBL

现在您想从此数组中获取元素。通过SQL语法,您需要指定您想要获得的确切内容。例如:TBL.attribute1,TBL.attribute2,...但是如果要显示此数组的所有元素,则只需使用*代替。 - &GT; TBL。*

现在让我们回到SUBQUERY。而不是它,你可以使用表/视图/功能。所有这些都可以使用您喜欢的任何名称命名(name = alias)。之后您可以使用此别名来更轻松地编写代码。