文字比较简略,例子比较突兀,需要自行联想,持续更新…
有些函数可能是通用的。

一、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可以用于:

  1. 建立递归查询。常见的场景有组织架构图、BOM等。具体用法请参考联机丛书。
  2. 当不需要常规视图时,代替视图,提高可读性。
  3. 允许在派生列上分组。
  4. 在同一个语句中多次被引用。

5、CAST()

CAST()函数的参数是一个表达式,它包括用AS关键字分隔的源值和目标数据类型

SELECT CAST('12' AS int) FROM dual--文本字符串'12'转换为整型

6、COALESCE()

COALESCE是一个函数, (expression_1, expression_2, …,expression_n)依次参考各参数表达式,遇到非null值即停止并返回该值。如果所有的表达式都是空值,最终将返回一个空值。使用COALESCE在于大部分包含空值的表达式最终将返回空值。

SQLserver怎么把text类型转化成images_oracle

SQLserver怎么把text类型转化成images_mysql_02

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)遵循以下规则:

  1. 当一个数的整数部分的长度> p-s 时,Oracle就会报错
  2. 当一个数的小数部分的长度> s 时,Oracle就会舍入。
  3. 当s(scale)为负数时,Oracle就对小数点左边的s个数字进行舍入。
  4. 当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 时间形式,以提高读取效率

SQLserver怎么把text类型转化成images_软件工程_03