本文為您介紹高級搜索中使用的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....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;
使用示例
更多信息,請參見支持的示例查詢模板。