1.on和where的区别
1)在进行表连接查询时会产生一张中间表(临时表),on是在生成中间表时使用的条件;where是在中间表生成后对中间表进行过滤使用的条件。
例如:
t1
id | name |
---|---|
1 | Rose |
2 | Tom |
3 | Amy |
t2
id | name |
---|---|
2 | xiaoming |
5 | xiaohong |
select * from t1 left join t2 on t1.id = t2.id and t1.id = 2;
select * from t1 left join t2 on t1.id = t2.id where t1.id = 2;
运行结果:
第一个语句结果
id | name | id | name |
---|---|---|---|
1 | Rose | null | null |
2 | Tom | 2 | xiaoming |
3 | Amy | null | null |
第二个语句结果
id | name | id | name |
---|---|---|---|
2 | Tom | 2 | xiaoming |
2)在进行内连接inner join时,on和where都可以使用;在进行外连接 left/right/full outer join 时,必须使用on,不然会报错。
3)on、where、having的执行顺序:
在多表连接查询时,系统首先根据各个表之间的连接条件(跟在on后面的语句),把多个表合成一个临时表后,再由where进行过滤,然后再计算,计算完成后再由having进行过滤。总之,on最先执行,where次之,having最后。
原文链接
2.datediff函数在mySQL和Hive中的区别
datediff函数求两个指定日期的差
1)Hive:datediff(endDate,startDate)
select datediff('2022-08-15','2022-08-16')
-- 运行结果: -1
select datediff('2022-08-17','2022-08-16')
-- 运行结果: 1
2)mySQL:datediff(datepart,startDate,endDate) 不支持Hive
有时候需要求两个指定日期相差的月数,需要设置datepart为m
datepart | 缩写 |
---|---|
年 | yyyy,yy |
季度 | qq,q |
月 | mm,m |
年中的日 | dy,y |
日 | dd,d |
周 | wk,w |
星期 | dw,w |
小时 | hh |
分钟 | mi,n |
秒 | ss,s |
毫秒 | ms |
微秒 | mcs |
纳秒 | ns |
select datediff(''d'','2003-01-01','2003-01-02')
-- 返回的是1;
select datediff(''d'','2003-01-02','2003-01-01')
-- 返回的是-1;