本文为您介绍高级搜索中使用的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;
使用示例
更多信息,请参见支持的示例查询模板。