1. 程式人生 > >PostGIS教程六:簡單的SQL語句

PostGIS教程六:簡單的SQL語句

目錄

一、SELECT查詢

二、簡單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;

三、函式列表