7. 简单 SQL

SQL,或“结构化查询语言”,是一种向关系数据库提问和更新数据的方式。您在创建第一个数据库时已经看到了 SQL。回想一下

SELECT postgis_full_version();

但这是一个关于数据库的问题。现在我们已经将数据加载到数据库中,让我们使用 SQL 来询问数据!例如,

“纽约市所有街区的名称是什么?”

通过单击“查询工具”按钮打开 pgAdmin 中的 SQL 查询窗口。

_images/pgadmin_05.png

然后在查询窗口中输入以下查询

SELECT name FROM nyc_neighborhoods;

并单击 **执行查询** 按钮(绿色三角形)。

_images/pgadmin_08.png

查询将运行几(毫)秒并返回 129 个结果。

_images/pgadmin_09.png

但这里到底发生了什么?为了理解,让我们从 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 聚合函数,返回输入值的标准差。