文字比较简略,例子比较突兀,需要自行联想,持续更新…
有些函数可能是通用的。
一、Oracle部分
1、current_date 和 sysdate
在oracle中current_date与sysdate都是显示当前系统时间, 其结果基本相同,但是有三点区别:
1. current_date返回的是当前会话时间,而sysdate返回的是服务器时间;
2. current_date有时比sysdate快一秒,这可能是四舍五入的结果;
3. 如果修改当前会话的时区,比如将中国的时区为东八区,修改为东九区,则current_date显示的时间为东九区时间, 根据东加西减的原则,current_date应该比sysdate快一小时。
2、case when then else end
- 对已知的数据库中数据,按照自己的逻辑,进行自定义分组和数据分析
- 用此条件控制语句,实现自定义条件分组
- 条件控制语句中嵌套函数达到理想的计算效果
例如:
SELECT
T.COLUMN_ID,
T.COLUMN_NAME,
(CASE
WHEN
(T.DATA_TYPE = ‘VARCHAR2’ OR T.DATA_TYPE = ‘RAW’)
THEN
T.DATA_TYPE || ‘(’ || T.DATA_LENGTH || ‘)’
WHEN
(T.DATA_TYPE = ‘NUMBER’ AND T.DATA_PRECISION IS NOT NULL)
THEN
T.DATA_TYPE || ‘(’ || T.DATA_PRECISION || ‘,’ || T.DATA_SCALE || ‘)’
ELSE
T.DATA_TYPE END)
AS DATA_TYPE,
B.COMMENTS
FROM
USER_TAB_COLUMNS T
INNER JOIN ALL_COL_COMMENTS B ON
B.COLUMN_NAME = T.COLUMN_NAME AND T.TABLE_NAME = B.TABLE_NAME AND T.TABLE_NAME = ‘T_WEIXIN_REMIND_FUND_CHANGE’
ORDER BY
T.COLUMN_ID;
3、row_number() over()
select name,course,score,row_number() over(partition by course order by score desc) as order from student;
按照course 分组,score 降序排序,并给出行编号(1234…),大概的查询结果如下:
name | course | score | order |
张三 | 计算机网络 | 100 | 1 |
张三1 | 计算机网络 | 90 | 2 |
张三2 | 计算机网络 | 80 | 3 |
李四 | 软件工程 | 100 | 1 |
李四1 | 软件工程 | 80 | 2 |
李四2 | 软件工程 | 60 | 3 |
李四3 | 软件工程 | 60 | 4 |
在使用 row_number() over()函数时候,over()里头的分组以及排序的执行晚于 where 、group by、 order by 的执行
关于Parttion by:
Parttion by关键字是Oracle中分析性函数的一部分,用于给结果集进行分区。它和聚合函数Group by不同的地方在于它只是将原始数据进行名次排列,能够返回一个分组中的多条记录(分组的记录全部返回),而Group by是对原始数据进行聚合统计,一般只有一条反映统计值的结果(每组的记录返回一条)。
4、with as
with as 的好处:
- 增加了sql的易读性,如果构造了多个子查询,结构会更清晰;
- 更重要的是:“一次分析,多次使用”,这也是为什么会提供性能的地方,达到了“少读”的目标
insert into table_name
with
s1 as (select rownum c1 from dual connect by rownum <= 10),
s2 as (select rownum c2 from dual connect by rownum <= 10)
select a.c1, b.c2 from s1 a, s2 b where…;
with as 相当于虚拟视图。也可以理解为with as 其实是构造了临时表
with as短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个sql片断,该sql片断会被整个sql语句所用到。
有的时候,是为了让sql语句的可读性更高些,也有可能是在union all的不同部分,作为提供数据的部分。
特别对于union all比较有用。
因为union all的每个部分可能相同,但是如果每个部分都去执行一遍的话,则成本太高,所以可以使用with as短语,则只要执行一遍即可。
如果with as短语所定义的表名被调用两次以上,则优化器会自动将with as短语所获取的数据放入一个tmp表里,如果只是被调用一次,则不会,而提示materialize则是强制将with as短语里的数据放入一个全局临时表里。
很多查询通过这种方法都可以提高速度。
关于connect by 转自:
数据库CTE指的是公共表表达式(Common Table Expression).
可以把它认为是在单个select,insert,update, delete 或者 create view 语句中定义的临时结果集。
CTE类似派生表,但它不以对象的形式存储在数据库中,只在当前查询语句的执行期间有效。而且CTE可以在同一个语句中被多次引用。
CTE可以用于:
- 建立递归查询。常见的场景有组织架构图、BOM等。具体用法请参考联机丛书。
- 当不需要常规视图时,代替视图,提高可读性。
- 允许在派生列上分组。
- 在同一个语句中多次被引用。
5、CAST()
CAST()函数的参数是一个表达式,它包括用AS关键字分隔的源值和目标数据类型
SELECT CAST('12' AS int) FROM dual--文本字符串'12'转换为整型
6、COALESCE()
COALESCE是一个函数, (expression_1, expression_2, …,expression_n)依次参考各参数表达式,遇到非null值即停止并返回该值。如果所有的表达式都是空值,最终将返回一个空值。使用COALESCE在于大部分包含空值的表达式最终将返回空值。
7、NULLIF() 和 ISNULL() 和 IIF()
- NULLIF(Expression1,Expression2):给定两个参数Expression1和Expression2,如果两个参数相等,则返回NULL;否则就返回第一个参数。
等价于:Case WHEN Expression1=Expression2 Then NULL ELSE Expression1。
Select NULLIF(1,1)返回NULL,Select NULLIF(1,2)返回1
- ISNULL(Expression1,Expression2):给定两个参数Expression1和Expression2,如果Expression1是NULL,那么返回Expression2,否则返回Expression1。
等价于:Case WHEN Expression1 is NULL Then Expression2 ELSE Expression1。
Select ISNULL(NULL,1)返回1,Select ISNULL(1,2)返回1。
- IIF(表达式,exp1,exp2),表达式成立,返回exp1,否则exp2
select iif(30>45,'对','错') as 结果
8、NUMBER (precision,scale)和它的子类型
8、1 number(precision,scale)
number是Oracle中的数值类型
precision表示数字中的有效位(从左边第一个不为0的数算起,小数点和负号不计入有效位数),取值范围为【1-38】默认38。
scale表示精确到多少位,取值范围为【-84-127】,默认值为0。大于零时,表示数字精确到小数点右边的位数;小于零时,将把该数字取舍到小数点左边的指定位数,所以,NUMBER整数部分允许的长度为(precision- scale),无论scale是正数还是负数,并且,如果precision小于scale,表示存储的是没有整数的小数。
关于number的精度(p)
和刻度(s)
遵循以下规则:
- 当一个数的整数部分的长度> p-s 时,Oracle就会报错
- 当一个数的小数部分的长度> s 时,Oracle就会舍入。
- 当s(scale)为负数时,Oracle就对小数点左边的s个数字进行舍入。
- 当s > p 时, p表示小数点后第s位向左最多可以有多少位数字,如果大于p则Oracle报错,小数点后s位向右的数字被舍入
8、2 number子类型
- decimal,numeric,int等都为SQL、DB2等数据库的数据类型,ORACLE为了兼容才将其引入;但实际上在ORACLE内部还是以NUMBER的形式将其存入,所以在集合关系上它们也都是number的子集。
- int类型只能存储整数;
- 在oracle数据库建表的时候,decimal,numeric不带精度,oracle会自动把它处理成INTEGER;带精度,oracle会自动把它处理成number。
- Oracle只用NUMBER(m,n)就可以表示任何复杂的数值数据。
二、MySQL部分
1、UNIX_TIMESTAMP()
MySQL中将日期时间格式(timestamp)转换为epoch时间。
epoch时间:
新纪元时间 Epoch 是以 1970-01-01 00:00:00 UTC 为标准的时间,将目标时间与 1970-01-01 00:00:00 时间的差值以秒来计算 ,
单位是秒,可以是负值; 有些应用会将时间存储成epoch 时间形式,以提高读取效率