SQL是用于访问和处理数据库的标准计算机语言,云日志服务SQL提供了查询日志单元中结构化数据的语句。
在自定义语句模式下,您可以编写SQL语句进行统计分析,云日志服务将根据SQL语句返回统计分析结果。具体操作步骤请参考SQL统计分析概述。
语法格式
SELECT [ ALL | DISTINCT ] { * | exprs }
FROM { <subquery>}
[ WHERE where_condition ]
[ GROUP BY [ col_list_name ]
[ HAVING expr ]
[ ORDER BY expr [ ASC | DESC ], expr [ ASC | DESC ], ... ]
[ LIMIT limit ]
语句说明
语句 | 说明 | 示例 |
---|---|---|
SELECT | 从表中选取数据,默认从当前日志单元中获取符合检索条件的数据内容。可省略后续的FROM log。 | SELECT visitCount FROM log |
DISTINCT | 返回去重后的结果。 | SELECT DISTINCT visitCount |
AS | 为列名称指定别名。 | SELECT visitCount AS pv |
FROM | 表示当前查询数据的源数据集, 可以是当前日志单元的结构化数据,该情况下FROM后只能接log,也可以是当前日志单元结构化数据的一个子集。不加FROM的时候默认从当前日志单元结构化数据查询,如果查询的数据源是一个子集,您需要编写子查询语句。 | SELECT visitCount SELECT visitCount FROM log |
WHERE | 指定查询的过滤条件,支持算术运算符、关系运算符和逻辑运算符。具体过滤条件可填在where_condition处。 | SELECT visitCount WHERE visitCount > 0 |
GROUP BY | 指定作为分组依据的结构化字段,支持根据单字段或多字段分组。具体的结构化字段列表可填入col_list_name处。 | SELECT host, count(*) AS pv WHERE visitCount > 0 GROUP BY host |
HAVING | 只能与GROUP BY配合使用。指定用于过滤GROUP BY结果的结构化字段。 | SELECT host, count(*) AS pv GROUP BY host HAVING pv > 10 |
ORDER BY | 后面的字段必须是用于GROUP BY分组的字段,对GROUP BY的查询结果进行排序,用于排序的可以是任意一个结构化字段。 | SELECT host, count(*) AS pv GROUP BY host ORDER BY pv |
ASC/DESC | ASC为升序,DESC为降序,默认为ASC。 | SELECT host, count(*) AS pv GROUP BY host ORDER BY pv DESC |
LIMIT | 对查询结果进行限制,用于限制返回的结构化日志条数。一次查询最多返回20000条结构化日志。说明:如果不使用LIMIT语句,默认返回查询结果中最新的100条数据。 | SELECT host LIMIT 100 |
注意
SQL 语句对大小写不敏感,如SELECT 等效于 select。
使用SELECT从日志单元中获取数据时,默认最大获取100行数据,如需获取更多数据请使用LIMIT语法指定需要获取的行数,最多可获取2万行。
字符串必须使用单引号''包裹,无符号包裹或被双引号""包裹的字符表示字段或列名。例如'status'表示字符串 status,status或"status"表示日志字段 status。字符串内本身包含单引号'时,需使用''(两个单引号)代表单引号本身。
SELECT中字段名称需符合列名规范,不符合该规范时,需使用双引号""包裹。
每次只能执行一个sql语句。
统计分析语句中默认不需要填写FROM子句和WHERE子句,默认统计当前日志单元中的数据。
不需要在统计分析语句末尾加分号表示结束。
常用SQL语句示例
查询需求 | 查询语句 |
---|---|
标准查询 | SELECT "field" WHERE "field" = 'value' |
统计行数 | SELECT count(*) |
列的别名 | SELECT count(*) AS "pv" |
去重查询 | SELECT DISTINCT("field") 或 select distinct field |
分页查询 | SELECT "field" LIMIT 100 |
排序查询 | SELECT "ts" order by "ts" |
分组查询 | SELECT "field" GROUP BY "field" |
分组统计 | SELECT "field",count(*) GROUP BY "field" |
模糊查询 | SELECT * where "field" like 'value%' |
查询总和 | SELECT sum("field") |
查询最大值 | SELECT max("field") |
查询最小值 | SELECT min("field") |
查询平均值 | SELECT avg("field") |
SQL嵌套子查询 | SELECT sum(pv) FROM (SELECT "field",count(*) AS "pv" GROUP BY "field") |
HAVING子句过滤 | SELECT "field",count(*) AS "pv" GROUP BY "field" HAVING "pv" > 10 |
查询包含GET,POST请求 | SELECT * WHERE "request_method" IN ('GET', 'POST') |
查询不包含GET,POST请求 | SELECT * WHERE "request_method" NOT IN ('GET', 'POST') |
查询非GET请求的日志 | SELECT * WHERE "request_method" != 'GET' |
查询GET请求成功并且状态码为200且请求时间小于60秒的日志 | SELECT * WHERE "request_method" = 'GET' AND "request_time" < 60 |
查询请求时间大于等于60秒,并且小于200秒的日志 | SELECT * WHERE "request_ time" >60 and "request_time" < 200 |
查询GET请求或POST请求的日志 | SELECT * WHERE "request_method" = 'GET' OR "request_method" = 'POST' |