日常sql/hql梳理(1)

本文详细介绍了SQL和HQL中的基础操作,包括聚合函数如MAX(),MIN(),COUNT(),AVG(),SUM(),并表(JOIN)的各种类型,排序、抽样方法,以及常用的数据处理函数如NVL(),casewhen,时间处理函数如date_sub,datediff,date_format等。
摘要由CSDN通过智能技术生成

常用sql

聚合

常用的是group by,一般搭配如下函数一起使用

函数名函数功能
MAX()返回所选的最大值
MIN()返回所选的最小值
COUNT()返回匹配指定条件的行数
AVG()返回所选的平均值
SUM()返回数字列的总和

一般还与having搭配使用,控制查询结果只返回满足having条件的结果。

SELECT AGE,count(1)
FROM persion_table
GROUP BY age
HAVING COUNT(1) >= 2;

并表

并表分为左右连接和上下连接,左右连接用join,上下连接用union
join分为以下几种

连接方式连接字段用法
内连接INNER JOIN返回两个表都有的行(交集)
外连接OUTER JOIN返回两个表有的行(并集)
左连接LEFT JOIN返回左表有的行
右连接INNER JOIN返回右表有的行

实践中不一定是两个不同的表连接,可以单独使用一个表,自己连接自己去实现相关的功能。
union:两个表的列名要一致

SELECT column_a,column_b,column_c FROM table_a
UNION
SELECT column_a,column_b,column_c FROM table_b;

排序

sql中常用order by,但是hql中可以用sort bydistribute bycluster by

抽样

抽样一般用rand(),没有参数的话会产生 0 至 1 之间的随机数,存在参数,会产生0到参数之间的随机数;

-- 会返回一个0到100之间的随机浮点数;
SELECT RAND(100);

与其他函数组合使用。如:

函数名
ROUND(x, y)对处理的数据进行四舍五入,y为保留的小数位数
CEILING(x)对于数据x向上取整
FLOOR(x)对于数据x向下取整
MD5(x)必须要有参数x,计算x对应的MD5摘要,并返回32位的十六进制的字符串

常用内置函数

nvl()

空置转换函数,如果该列存在值为空,则填充为指定值;

-- 如果score为空,则填充为0;
SELECT name,NVL(score, 0) as score from persion_table;

sql中还有ISNULL()NVL()IFNULL()COALESCE()与之等效,但是不同数据库关键词不一样。
ISNULL() 是
SQL Server / MS Access
中的用法;
IFNULL() 是MySQL中的用法;
待补充

SQL还有一个类似的函数NVL2(),其语法为:NVL2(expr1, expr2, expr3)。如果expr1为空值,则返回expr3的值,否则返回expr2的值。

case when

条件判断函数。

CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
ELSE result
END

案例如下:

SELECT name,
CASE
WHEN score >= 90 THEN 'A'
WHEN score >= 80 THEN 'B'
ELSE 'C'
END AS grade
FROM students;

可以多列处理:

SELECT name,
SUM(CASE WHEN subject = 'math' THEN score ELSE 0 END) AS math_total_score,
SUM(CASE WHEN subject = 'math' THEN score ELSE 0 END) * 1.0 /
SUM(CASE WHEN subject = 'math' THEN 1 ELSE 0 END) AS math_average_score,
MAX(CASE WHEN subject = 'math' THEN score ELSE 0 END) AS math_max_score
FROM scores
GROUP BY name;

数据处理函数

SBUSTR()

用法:SBUSTR(string, pos, len)
string : 指定的要截取的字符串;
pos:必需,规定在字符串的何处开始;
如果pos为正数 - 在字符串的指定位置开始(pos位置从1开始计数);
如果pos为负数 - 在从字符串结尾的指定位置开始
length:指定要截取的字符串长度;如果不写的话,则表示从指定位置到最后一个字符。

concat()/ concat_ws()

CONCAT 函数用于将多个字符串连接为一个字符串。
语法:CONCAT(string1, string2, string3)

-- 变更股票代码格式
SELECT CONCAT(substr(symbol,8,2),'.',substr(trade_date,1,6)) as symbol from t1

语法:concat_ws(separator, str1, str2, …)
separator:连接符

-- 变更股票代码格式
SELECT CONCAT('.',substr(symbol,8,2),substr(trade_date,1,6)) as symbol from t1

group_concat()
语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator ‘分隔符’] )

-- 合并个股所属概念
select symbol,group_concat(concept_name order by concept_name ) from t2 group by symbol;

split()

语法:split(original_str,separator)[n];
将字段original_str按照指定分隔符分隔,取n+1部分。

--取值第1部分(年份)
select split(1990-09-01,-)[0]

replace()

语法:replace(original_str,search_str,replace_str)
original_str:需要处理的字段名。
search_str: 需要替换的字符。
replace_str:替换标的。如果 该字段为空,则删除出现的所有 search_str。

TRIM()

去除字段前后的空格;
除此之外还有 RTRIM( ), **LTRIM( )**分别去除字段前空格和字段后空格;

窗口函数

语法:<窗口函数> over (partition by <用于分组的列名> order by <用于排序的列名>)

-- 按照收盘价进行排序
select *,
rank() over (partition by symbol order by close_price desc) as rank_num
from daily_price

时间处理函数

date_sub

语法:date_sub(date,INTERVAL expr unit)
date:需要处理的时间
expr:需要处理的时间(数字)
unit:需要处理的时间单位(hour、day等)

select now() as BEIJING,date_sub(now(),interval 13 hour)as US;

datediff

语法:datediff(expr1,expr2)
返回日期expr1与expr2相差的天数

date_format

将日期格式转化

select date_format(now(),'%Y-%m-%d') as format_str

current_date

获取当前时间

select now() as curr_time1, 
current_timestamp() as curr_time12,
localtime() as 当前curr_time3;
  • 25
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值