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 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 聚合函式,回傳輸入值的標準差。