SQL基本语法

本文为您介绍高级搜索中使用的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;

使用示例

更多信息,请参见支持的示例查询模板