这是关于 sql 语句的基本问题。
和有什么区别
SELECT * FROM "Users"
和
SELECT "Users".* FROM "Users"
[TableName].[column] 通常用于在连接或复杂语句中存在两个表时确定您希望使用的表,并且您想要定义在两个具有相同名称的列中使用哪一列。
虽然它最常见的用途是在连接中,但对于上面的基本语句没有区别,输出将是相同的。
在你的情况下没有区别。当您从多个表中进行选择时,它会出现。* 从所有表中获取数据,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 |
+----+------------+
就您给出的示例而言,它们在语义方面没有区别。在性能方面,它可能太少了......只需解析两个不同长度的字符串......
但是,这仅适用于您给出的示例。在涉及多个表的查询中,可以tableName.*
消除我们要从哪个表中选择所有列的表的歧义。
示例:如果您有两个表TableA
和TableB
. 假设他们有同名的列,即Name
. 如果要指定要从哪个表中选择Name
列。Table-name
限定符有帮助。
`select TableA.Name, TableB.Name where TableA.age=TableB.age`
这就是我能说的。
对于您提供的示例,唯一的区别在于语法。这两个查询的共同点是它们非常糟糕。Select *
不管你怎么写都是邪恶的,会给你带来各种各样的麻烦。养成列出要包含在结果集中的列的习惯。
指定的特定示例将返回相同的结果并具有相同的性能。因此,在这方面没有区别。
但是,在某些 SQL 产品中,解释上的差异*
会alias.*
产生影响,特别是在您可以添加到查询中的其他内容上。更具体地说,在 Oracle 中,您可以将 analias.*
与作为列返回的其他表达式混合,即
SELECT "Users".*, SomeColumn * 2 AS DoubleValue FROM "Users"
会工作的。同时,*
必须独立存在,意思是下面的
SELECT *, SomeColumn * 2 AS DoubleValue FROM "Users"
将是非法的。