我有两个表:PostgreSQL表名或别名不指定列名
CREATE TABLE a (id INT NOT NULL);
CREATE TABLE b (id INT NOT NULL);
INSERT INTO a VALUES (1), (2);
INSERT INTO b VALUES (1);
如果我尝试从a
得到记录,其中有在b
(查询1)记录:
SELECT a.id, b FROM a LEFT JOIN b on a.id = b.id WHERE b is NOT NULL;
我得到:
id | b
----+-----
1 | (1)
如果我尝试从a
得到记录,其中有在b
(查询2)没有记录:
SELECT a.id, b FROM a LEFT JOIN b on a.id = b.id WHERE b IS NULL;
我得到:
id | b
----+---
2 |
似乎确定。
然后我改变b
:
ALTER TABLE b ADD COLUMN s TEXT NULL;
然后查询1不返回任何行,查询2点返回相同的行和
SELECT a.id, b FROM a LEFT JOIN b on a.id = b.id;
回报
id | b
----+------
1 | (1,)
2 |
我的问题是:
- 为什么Postresql允许在
WHERE
子句中使用表名或别名而不指定列名? - 什么是
(1,)
列b
产生的行? - 为什么
(1,)
在查询1和查询2中不满足IS NULL
和IS NOT NULL
?
P.S.如果我将表b
改为ALTER TABLE b ADD COLUMN s TEXT NOT NULL DEFAULT ''
,则查询1和2将返回相同的行。
感谢术语行构造函数。当我试图寻找答案时,我错过了它。请回答问题3添加说明如何测试行是否为IS NULL(所有行的值必须为NULL)和IS NOT NULL(行的所有值必须为NOT NULL)。可能对其他人有用,为两列三行的表添加示例,其中第一行具有全部空值,第二行在第一列中不为空,在第二列中不为空,第三行在两列中都不为空。 – mixel
编辑的答案包括重现和观察将行与'IS NULL'和'IS NOT NULL'进行比较的行为的步骤。 –
当所有成员都有NULL值时,行是NULL,否则它不是NULL - 这是错误的。实际上,只有当它的所有成员都没有空值时,行才是非空的。 – mixel