PostgreSQL4
Database
SELECT contents,url
FROM photos
JOIN comments ON photos.id = comments.photo_id;
如果我们要求的是 ID 而不是 URL 中的内容,那么会发生什么?
会报错,column reference "id" is ambiguous=>列引用“ id”是不明确的
"不明确" 表示你的数据库不知道你是在说这个边栏还是说侧栏,就是那个表。 因此,如果你想要选择在联合表中列出两次或更多列的列,那么需要更明确一点,你需要放置表的名称来指定你想要的不同序列。
SELECT photos.id
FROM photos
JOIN comments ON photos.id = comments.photo_id;
如果查询两个或多个 ID不明确,可以使用 AS
SELECT comments.id AS comment_id,photos.id
FROM photos
JOIN comments ON photos.id = comments.photo_id;
除了重命名列,我们还可以使用关键字来重命名表。
SELECT comments.id AS comment_id, p.id
FROM photos AS p
JOIN comments ON p.id = comments.photo_id;
假设我们添加
INSERT INTO photos (url,user_id)
VALUES('https://banner.jpg',NULL);
SELECT url,username
FROM photos
JOIN users ON users.id = photos.user_id;
我们没有看到我们刚才补充的那张照片。我们现在只列出与我们数据库内部的用户相关的照片。 所以我们没有得到我们的照片,只有与用户相关的照片。 我们的源表中有一行与用户的行不匹配,因此,我们找不到那一行的匹配,所以我们在最后的结果中看不到它。 我们没有为用户或我们刚才添加的照片进行匹配,所以我们在这里看不到它的结果。
我们希望显示每个照片和URL,即使现在没有与他们关联的用户。
Left Outer Join 左外连接
返回左表中的所有记录以及右表中与左表匹配的记录。如果右表中没有与左表匹配的记录,则结果中的相关字段将为 NULL。
SELECT url,username
FROM photos
LEFT JOIN users ON users.id = photos.user_Id;
RIGHT Outer Join 右外连接
返回右表中的所有记录以及左表中与右表匹配的记录。如果左表中没有与右表匹配的记录,则结果中的相关字段将为 NULL。
SELECT url,username
FROM photos
RIGHT JOIN users ON users.id = photos.user_id;
Full Outer Join 全外连接
返回左表和右表中的所有记录。如果某一表中没有与另一表匹配的记录,则结果中的相关字段将为 NULL。
SELECT url,username
FROM photos
FULL JOIN users ON users.id = photos.user_id;