-2
Table a    Table b   result
id name    id name   id name
1  a1      1  b1     1  b1
2  a2      2  b2     2  b2
3  a3                1  b1
4  a4                2  b2
                     1  b1
                     2  b2
                     1  b1
                     2  b2

当我进行此类查询时,我有两个表 a 和 b

选择 b.* 从 a 作为 a,b 作为 b

,它有笛卡尔积但我不明白,这个语句只从表b中选择数据但是为什么

一个作为一个

改变了最终结果?IMO表a与结果无关,没有意义

4

4 回答 4

2

当您没有从 table 指定任何列时a,这是预期的行为......

SELECT a.*, b.* FROM a As a,b AS b

或更简单:

SELECT * FROM a,b

如果您寻求笛卡尔积,这可能是您想要的。

编辑 It defaults to select all columns from table a if I don't write a.*?It is by default?

,您使用SELECT b.* FROM了 ,这意味着:给我所有来自 table 的列bSELECT a.*, b.*意味着给我所有来自 table 的列ab. SELECT * FROM意味着给我所有的专栏,不管它们来自哪里......

于 2013-09-25T15:56:16.067 回答
2

因为您没有指定链接两个表的列。你期望得到什么?如果您不想让笛卡尔结果构建类似于此的查询,

SELECT b.* 
FROM a As a, b AS b
WHERE a.columnname = b.columnName
于 2013-09-25T15:56:47.387 回答
2

使用别名没有任何效果。也就是说,这两个查询是相同的:

SELECT b.* FROM a AS a, b AS b
SELECT b.* FROM a, b

现在已经不碍事了,查询的行为符合预期:为 a 的每一行输出一次 b 的行 - 即您编写了一个笛卡尔积。

您的查询没有什么神秘之处。

于 2013-09-25T16:01:04.513 回答
2

select子句不过滤行。这只是价值观的投影。行在子句中过滤where,或者在子句的on一部分中过滤join

你说的是:

  1. 获取表 a 的每一行和表 b 的每一行(from子句,产生一个笛卡尔集)
  2. (不存在)根据谓词(whereon子句)过滤这些行
  3. 在这些结果行中,仅显示来自 b 表的字段。(select条款)
于 2013-09-25T16:01:12.300 回答