select *和select table name之间的区别

时间:2013-06-02 16:18:07

标签: sql

这是关于sql语句的基本问题。

之间有什么区别
SELECT * FROM "Users"

SELECT "Users".* FROM "Users"

6 个答案:

答案 0 :(得分:7)

[TableName]。[column]通常用于在连接或复杂语句中存在两个表a并且您想要定义两个具有相同名称的列时使用的表。

最常见的用途是在连接中,对于上面的基本语句,没有区别,输出也是相同的。

答案 1 :(得分:2)

不同之处在于其中一个包含两次表名。

答案 2 :(得分:2)

在你的情况下,没有区别。当您从多个表中进行选择时,它就会出现。 *从所有表中获取数据,TABLE_NAME。* - 来自表的所有数据。假设,我们有一个包含2个表的数据库:

mysql> SELECT * FROM report;
+----+------------+
| id | date       |
+----+------------+
|  1 | 2013-05-01 |
|  2 | 2013-06-02 |
+----+------------+

mysql> SELECT * FROM sites_to_report;
+---------+-----------+---------------------+------+
| site_id | report_id | last_run            | rows |
+---------+-----------+---------------------+------+
|       1 |         1 | 2013-05-01 16:20:21 |    1 |
|       1 |         2 | 2013-05-03 16:20:21 |    1 |
|       2 |         2 | 2013-05-03 14:21:47 |    1 |
+---------+-----------+---------------------+------+

mysql> SELECT
    ->  *
    -> FROM
    ->  report
    -> INNER JOIN
    ->  sites_to_report
    -> ON
    ->  sites_to_report.report_id=report.id;
+----+------------+---------+-----------+---------------------+------+
| id | date       | site_id | report_id | last_run            | rows |
+----+------------+---------+-----------+---------------------+------+
|  1 | 2013-05-01 |       1 |         1 | 2013-05-01 16:20:21 |    1 |
|  2 | 2013-06-02 |       1 |         2 | 2013-05-03 16:20:21 |    1 |
|  2 | 2013-06-02 |       2 |         2 | 2013-05-03 14:21:47 |    1 |
+----+------------+---------+-----------+---------------------+------+

mysql> SELECT
    ->  report.*
    -> FROM
    ->  report
    -> INNER JOIN
    ->  sites_to_report
    -> ON
    ->  sites_to_report.report_id=report.id;
+----+------------+
| id | date       |
+----+------------+
|  1 | 2013-05-01 |
|  2 | 2013-06-02 |
|  2 | 2013-06-02 |
+----+------------+

答案 3 :(得分:1)

在你给出的例子的情况下,它们在语义方面没有区别。当涉及到性能时它可能太少了......只是解析了两个不同长度的字符串......

但是,只有你给出的例子才是真的。在涉及多个表的查询中tableName.*消除表中我们要从中选择所有列的表的消歧。

实施例:   如果您有两个表TableATableB。我们假设它们的列名相同,为Name。如果要指定要从哪个表中选择Name列。 Table-name限定符有帮助。

`select TableA.Name, TableB.Name where TableA.age=TableB.age`

这就是我能说的全部。

答案 4 :(得分:0)

对于您提供的示例,唯一的区别在于语法。两个查询共享的是它们真的很糟糕。 Select *无论你如何写它都是邪恶的,可以让你遇到各种各样的麻烦。养成列出要包含在结果集中的列的习惯。

答案 5 :(得分:0)

指定的特定示例将返回相同的结果并具有相同的性能。因此,在这方面没有区别。

但是,在某些SQL产品中,解释*alias.*的差异尤其会影响您可以添加到查询中的其他内容。更具体地说,在Oracle中,您可以将alias.*与作为列返回的其他表达式混合,即此

SELECT "Users".*, SomeColumn * 2 AS DoubleValue FROM "Users"

work。与此同时,*必须独立存在,这意味着以下

SELECT *, SomeColumn * 2 AS DoubleValue FROM "Users"

将是illegal