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 some_columns FROM some_data_source WHERE some_condition;

備註

有關所有 SELECT 參數的摘要,請參閱 PostgresSQL 文件

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 有多個內建聚合函式,包括用於平均值的共通目的函式 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 聚合函式,回傳輸入值的標準差。