7. 简单 SQL¶
SQL,或“结构化查询语言”,是一种向关系数据库提问和更新数据的方式。您在创建第一个数据库时已经看到了 SQL。回想一下
SELECT postgis_full_version();
但这是一个关于数据库的问题。现在我们已经将数据加载到数据库中,让我们使用 SQL 来询问数据!例如,
“纽约市所有街区的名称是什么?”
通过单击“查询工具”按钮打开 pgAdmin 中的 SQL 查询窗口。
然后在查询窗口中输入以下查询
SELECT name FROM nyc_neighborhoods;
并单击 **执行查询** 按钮(绿色三角形)。
查询将运行几(毫)秒并返回 129 个结果。
但这里到底发生了什么?为了理解,让我们从 SQL 的四个“动词”开始,
SELECT
,返回查询结果中的行INSERT
,向表中添加新行UPDATE
,更改表中现有行DELETE
,从表中删除行
我们将几乎完全使用 SELECT
来使用空间函数向表提问。
7.1. SELECT 查询¶
SELECT 查询通常具有以下形式
SELECT some_columns FROM some_data_source WHERE some_condition;
注意
有关所有 SELECT
参数的摘要,请参阅 PostgresSQL 文档。
The some_columns
可以是列名,也可以是列值的函数。The some_data_source
可以是单个表,也可以是通过在键或条件上连接两个表而创建的复合表。The some_condition
是一个过滤器,用于限制要返回的行数。
“布鲁克林所有街区的名称是什么?”
我们回到我们的 nyc_neighborhoods
表,并带有一个过滤器。该表包含纽约的所有街区,但我们只想要布鲁克林的街区。
SELECT name
FROM nyc_neighborhoods
WHERE boroname = 'Brooklyn';
查询将在更短的时间内(毫秒)运行,并返回 23 个结果。
有时我们需要对查询结果应用函数。例如,
“布鲁克林所有街区名称的字母数是多少?”
幸运的是,PostgreSQL 有一个字符串长度函数,char_length(string)。
SELECT char_length(name)
FROM nyc_neighborhoods
WHERE boroname = 'Brooklyn';
通常,我们对单个行不太感兴趣,而是对所有行的统计数据感兴趣。因此,了解街区名称的长度可能不如了解名称的平均长度有趣。将多行作为输入并返回单个结果的函数称为“聚合”函数。
PostgreSQL 有一个系列的内置聚合函数,包括用于平均值的通用 avg() 和用于标准差的 stddev()。
“布鲁克林所有街区名称的字母数的平均值和标准差是多少?”
SELECT avg(char_length(name)), stddev(char_length(name))
FROM nyc_neighborhoods
WHERE boroname = 'Brooklyn';
avg | stddev
---------------------+--------------------
11.7391304347826087 | 3.9105613559407395
我们最后一个示例中的聚合函数应用于结果集中的每一行。如果我们希望摘要在整个结果集内的较小组上进行呢?为此,我们添加一个 GROUP BY
子句。聚合函数通常需要一个额外的 GROUP BY
语句,以根据一个或多个列对结果集进行分组。
“纽约市所有街区的名称平均有多少个字母?按区统计。”
SELECT boroname, avg(char_length(name)), stddev(char_length(name))
FROM nyc_neighborhoods
GROUP BY boroname;
我们在输出结果中包含了 boroname
列,以便我们确定哪个统计数据适用于哪个区。在聚合查询中,您只能输出以下列:(a)分组子句的成员,或(b)聚合函数。
boroname | avg | stddev
---------------+---------------------+--------------------
Brooklyn | 11.7391304347826087 | 3.9105613559407395
Manhattan | 11.8214285714285714 | 4.3123729948325257
The Bronx | 12.0416666666666667 | 3.6651017740975152
Queens | 11.6666666666666667 | 5.0057438272815975
Staten Island | 12.2916666666666667 | 5.2043390480959474
7.2. 函数列表¶
avg(expression): PostgreSQL 聚合函数,返回数值列的平均值。
char_length(string): PostgreSQL 字符串函数,返回字符串中的字符数。
stddev(expression): PostgreSQL 聚合函数,返回输入值的标准差。