全部產品
Search
文件中心

Resource Management:SQL基本文法

更新時間:Jun 30, 2024

本文為您介紹進階搜尋中使用的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 DESCORDER 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....columnN

GROUP 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;

使用樣本

更多資訊,請參見支援的樣本查詢範本