7. 简单SQL¶
SQL,或称为"结构化查询语言",是一种用于查询和更新关系数据库中数据的方法。我们在创建第一个数据库时已经见过 SQL。回想一下:
SELECT postgis_full_version();
但那是关于数据库的问题。现在我们已经将数据加载到我们的数据库中,让我们使用SQL来查询数据!例如,
“纽约市所有社区的名称是什么?”
点击"Query Tool"按钮,在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文档<http://www.postgresql.org/docs/current/interactive/sql-select.html>`_。
some_columns
可以是列名或列值的函数。 some_data_source
可以是单个表,也可以是通过在关键列上或根据条件连接两个表创建的复合表。 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有一系列内置的聚合函数,包括用于计算平均值的通用函数:command:avg(),以及用于计算标准差的函数:command: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``列,这样我们就可以确定哪个统计数据适用于哪个行政区。在聚合查询中,您只能输出属于分组子句的列或聚合函数。
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聚合函数,返回输入值的标准差。