2013-06-02 42 views
0

这是关于sql语句的基本问题。select *和select表名的区别

是什么

SELECT * FROM "Users" 

SELECT "Users".* FROM "Users" 
+2

在发布之前,您是否尝试过独立研究?这似乎是您可以通过快速Google搜索找到合理答案的那种问题。 –

+0

尝试查看执行计划以查看是否有差异。 – harpo

回答

1

的差异之间的区别是,他们中的一个包含表名的两倍。

+0

你的意思是性能或其他方面没有区别? –

+0

我的意思是说,除了其中一个重复表名外,对于所有意图和目的而言,没有区别。 – Oded

+0

@JohnnyCash啊你应该问这个问题是具体的 – pinkpanther

6

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

虽然最常见的用法是在一个连接中,但对于一个基本的语句,比如上面的那个,没有区别,输出也是一样的。

1

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

但是,这只适用于你给出的例子。在涉及多个表的查询中,tableName.*消除了我们希望从哪个表中选择所有列的表。

示例: 如果您有两张表TableATableB。假设他们具有相同名称的列Name。如果要指定要从哪个表中选择Name列。 Table-name限定词有帮助。

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

这就是我所能说的。

+0

这是不正确的,但只在上述例子中。只要涉及多个表格,就会出现语义差异。 – cproinger

+0

@cproinger我的答案是针对他提供的实例...问题太短,我的答案也是这样......但这就是我想要的,他想知道使用'*'和'table是否有区别。 *'不超过,我想.... – pinkpanther

+0

@cproinger看到有一个upded,Oded的回答他做得太笼统了.... – pinkpanther

2

在你的情况下没有区别。它出现了,当你从多个表中选择。 *从所有表格TABLE_NAME获取数据。* - 来自这个表格的所有数据。假设,我们有一个包含两个表的数据库:

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 | 
+----+------------+ 
0

对于您提供的示例,唯一不同之处在于语法。这两个问题的共同之处在于它们确实很糟糕。无论你如何写它,都可能会造成各种麻烦。养成列出你想要包含在结果集中的列的习惯。

0

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

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

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

work。与此同时,*必须站在自己的,这意味着以下

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

illegal

相关问题