sql中最重要的恐怕就是查询语句了。
要点1,必要结构
查询语句的语法结构:
SELECT [DISTINCT] select_list
[ INTO new_table]
FROM table_name
[ WHERE search_condition]
[ GROUP BY group_by_expression]
[ HAVING search_condition]
[ ORDER BY order_expression [ ASC|DESC ] ]
所以,必要结构为SELECT select_list FROM table_name;
查询语句必须有:1. 选择的列。2. 数据来源(可以是联结生成的虚拟表)
要点2,执行顺序
FROM > WHERE > GROUP BY > HAVING > SELECT > DISTINCT > ORDER BY > LIMIT
- from,确定数据源(基本表或虚拟表)
- where,筛选行
- group by,行分组
- having,筛选组
- select,筛选列,组聚集成行
- distinct,行去重
- order by,行排序
- limit,限制结果集行数
要点3,了解必要函数
三类重要的函数:
- 处理null的函数,例如:coalesce
- 处理时间日期的函数
- 处理字符串的函数
扩展阅读1
把多行变成一行,根据具体需求,有两种情况:
- group by聚集
- 联结
举个多行变一行,使用联结的例子:
电表上传的功率、电能数据都放在ts_kv表,功率和电能对应不同的key,如果值带小数放dbl_v,long_v为null,如果值为整数放long_v,dbl_v为null。
需求:查询一个时间区间[1665280800000, 1665290100000]内,电表(ec94f0f0-3fc3-11ed-b94a-23d6e309bb5e)上传的功率、电能数据:
select 时间戳, 功率, 电能 from
((select ts as 时间戳, COALESCE(dbl_v, long_v) as 功率 from ts_kv where entity_id = 'ec94f0f0-3fc3-11ed-b94a-23d6e309bb5e' and key = 57 and ts between 1665280800000 and 1665290100000) as t1
left join
(select ts, COALESCE(dbl_v, long_v) as 电能 from ts_kv where entity_id = 'ec94f0f0-3fc3-11ed-b94a-23d6e309bb5e' and key = 58 and ts between 1665280800000 and 1665290100000) as t2
on 时间戳 = t2.ts)
order by 时间戳;
扩展阅读2
什么场景下需要窗口函数?
窗口函数和group by语句都是分组计算,不同之处在于,group by配合聚集函数,会把每个分组聚集成一行结果。而窗口函数,组内每行都会有一个结果。常用于组内排名等场景。
网友评论