Oracle基础教程


一、数据操作

1. 虚拟表

类似于 MySQL 当我们不根据已有的表进行查询时,即可通过虚拟表的方式实现。

虚拟表查询格式如下:

select '' as <1>, ..., '' as <列n> from dual;

例如下行命结果为:

select 'Alex' as name, '12' as age from dual;

------------------- 
|   name  |  age  |
------------------- 
|   Alex  |  12   |  
------------------- 

2. 增量变更

Merge 函数可以对新增的记录进行判断,如果满足设定条件(如 ID 已存在),则进行更新操作,否则进行插入操作。通过 Merge 可以利用一条语句实现多种效果。

(1) 语法

Merge 基本语法结构如下:

merge into <t_table> <t_alias>
using <s_table> <s_alias>
on( 
   <addition> 
) 
when matched 
then
   update set <t_alias.column-1> = <s_alias.column-1>, ..., <t_alias.column-n> = <s_alias.column-n>
when not matched 
then 
   insert values(<t_alias.column-1>, ..., <s_alias.column-n>);
(2) 示例

假如目标表 TB_TEST 与来源表 TB_TEMP 如下:

-------------------------          ------------------------- 
|   id  |  name  |  age |          |   id  |  name  |  age |
-------------------------          -------------------------
|   1   |  Alex  |  18  |          |   2   |  Jack  |  30  |
|   2   |  Mark  |  22  |          |   3   |  Beth  |  42  |
-------------------------          -------------------------

我们希望的结果时将 TB_TEMP 的数据添加到 TB_TEST 中,但对于 ID 重复的数据进行更新操作,新数据则进行插入。即我们预期得到如下数据:

------------------------- 
|   id  |  name  |  age |
------------------------- 
|   1   |  Alex  |  18  |
|   2   |  Jack  |  30  |
|   3   |  Beth  |  42  |
-------------------------

最终实现的 SQL 语句如下:

merge into tb_test t 
using tb_temp p
on(t.id = p.id) 
when matched then
   update set t.name = p.name, t.age = p.age
when not matched then 
   insert values(p.id, p.name, p.age);

二、常用函数

1. 日期函数

Oracle 中常用的时间函数存在三类,描述信息参考下表:

函数 描述
to_char() 用于将时间类型字段数据转化为指定格式的字符串。
to_date() 用于将字符串按一定格式转化为时间类型。
to_timestamp() 用于将字符串按一定格式转化为时间戳类型。
-- 将时间转为字符串
select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') as tt from dual;

-- 将字符串转为日期
select to_date('2022-06-10 02:17:54', 'yyyy-mm-dd hh24:mi:ss') as tt from dual;

-- 字符串转时间戳
select to_timestamp('2022-06-10 02:17:54.123', 'yyyy-mm-dd hh24:mi:ss.ff') as tt from dual;

2. 字符函数

(1) instr()

instr(source, target): 在 source 中搜索 target 第一次出现的位置。

instr(source, target, m, n): 在 source 中第 m 个位置搜索 targetn 次出现的位置。

-- 查找第一次出现的 'a' 的位置
select instr('abc', 'b') as result from dual;

-- 第 2 位开始,查找第二次出现的 'a' 的位置
select instr('abcafga', 'a', 2, 2) from dual; 
(2) substr()

substr(source, m, n): 截取字符串 source 下标为 mn 间的内容。

-- 从第 0 位截取到第 3 位
select substr('HelloWorld', 0, 3) value from dual; 

三、分析统计

1. 数据分析

通过执行分析即可手动触发元数据表信息的更新,语句基本格式如下:

dbms_stats.gather_table_stats(
    ownname => '<schema>',
    tabname => '<table_name>',
    block_sample => true,
    granularity => 'GLOBAL',
    method_opt => 'for all indexed columns',
    cascade => true,
    degree => 10
);

上述中分析语句中涉及的参数及其描述如下:

参数 描述
ownname 所要分析的目标的表的 Schema。
tabname 所要分析的目标的表表名。
block_sample 是否用块采样代替行采样。
granularity 要收集的统计信息的粒度,针对分区表使用。
method_opt 决定 histograms 信息是怎样被统计的,默认值为 FOR ALL COLUMNS SIZE AUTO
cascade 是否收集索引的信息,默认为 FALSE。
degree 决定并行度,默认值为 null。

2. 元数据表

Oracle 元数据表 ALL_TABLES 中存放数据库表的基本信息。

如下语句查询 BUDAI 用户下所有表的元数据基本信息。

SELECT
    *
FROM
    ALL_TABLES
WHERE
    OWNER = '<schema>';

文章作者: 烽火戏诸诸诸侯
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 烽火戏诸诸诸侯 !
  目录