本文為您介紹進階搜尋中使用的SELECT查詢語句的基本文法。
查詢文法
從資料庫中檢索資料的過程或命令稱為查詢。在SQL中,SELECT命令用於指定查詢。SELECT語句的基本文法如下:
SELECT [DISTINCT] column1 [AS column_name], column2, function
FROM table_name
[JOIN table_name ON join_condition]
[WHERE search_condition]
[GROUP BY column1, column2, ...]
[HAVING search_condition]
[ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...]
[LIMIT number_of_rows OFFSET start_row]SQL關鍵字列表
SELECT:指定要檢索的列名。可以是單個列名,也可以是多個列名,用半形逗號(,)分隔。
DISTINCT:可選關鍵字,用於去重,保證查詢結果中不會出現重複行。
AS:可選關鍵字,用於將查詢結果的列名重新命名。
FROM:指定要查詢的表名。
JOIN:可選關鍵字,用於串連多個表,通常需要指定串連條件。
ON:指定JOIN的串連條件。
WHERE:可選關鍵字,用於指定查詢的條件,支援多個條件組合使用,多個條件之間用AND或OR串連。
GROUP BY:可選關鍵字,用於指定分組依據,查詢結果將按照分組依據進行分組。
HAVING:可選關鍵字,用於指定分組後的篩選條件。
ORDER BY:可選關鍵字,用於指定查詢結果的排序方式,支援多列排序,列名之間用半形逗號(,)分隔,ASC表示升序,DESC表示降序,預設為ASC。
LIMIT:可選關鍵字,用於限制查詢結果返回的行數。
OFFSET:可選關鍵字,用於指定查詢結果的起始行。
SQL關鍵字說明
SELECT列表
在SELECT語句中,SELECT列表(位於SELECT和FROM之間)用於指定查詢結果中的列。您可以使用別名為這些列命名一個新的名稱,方便理解。或者使用運算式對列進行計算和操作,使其滿足查詢需求。運算式可以包括函數、運算、字串操作等。這種靈活的查詢方式可以更好地控制查詢結果的輸出,使其更符合需求。
SELECT語句文法格式如下:
SELECT
column1, column2, ... , columnN
FROM
table_name;column1, column2,...columnN為表中欄位名。table_name為表名。
您可以根據不同的需求使用以下SQL語句,讀取表中的資料:
查詢所有列:
SELECT
*
FROM
table_name;查詢特定列:
SELECT
column1, column2, ...columnN
FROM
table_name;使用別名:
SELECT
column1 AS alias_name
FROM
table_name; 使用運算式:
SELECT
column1 + column2 AS expression
FROM
table_name;FROM
FROM語句為SELECT聲明一個或者多個源表。如果聲明了多個源表,那麼結果就是所有源表的笛卡兒積(交叉串連)。通常會通過WHERE添加一些條件,把返回行限制成笛卡兒積的一個小的子集。
FROM語句可以包括下列元素:
table_name:一個現存的表名。alias:為源表命名的別名。別名用於縮寫或者消除歧義。如果提供了別名,那麼將會隱藏表的實際名稱。例如:如果給出FROM resources AS a,那麼SELECT語句中餘下的部分必須通過引用a來訪問resources表的內容。select:可以在FROM語句裡出現一個子查詢。此時SELECT語句是一個巢狀查詢的結構,內部子查詢的返回結果會產生一個暫存資料表,外部查詢將在這個暫存資料表中返回結果。這個子查詢必須用半形圓括弧包圍,並且必須給它命名一個別名。join_type:多表組合串連的結果。更多資訊,請參見JOIN。
在進階搜尋中,resources表是核心資料表,它儲存了資源屬性的相關資訊。resources表的結構,請參見查詢表。
JOIN
JOIN語句用於將來自兩個或多個表的行組合在一起,基於這些表之間的共同欄位進行關聯。
JOIN有以下五種連線類型。連線類型的選擇取決於您想要的結果集和資料關係。您可以根據需要,使用這些連線類型,將不同的表進行關聯,以擷取所需的資料。
CROSS JOIN:交叉串連。它返回兩個表的笛卡爾積,即每個表中的每一行與另一個表中的每一行進行組合。這種連線類型通常用於產生資料的排列組合。
INNER JOIN:內串連。它根據兩個表之間的共同欄位的匹配將兩個表中的行進行組合,只返回匹配的行。
LEFT OUTER JOIN:左外串連。它返回左表中的所有行,以及右表中與之匹配的行。如果右表中沒有匹配的行,則返回NULL值。
RIGHT OUTER JOIN:右外串連。它返回右表中的所有行,以及左表中與之匹配的行。如果左表中沒有匹配的行,則返回NULL值。
FULL OUTER JOIN:全外串連。它返回左表和右表中的所有行,如果兩個表中沒有匹配的行,則返回NULL值。
WHERE
WHERE語句在SELECT語句中的作用是篩選出合格行資料。它的文法格式如下:
SELECT
column1, column2, ... , columnN
FROM
table_name
WHERE
[condition]您可以使用WHERE語句,根據各種條件過濾資料。條件可以包括比較子(如等於、大於、小於等)、邏輯運算子(如AND、OR、NOT等)、LIKE模糊查詢關鍵字、IN、NULL判斷(如IS NULL、IS NOT NULL等)等。
使用比較子:
當使用等於運算子(=)時,會返回精確匹配的行資料。例如:您可以使用等於運算子(=)查詢資源類型為ECS執行個體的資源。
SELECT resource_id, resource_name, resource_type, region_id, account_id FROM resources WHERE resource_type = 'ACS::ECS::Instance';當使用大於(>)、小於(<)、大於等於(>=)、小於等於(<=)或者不等於(!=)運算子時,會返回滿足指定條件的資源。例如:您可以使用以下語句查詢指定時間後建立的資源。
SELECT resource_id, resource_name, region_id, resource_type, account_id, create_time FROM resources WHERE create_time > '20230607';使用邏輯運算子:
邏輯運算子用於串連多個條件,常見的邏輯運算子有AND、OR和NOT。
當使用AND串連多個查詢條件時,只有同時滿足所有查詢條件的行才會被返回。例如:您可以使用AND運算子查詢華東1(杭州)且類型為ECS執行個體的資源。
SELECT resource_id, resource_name, resource_type, region_id, account_id FROM resources WHERE region_id = 'cn-hangzhou' AND resource_type = 'ACS::ECS::Instance';使用OR運算子時,滿足任意一個查詢條件的行都會被返回。例如:您可以使用以下語句查詢ECS執行個體和磁碟資源。
SELECT resource_id, resource_name, resource_type, region_id, account_id FROM resources WHERE resource_type = 'ACS::ECS::Disk' OR resource_type = 'ACS::ECS::Instance';使用LIKE運算子:
LIKE運算子用於模糊比對,可以根據指定的模式來過濾資料。LIKE運算子通常與萬用字元結合使用,萬用字元表示任一字元,在PostgreSQL中,主要有以下兩種萬用字元:
百分比符號(%):表示任意長度的字元序列,可以匹配0個或多個字元。
底線 (_):表示單個字元,可以匹配任意一個字元。
如果沒有使用以上兩種萬用字元,LIKE語句和等於運算子(=)得到的結果是一樣的。但是,使用萬用字元可以更靈活地進行資料的模糊比對和範圍查詢。例如:我們可以使用以下語句查詢ECS產品的全部資源類型。
SELECT resource_id, resource_name, region_id, zone_id, resource_type, account_id, FROM resources WHERE resource_type LIKE 'ACS::ECS::%';使用IN運算子:
IN運算子是一個布林運算子,用來檢查一個值列表是否包含某個指定的值。如果值列表包含了指定的值,則IN運算子返回真,否則它返回假。
SELECT column1, column2, ... , columnN FROM table_name WHERE exp IN (value1, value2, ..., valueN);exp可以是一個欄位名、值或者其他運算式(比如函數調用、運算等)。value1, value2, ..., valueN是一個值列表,多個值之間使用逗號分隔。
例如:您可以使用以下語句查詢ECS執行個體和磁碟資源。
SELECT resource_id, resource_name, region_id, zone_id, resource_type, account_id, FROM resources WHERE resource_type IN('ACS::ECS::Instance', 'ACS::ECS::Disk');使用NULL運算子
NULL表示空值。IS NULL可以用於判斷某個欄位是否為空白值,IS NOT NULL用於判斷某個欄位是否非空。例如:您可以執行如下語句篩選出資源名稱為空白值的資源。
SELECT resource_id, resource_name, region_id, zone_id, resource_type, account_id, FROM resources WHERE resource_name IS NULL;
通過使用適當的運算子,您可以根據具體的條件對資料進行篩選和過濾,以擷取您需要的查詢結果。
ORDER BY
ORDER BY語句用於對查詢結果進行排序。它的文法格式如下:
SELECT
column1, column2, ... , columnN
FROM
table_name
ORDER BY
column1, column2, .. columnN ASC | DESC;在ORDER BY語句中,使用ASC或DESC關鍵字指定排序的順序。ASC表示升序排列(從小到大),而DESC表示降序排列(從大到小)。如果未指定排序次序,預設情況下將使用ASC。
需要注意的是,ORDER BY語句的順序選項只應用於其所跟隨的運算式。例如:ORDER BY column1, column2 DESC和ORDER BY column1 DESC, column2 DESC是不同的。前者將首先按照column1升序排列(未指明順序時,預設是升序),然後在column1相等的情況下再按照column2降序排列,而後者則首先按照column1降序排列,然後在column1相等的情況下再按照column2降序排列。
您可以在ORDER BY語句指定一個或多個列作為排序依據的屬性,包括未在SELECT列表中出現的列。當有多個列時,用半形逗號(,)分隔,先按照第一列排序,如果有相等的值,則按照下一列進行排序,依次類推。
選擇排序列時,建議:
避開有空值的屬性或進行特殊處理,否則這部分資源無法被正確排序。
如果排序列的屬性值存在重複,多次執行查詢可能會返回不一致的結果,為了保證查詢結果的一致性,建議添加另一個排序列。
例如:您可以先按照資源類型排序,然後在每個資源類型內部再按照資源ID排序。
SELECT
resource_id,
resource_name,
region_id,
zone_id,
resource_type,
account_id,
FROM
resources
ORDER BY
resource_type,
resource_id;GROUP BY
GROUP BY語句通過指定一個或多個列對查詢結果進行分組歸類,對於每個分組可以再進行統計、彙總或篩選操作。它的文法格式如下:
SELECT
column1, column2, ... , columnN
FROM
table_name
WHERE
[ conditions ]
GROUP BY
column1, column2....columnN
ORDER BY
column1, column2....columnNGROUP BY語句必須放在WHERE語句中的條件之後(如果有WHERE語句),ORDER BY語句之前(如果有ORDER BY語句)。
在GROUP BY語句中,可以對一個或多個列進行分組。但被分組的列必須在SELECT列表中出現,否則將會報錯。使用GROUP BY語句時,還可以結合彙總函式(如SUM、COUNT、AVG等)來對每個分組進行計算。彙總函式將根據分組進行計算,返回每個分組的彙總結果。這樣可以很方便地對每個分組進行統計分析,得到摘要資料。
例如:按照資源類型對資源進行分組計數。此查詢的返回結果為兩列,一列為字串,另一列為數值,針對這類查詢,進階搜尋支援通過圖表的方式更直觀地查看結果。
SELECT
resource_type,
COUNT(*) AS cnt
FROM
resources
GROUP BY
resource_type
ORDER BY
cnt DESC;LIMIT
LIMIT語句用於限制執行SELECT語句後返回的查詢結果行數。LIMIT語句由兩個獨立的子句構成:
LIMIT
count OFFSET start以下是LIMIT語句與OFFSET語句一起使用時的文法:
SELECT
column1, column2, ... , columnN
FROM
table_name
LIMIT
[no of rows] OFFSET [row num]LIMIT語句用於指定返回結果的行數。例如:LIMIT 10表示最多返回10條記錄。
OFFSET語句用於指定從哪一行開始返回結果。可以通過指定一個具體的行數來確定位移量,例如:OFFSET 10表示從第11行開始返回結果。如果不指定OFFSET語句,則預設從第一行開始返回結果。
在使用LIMIT和OFFSET語句時,通常需要配合使用ORDER BY語句來指定返回結果的順序。因為未指定順序的查詢其返回結果是不確定的,多次執行可能會得到不同的結果。在不同的查詢順序下使用LIMIT和OFFSET是沒有意義的。因此在使用LIMIT和OFFSET語句時,應該配合使用ORDER BY語句來約束結果行的順序,這樣在截取資料時,才能保證是在一個一致性的資料列表中進行截取。
例如:按照資源ID降序排列,並返回前20個資源的列表。
SELECT
resource_id,
resource_name,
region_id,
resource_type,
account_id
FROM
resources
ORDER BY
resource_id DESC
LIMIT
20;在某些情況下,可能需要從指定的位移量開始提取記錄。由於進階搜尋限制LIMIT的最大值為1000,所以當資料量很大時,可以通過LIMIT和OFFSET的組合來進行分頁查詢。每次查詢時,通過指定LIMIT限制返回結果的數量,通過增加OFFSET擷取下一頁的結果。但是需要注意,為了確保每次截取的資料是連續的,需要使用ORDER BY根據某個欄位進行排序。
例如:按照資源ID進行排序,擷取第1001到第2000行的資料。
SELECT
resource_id,
resource_name,
region_id,
resource_type,
account_id
FROM
resources
ORDER BY
resource_id DESC
LIMIT
1000 OFFSET 1000;使用樣本
更多資訊,請參見支援的樣本查詢範本。