PostGIS教程六:簡單的SQL語句
目錄
SQL,或"Structured Query Language-結構化查詢語言",是對關係資料庫進行查詢資料和更新資料的一種方法。
當我們建立第一個資料庫時,你已經看到了SQL:
SELECT postgis_full_version();
但那是關於資料庫版本資訊的問題。
現在我們已經將資料載入到資料庫中,讓我們使用SQL來查詢資料!例如:
"紐約市
通過單擊SQL按鈕在pgAdmin中開啟SQL查詢視窗:
然後在查詢視窗中輸入以下查詢語句:
SELECT name FROM nyc_neighborhoods;
並點選執行查詢按鈕:
查詢將執行幾毫秒並返回129個結果:
但這裡到底發生了什麼?為了理解,讓我們從SQL的四個”動詞“開始:
- SELECT —— 返回查詢的行記錄
- INSERT —— 向表中新增新行記錄
- UPDATE —— 更改表中的現有行記錄
- DELETE —— 從表中刪除行記錄
我們將幾乎全部使用SELECT語句來使用空間函式。
一、SELECT查詢
SELECT查詢通常採用以下形式:
SELECT some_columns FROM some_data_source WHERE some_condition;
注意:有關所有SELECT語句引數的概要,請參閱PostgreSQL文件
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';
通常,我們對單個行記錄資料不感興趣,而對根據所有行的統計資料更感興趣。
因此,知道街區名字的長度可能不如知道街區名字的長度平均值有趣。
接受多行記錄並返回單個結果的函式稱為“聚合(aggregate)”函式。
PostgreSQL有一系列內建的聚合函式,包括求平均值的avg()函式和求標準差的stddev()函式。
“布魯克林所有街區名字的平均字母數和字母數的標準差是多少?”
SELECT avg(char_length(name)), stddev(char_length(name))
FROM nyc_neighborhoods
WHERE boroname = 'Brooklyn';
上面示例中的聚合函式應用於結果集中的每一行。
如果我們希望在整個結果集中對各個子資料集分別進行處理,該怎麼辦?
為此,我們添加了GROUP BY子句。
聚合函式通常需要新增GROUP BY語句,以便按一個或多個列對結果集進行分組。
“基於各個行政區分類,紐約市所有街區名字的平均字母數是多少?”
SELECT boroname, avg(char_length(name)), stddev(char_length(name))
FROM nyc_neighborhoods
GROUP BY boroname;
我們將boroname列包含在輸出結果中,以便確定哪個統計資料對應於哪個行政區。
在聚合查詢中,只能輸出GROUP BY子句對應的列或聚合函式對應的列。
二、簡單SQL語句的練習
使用nyc_census_blocks表,回答以下問題(不要急著回答!)。
下面是一些有用的資訊,回想一下資料一節中的nyc_census_blocks表的定義。
下面是一些常見的SQL聚合函式,你可能會發現它們很有用:
- avg() —— 返回一個數值列的平均值
- sum() —— 返回一個數值列的和
- count() —— 返回一個列的記錄數
下面是問題:
第一個問題:"紐約市的人口是多少?"
SELECT Sum(popn_total) AS population
FROM nyc_census_blocks;
注意:關鍵字AS是什麼意思?AS用於為表或列指定別名。別名可以使查詢更易於寫入和讀取,與本來要輸出的列名sum不同,我們使用AS關鍵字將其改為population。
第二個問題:"布朗克斯(Bronx)的人口是多少?"
SELECT Sum(popn_total) AS population
FROM nyc_census_blocks
WHERE boroname = 'The Bronx';
第三個問題:"對每個行政區來說,白人佔總人口的百分比是多少?"
SELECT
boroname,
100 * Sum(popn_white)/Sum(popn_total) AS white_pct
FROM nyc_census_blocks
GROUP BY boroname;
三、函式列表
- avg(expression) —— 返回一個數值列的平均值的PostgreSQL聚合函式
- char_length(string) —— 返回字串中的字元數
- stddev(expression) —— 返回輸入值的標準差的PostgreSQL聚合函式
- count(expression) —— 返回一個列的記錄數的PostgreSQL聚合函式
- sum(expression) —— 返回一個數值列的和的PostgreSQL聚合函式