SQL 常用语句积累(一)

作者: 啊凡 分类: SQL,学习 发布时间: 2020-04-28 22:41

目  录(CONTENT)

1、(快速)批量生成“union all”语句
2、输出表结构
3、数据量较多,如何提取指定行数之后的数据
4、提取年月
5、months_between计算月差出现负数

 

1、(快速)批量生成“union all”语句

  • 适用场景:当数据库中有多表(通常为日表并为月表,或月表并为一张年表)需要合并时,可通过1条sql语句自动生成union all的语句。
  • 适用条件:表名格式统一

【案例】:现有如下表需要合并:

  • T_A_B_LOG_2019_01_01
  • T_A_B_LOG_2019_01_02
  • T_A_B_LOG_2019_01_03
  • T_A_B_LOG_2019_01_04
  • T_A_B_LOG_2019_01_05

[SQL]:
Select  ‘select * from  ‘||OWNER||’,’||table_name||’ union all’  from  DBA_tables  where table_name like ‘%T_A_B%’

[备注]:

dba_tables,即储存系统里所有的表的信息,需要DBA权限才能查询, “OWNER、TABLE_NAME”均为dba_tables里的字段,字段解释如下:

 

✁~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

2、输出表结构

  • 适用场景:当使用“union all”并表语句时,报错可能存在部分表的数据类型(data_type)不一致,可通过查询表结构,查询指定表的所有字段及字段类型。

 

[SQL]:

Select column_name,data_type  from  user_tab_cols  where table_name=’test’

 

 

✁~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

3、数据量较多,如何提取指定行数之后的数据

  • 适用场景:针对批量导出数据有数据量上限(如一次只能导出20万条数据)的情况下,可使用相关sql语句,分批导出

[SQL]:

(1) Select rownum,a.* from test  where rownum<=200000

(2) Select rownum,a.* from test  where rownum > 200000

[备注]:

因为数据库中的表示乱序排列的,通过使用rownum, 相当于给表里的数据排了顺序。

✁~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

4、提取年月

[SQL]:

(1) select extract ( YEAR from a.create_date), extract (MONTH from a.create_date) from test

(2) to_char(create_date, ‘YYYYMM’) / to_date(create_date,’YYYYMM’)

(3) substr(create_date,0,7)  

  • 日期类字段,可采用(1)、(2);
  • 字符型字段,格式为2019-04-01, 可采用(3)

✁~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 5、months_between计算月差出现负数

报错示例:

select 固话入网时间,sysdate,months_between(TO_DATE(sysdate,’yyyy-mm-dd’)-TO_DATE(固话入网时间,’yyyy-mm-dd’)