【Oracle】常用数据库sql记录

1、获取指定日期所在年份

SELECT
	EXTRACT(YEAR  FROM TO_DATE('2023-11-02', 'yyyy-MM-dd')) AS year
FROM
	dual;

2、获取指定日期所在月份

SELECT
	EXTRACT(MONTH FROM TO_DATE('2023-11-02', 'yyyy-MM-dd')) AS month
FROM
	dual;

3、获取指定日期去年同期日期

SELECT
	ADD_MONTHS(TRUNC(TO_DATE('2023-11-02', 'yyyy-MM-dd')), -12) AS last_date
FROM
	dual;

4、获取指定日期所在年份的总天数

1、使用 EXTRACT 函数从日期字符串 ‘2023-11-15’ 中提取年份;
2、TO_DATE(‘2023-11-02’, ‘YYYY-MM-DD’) 将日期字符串转换为日期格式;
3、TO_CHAR(…, ‘YYYY’) 将日期转换为字符串;
4、 TO_NUMBER 将字符串转换为数字;
5、MOD 函数用于计算年份除以 4 的余数,如果余数为 0,则该年为闰年,返回 366 天;否则返回 365 天。

SELECT
	 CASE
		WHEN (MOD(EXTRACT(YEAR FROM TO_DATE('2023-11-02', 'yyyy-MM-dd')),4) = 0
		AND MOD(EXTRACT(YEAR FROM TO_DATE('2023-11-02', 'yyyy-MM-dd')),100) != 0)
		OR MOD(EXTRACT(YEAR FROM TO_DATE('2023-11-02', 'yyyy-MM-dd')),400) = 0
        THEN 366
		ELSE 365
	END AS days
FROM
	dual;

5、获取年初到指定日期的天数

TRUNC(your_date, ‘YYYY’)用于将日期截断为年初。然后,通过从日期列中减去年初的日期来计算到年初的天数。天数需要加1。

SELECT
	TO_DATE('2023-01-02', 'yyyy-MM-dd') - trunc( TO_DATE('2023-01-02', 'yyyy-MM-dd'), 'yyyy') + 1 AS days
FROM
	dual;

6、除法运算

CASE
	WHEN amt = 0 THEN NULL
	-- 或者其他处理方式,比如返回 NULL
	ELSE ROUND(pay_amt / amt, 4)* 100
END AS ratio

对于除法运算,要判断除数是否为0当除数为 NULL时,计算结果通常也是 NULL


7、递归查询

用于层次结构的数据,比如组织架构、地区划分等。

SELECT
	*
FROM
	relationship a
START WITH
	a.parent_code = '0'
CONNECT BY
	PRIOR a.code = a.parent_code;
  1. 起始条件是 parent_code=‘0’,然后通过 connect by prior 条件递归地沿着自连接关系遍历子集;
  2. START WITH 子句指定了起始条件,这里是从 parent_code='0' 的记录开始;
  3. CONNECT BY PRIOR 子句用于指定递归条件,a.code = a.parent_code 表示每次迭代都会沿着 code 和 parent_code 相等的路径向下查找;

8、REPLACE函数

REPLACE 函数会将原始日期中的年份部分替换为另一个字段的年份部分。确保替换后的格式与原始日期相匹配。

--original_date 是原始日期字段。
--another_date 是作为替换参考的日期字段。
--desired_date 是想要替换成的日期字段。

SELECT
    REPLACE(TO_CHAR(original_date, 'YYYY-MM-DD'), TO_CHAR(another_date, 'YYYY'), TO_CHAR(desired_date, 'YYYY')) AS replaced_date
FROM your_table;

9、DECODE 函数

DECODE 函数是 Oracle 提供的一种条件表达式函数,用于根据指定条件返回不同的结果。

DECODE(expression, search1, result1, search2, result2, ..., default_result)

decode(i2.incom_year_amt,0,null,ROUND((i1.incom_year_amt-i2.incom_year_amt)/ i2.incom_year_amt, 4)* 100) AS incratio
  1. expression 是需要进行比较的表达式或列;
  2. search1, search2, … 是希望与表达式比较的值;
  3. result1, result2, … 是如果表达式等于相应搜索值时返回的结果;
  4. default_result 是当表达式与所有搜索值均不匹配时的默认返回值(可选的);
  5. DECODE 函数按照给定的搜索值逐个匹配表达式,如果找到匹配的搜索值,则返回相应的结果。如果没有找到匹配的搜索值,且提供了默认结果,则返回默认结果。

10、聚合函数

  1. 常见的聚合函数包括 SUM、AVG、COUNT、MAX、MIN 等;
  2. 用于将多行数据聚合为单个结果,例如计算总和、平均值、计数等;
  3. 经常用于与 GROUP BY 子句一起使用,以便按组执行聚合操作;
SELECT
   sum(amt) AS all_amt
FROM your_table  group by mof_div_code,report_date;

11、窗口函数

  1. 常见的窗口函数包括 ROW_NUMBER、RANK、LEAD、LAG、SUM 等;
  2. 用于对数据集中的特定窗口(也称为分区)执行计算;
  3. 可以在查询结果中添加一列或几列,而不会像聚合函数那样汇总数据。窗口函数通常与 OVER 子句一起使用,该子句定义了要应用窗口函数的数据窗口;

语法:

<窗口函数>() OVER (
    PARTITION BY 分区字段
    ORDER BY 排序字段
    ROWS/RANGE 子句
)
11.1 ROW_NUMBER函数

为结果集中的每一行分配一个唯一的数字,通常用于排序后按顺序编号。

SELECT 
  column1,
  column2,
  ROW_NUMBER() OVER (ORDER BY column1) AS row_num
FROM 
  your_table;
11.2 RANK函数

为结果集中的每一行分配一个排名,如果有相同值,则排名相同,下一个排名按照次序递增。

SELECT 
    RANK() OVER (ORDER BY column_name) AS rank_value,
    column_name
FROM table_name;

11.3 LEAD 和 LAG函数

LEAD() 和 LAG():分别用于获取当前行后面和前面的行的值。

SELECT 
    RANK() OVER (ORDER BY column_name) AS rank_value,
    column_name
FROM table_name;

11.4 SUM函数

用于计算指定列的总和,结合窗口函数使用时可计算分组内的累计总和。比如需要统计某一年到指定日期的汇总金额。

SELECT 
    column_name,
    SUM(column_name) OVER (PARTITION BY group_column ORDER BY order_column) AS running_total
FROM table_name;
11.4.1 统计年度累计金额
SUM(INCOM_DAY_AMT) OVER (PARTITION BY FISCAL_YEAR ORDER BY MOF_DIV_CODE,FUND_TYPE_CODE,REPORT_DATE) AS cur_day_total
  1. SUM(INCOM_DAY_AMT): 这部分是求和的基本函数;
  2. OVER: 表示开始窗口函数的定义;
  3. ARTITION BY EXTRACT(YEAR FROM REPORT_DATE): 这个部分是将数据按照年份进行分区,意味着对每一年的数据进行分组;
  4. ORDER BY MOF_DIV_CODE, FUND_TYPE_CODE, REPORT_DATE: 这里指定了窗口函数的排序顺序,首先按照 MOF_DIV_CODE、FUND_TYPE_CODE、REPORT_DATE 进行排序;
    综合起来,这个查询会对每年的数据进行分组,并按照给定的顺序计算每个分组内的累计金额,结果将返回每一行数据所在年度的累计金额
11.4.2 统计去年同期累计金额
SUM(INCOM_DAY_AMT) OVER (PARTITION BY EXTRACT(YEAR FROM ADD_MONTHS(TRUNC(REPORT_DATE), -12)) ORDER BY MOF_DIV_CODE,FUND_TYPE_CODE,ADD_MONTHS(TRUNC(REPORT_DATE), -12)) AS pre_year_to_date_total  
11.5 数据透视(pivot)操作

PIVOT 是 SQL 中的一种操作,它用于将行数据转换为列数据,可以进行数据透视(pivot)操作。PIVOT 操作常用于聚合和重新排列数据,将行转换为列以更直观地展示汇总信息。

SELECT *
FROM (
    -- 原始查询,生成需要透视的数据
    -- 包含需要进行透视操作的字段
) 
PIVOT (
    -- 聚合函数和要透视的字段
    AGGREGATE_FUNCTION(column_name)
    FOR pivot_column IN (value1 AS alias1, value2 AS alias2, ..., valueN AS aliasN)
)
  1. AGGREGATE_FUNCTION:聚合函数,例如 SUM()、COUNT()、AVG() 等;
  2. column_name:要透视的列;
  3. pivot_column:用于透视的列,即希望将其值作为新列的列;
  4. value1, value2, …, valueN:pivot_column 列中可能包含的值;
  5. alias1, alias2, …, aliasN:可选,为透视后的列指定别名;

举例:

SELECT *
FROM (
    SELECT department, employee_name, salary
    FROM employee_salary
)
PIVOT (
    SUM(salary)
    FOR department IN ('HR' AS hr_salary, 'IT' AS it_salary, 'Finance' AS finance_salary)
)

将 employee_salary 表按照部门进行透视,生成新的列 ‘HR’ AS hr_salary, ‘IT’ AS it_salary, ‘Finance’ AS finance_salary,每列包含相应部门的薪资总和


12、常用sql

  1. 金额字段增减随机数
UPDATE tablename
SET CL_CUR_AMT  = CL_CUR_AMT - FLOOR(DBMS_RANDOM.VALUE(100000000, 500000000)) where REPORT_DATE  = TO_DATE('2022-12-03','yyyy-MM-dd') ;
  1. 替换字段指定位置值

SUBSTR 函数结合 CONCAT 或 || 运算符来替换一个字段的前两位。

--CONCAT
UPDATE FM_LEDGER_AGENCY set MOF_DIV_CODE  = CONCAT('21', SUBSTR(MOF_DIV_CODE , 3)) ;

-- || 运算符
SELECT 'new' || SUBSTR(old_field, 3) AS replaced_field
FROM your_table;
  1. LISTAGG函数

LISTAGG 函数用于将多行数据聚合成一个以指定分隔符分隔的字符串。它通常与 GROUP BY 子句一起使用,用于对分组内的数据进行字符串连接。

SELECT 
  LISTAGG(sub_mof_div_code, ',') WITHIN GROUP (ORDER BY sub_mof_div_code) AS name_list 
from GAP_MOF_DIV_RELATION group by mof_div_code

这个查询的结果将返回一个名为 name_list 的列,其中包含了按照每个 mof_div_code 分组的所有 sub_mof_div_code 值,以逗号分隔,并按照 sub_mof_div_code 进行排序后的字符串。

13、ORACLE表闪回

  1. 闪回前进行查询
select * from (select * from GAP_MENU  as of timestamp to_timestamp('2023-08-17 19:50:00','YYYY-MM-DD HH24:MI:SS'))where NAME in ('三保预警管理','三保运行监测','三保风险管控','三保配置管理');
  1. 被闪回的表必须启用行移动功能
alter table GAP_MENU enable row movement;
  1. 指定时间闪回
flashback table GAP_MENU  to scn timestamp_to_scn (to_date('2023-08-17 19:50:00','yyyy-mm-dd hh24:mi:ss'));
  1. 关闭移动功能
alter table GAP_MENU  enable row movement; 

14、DBLink

DBLink 提供了一种方式来执行跨数据库的查询和操作。

14.1 创建 Database Link
--remote_db 链接指定的名称
--remote_user、remote_password是远程数据库的用户名和密码
--remote_db_host 主机
--remote_db_service 服务名
create public database link remote_db    
connect to remote_user identified by remote_password
using 
'(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST =remote_db_host)(PORT = 1521))
(CONNECT_DATA =
  (SERVER = DEDICATED)
  (SERVICE_NAME = remote_db_service))
  )';
14.2 查询远程数据库
SELECT * FROM table_name@remote_db;
14.3 执行 DML 操作
INSERT INTO remote_table@remote_db (column1, column2) VALUES (value1, value2);
14.4 删除 Database Link
DROP DATABASE LINK remote_db;
14.5 授权 Database Link
GRANT CREATE DATABASE LINK TO your_user;
14.6 确认授权
SELECT * FROM DBA_SYS_PRIVS WHERE PRIVILEGE = 'CREATE DATABASE LINK' AND GRANTEE = 'your_user';

相关推荐

  1. Oracle数据库sql记录

    2023-12-15 09:14:02       28 阅读
  2. Oracle SQL

    2023-12-15 09:14:02       30 阅读
  3. Oracle开发SQL语句

    2023-12-15 09:14:02       20 阅读
  4. oracle经典SQL查询

    2023-12-15 09:14:02       11 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-15 09:14:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-15 09:14:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-15 09:14:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-15 09:14:02       20 阅读

热门阅读

  1. 200. 岛屿数量

    2023-12-15 09:14:02       33 阅读
  2. 【C++】简化for-range的算法函数

    2023-12-15 09:14:02       40 阅读
  3. MPI和C++/Qt混用的收发消息的例子(主从模式)

    2023-12-15 09:14:02       30 阅读
  4. redis集群模糊获取缓存redisKey

    2023-12-15 09:14:02       41 阅读
  5. ES6简化对象

    2023-12-15 09:14:02       33 阅读
  6. zookeeper集群安装

    2023-12-15 09:14:02       35 阅读
  7. 华为HCIP认证H12-821题库下

    2023-12-15 09:14:02       31 阅读
  8. 【数据库设计和SQL基础语法】--查询数据--排序

    2023-12-15 09:14:02       34 阅读
  9. Web3.0和WebAssembly

    2023-12-15 09:14:02       30 阅读
  10. 【影像组学入门百问】#22—#24

    2023-12-15 09:14:02       33 阅读
  11. Git 的基本概念和使用方式。

    2023-12-15 09:14:02       35 阅读