0

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

和有什么区别

SELECT * FROM "Users"

SELECT "Users".* FROM "Users"
4

5 回答 5

7

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

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

于 2013-06-02T16:21:16.903 回答
3

在你的情况下没有区别。当您从多个表中进行选择时,它会出现。* 从所有表中获取数据,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 |
+----+------------+
于 2013-06-02T16:23:24.003 回答
1

就您给出的示例而言,它们在语义方面没有区别。在性能方面,它可能太少了......只需解析两个不同长度的字符串......

但是,这仅适用于您给出的示例。在涉及多个表的查询中,可以tableName.*消除我们要从哪个表中选择所有列的表的歧义。

示例:如果您有两个表TableATableB. 假设他们有同名的列,即Name. 如果要指定要从哪个表中选择Name列。Table-name限定符有帮助。

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

这就是我能说的。

于 2013-06-02T16:22:32.103 回答
0

对于您提供的示例,唯一的区别在于语法。这两个查询的共同点是它们非常糟糕。Select *不管你怎么写都是邪恶的,会给你带来各种各样的麻烦。养成列出要包含在结果集中的列的习惯。

于 2013-06-02T17:08:54.110 回答
0

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

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

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

工作的。同时,*必须独立存在,意思是下面的

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

将是非法的。

于 2013-06-02T17:09:02.323 回答