HomeAboutLinkArchivehi灯泡

PostgreSQL5

Database

``` SELECT url, contents FROM comments JOIN photos ON photos.id = comments.photo_id WHERE comments.user_id = photos.user_id;


### 三路连接,三路联合

我们需要来自评论和照片以及用户的信息

id |  contents          | user_id |   photo_id | id  |  url  | user_id            | id|             username     |  
2  |  Non est totam |    5       |   3            |  3   |   https://kailyn.name | 5 | Frederique_Donnelly |

SELECT url, contents,username FROM comments JOIN photos ON photo.id = comments.photo_id JOIN users ON users.id = comments.user_id AND users.id = photos.user_id


这是三种方式的联合。

SELECT title,name,rating FROM reviews JOIN books ON books.id = reviews.book_id JOIN authors ON authors.id = books.author_id AND authors.id = reviews.reviewer_id


### Grouping (分组)

记住,分组都是关于取多行并将其压缩到更少的行数。
了解分组的最好方法是真正地写出一个或两个查询。

**将多行减少到较少行。**
**通过使用“GROUP by”关键字完成**
**可视化结果是使用的关键**

SELECT user_id FROM comments GROUP BY user_id;


每当我们使用一个分组,按用户标识分组,就会出现在幕后的情况。你的数据库将查看你在此时选择的所有行,在我们的查询中,我们选择了评论表中的所有行。你的数据库将经历所有这些不同的行,它将找到用户标识列,它将尝试查找其中的所有唯一值,如果此列中的值,那么唯一值为1,2,3,5这些是此列中唯一出现的值。 在找到所有不同的唯一标识之后,你的数据库就会将这些标识中的每一个根据该用户标识,将其分配给不同的组。	

在数据库中创建的临时虚表,当我们使用用户 ID 进行分组时,在此虚构数据库内创建新的分组列。在此列中,我们将使用用户标识中的所有唯一值,以便我们可以想象

举例:
| id | contents | user_id | photo_id |
| 1  |  Non est | 1          | 5             |
| 5  |  Et sit     |  1         | 3             |

分组之后

1{
| 1  |  Non est | 1          | 5             |
| 5  |  Et sit     |  1         | 3             |
}

用户标识列中的所有值都在相应组中相互匹配,分组之后,我们只能选择分组的列,我们不允许直接选择如何红色列或我们内部的底层列原始表。

SELECT contents FROM comments GROUP BY user_id;

如果我们这样做,就会得到错误,要查看内容,它必须出现在组中,因为你必须在聚合函数中使用它。
因此,如果我们希望以任何方式处理这些底层,那么我们只能直接选择组列,只能通过聚合函数来选择它们。

**你真的想把你的数据进行分组后,你只需记住,你只能直接选择组**

### Aggregates(聚合)

**将多个值减少到一个**
**通过使用“聚合函数”完成**

通过使用聚集函数来创建聚集。

#### COUNT() SUM() AVG() MIN() MAX()

COUNT() 返回一组值中的值数
SUM() 查找一组数字的和
AVG() 查找一组数字的平均值
MIN() 返回组号中的最小值
MAX() 返回组号中的最大值

SELECT MIN(id) FROM comments;

SELECT user_id,COUNT(id) FROM comments GROUP BY user_id;

它将打印我们每个不同的用户创建的评论的数量。

SELECT user_id,COUNT(id) AS num_comments_created FROM comments GROUP BY user_id;

### 总行数

SELECT COUNT(*) FROM photos;

the end.