中国统计网|SQL大厂面试常考知识点 | 新手速进!( 二 )

select*from ( selectidfromtable_1 UNIONALL selectidfromtable_2 )t; union和union all均基于列合并多张表的数据 , 所合并的列格式必须完全一致 。 union的过程中会去重并降低效率 , union all直接追加数据 。 union前后是两段select 语句而非结果集 。
二.最常用
为方便大家理解每个函数的作用 , 先建一个表 , 后面以这个为示例 。
中国统计网|SQL大厂面试常考知识点 | 新手速进!
本文插图
1. 去重 distinct
-- 罗列不同的id selectdistinctidfromtable_1 -- 统计不同的id的个数 selectcount(distinctid)fromtable_1 -- 优化版本的count distinct selectcount(*)from (selectdistinctidfromtable_1) tbdistinct 会对结果集去重 , 对全部选择字段进行去重 , 并不能针对其中部分字段进行去重 。 使用count distinct进行去重统计会将reducer数量强制限定为1 , 而影响效率 , 因此适合改写为子查询 。
2. 聚合函数和group by
-- 统计不同性别(F、M)中 , 不同的id个数 groupbysex -- 其它的聚合函数例如:max/min/avg/sum -- 统计最大/最小/平均年龄 selectmax(age),min(age),avg(age)from table_1 groupbyid聚合函数帮助我们进行基本的数据统计 , 例如计算最大值、最小值、平均值、总数、求和 。
3. 筛选 where/having
-- 统计A公司的男女人数 wherecompany ='A' -- 统计各公司的男性平均年龄 , 并且仅保留平均年龄30岁以上的公司 selectcompany,avg(age)fromtable_1 wheresex ='M' groupbycompany havingavg(age)>30;4. 排序 order by
-- 按年龄全局倒序排序取最年迈的10个人 selectid,agefromtable_1orderbyageDESC limit 105. case when 条件函数
-- 收入区间分组 selectid, (casewhenCAST(salaryasfloat)<50000Then'0-5万' whenCAST(salaryasfloat)>=50000andCAST(salaryasfloat)<100000then'5-10万' whenCAST(salaryasfloat) >=100000andCAST(salaryasfloat)<200000then'10-20万' whenCAST(salaryasfloat)>200000then'20万以上' elseNULLend fromtable_1;case 函数的格式为(case when 条件1 then value1 else null end),其中else 可以省 , 但是end不可以省 。
在这个例子里也穿插了一个CAST的用法 , 它常用于string/int/double型的转换 。
6. 字符串
1)concat( A, B...)返回将A和B按顺序连接在一起的字符串 , 如:concat('foo', 'bar') 返回'foobar' 。
selectconcat('www','.iteblog','.com')from iteblog;2)split(str, regex)用于将string类型数据按regex提取 , 分隔后转换为array 。
-- 以","为分隔符分割字符串 , 并转化为array Selectsplit("1,2,3",",")asvalue_arrayfromtable_1; -- 结合array index,将原始字符串分割为3列 selectvalue_array[0],value_array[1],value_array[2]from (selectsplit("1,2,3",",")asvalue_arrayfromtable_1 )t3)substr(str,0,len)截取字符串从0位开始的长度为len个字符 。


推荐阅读