oracle insert 总结

本文详细介绍了SQL中的四种插入数据的方法:标准Insert、无条件Insertall、有条件的Insert以及旋转Insert(pivoting insert),并提供了每种方法的具体语法和实例,帮助读者理解和掌握不同场景下的数据插入技巧。
1.标准Insert --单表单行插入
  语法:
  INSERT INTO table [(column1,column2,...)] VALUE (value1,value2,...)
  例子:
 
  insert into dep (dep_id,dep_name) values(1,'技术部');
 
  备注:使用标准语法只能插入一条数据,且只能在一张表中插入数据
2, 无条件 Insert all --多表多行插入
   语法:
INSERT [ALL] [condition_insert_clause]
[insert_into_clause values_clause] (subquery)
   示例:
INSERT ALL
INTO sal_history(emp_id,hire_date,salary) values (empid,hiredate,sal)
INTO mgr_history(emp_id,manager_id,salary) values (empid,hiredate,sal)
SELECT employee_id empid,hire_date hiredate,salary sal,manager_id mgr
FROM employees
WHERE employee_id>200;
3,有条件的Insert
    语法:
INSERT [ALL | FIRST]
WHEN condition THEN insert_into_clause values_clause
[WHEN condition THEN] [insert_into_clause values_clause]
......
[ELSE] [insert_into_clause values_clause]
Subquery;
    示例:
Insert All
when id>5 then into z_test1(id, name) values(id,name)
when id<>2 then into z_test2(id) values(id)
else into z_test3 values(name)
select id,name from z_test;
当使用ALL关键字时,oracle会从上至下判断每一个条件,当条件满足时就执行后面的into语句
在上面的例子中,如果ID=6 那么将会在z_test1中插入一条记录,同时也在z_test2中插入一条记录
    备注:
      当使用FIRST关键字时,oracle会从上至下判断每一个条件,当遇到第一个满足时就执行后面的into语句,
      同时中断判断的条件判断,在上面的例子中,如果ID=6,仅仅会在z_test1中插入一条数据
4, 旋转Insert (pivoting insert)
create table sales_source_data (
employee_id number(6),
week_id number(2),
sales_mon number(8,2),
sales_tue number(8,2),
sales_wed number(8,2),
sales_thur number(8,2),
sales_fri number(8,2)
);
insert into sales_source_data values (176,6,2000,3000,4000,5000,6000);
create table sales_info (
employee_id number(6),
week number(2),
sales number(8,2)
);
看上面的表结构,现在将要sales_source_data表中的数据转换到sales_info表中,这种情况就需要使用旋转Insert
示例如下:
insert all
into sales_info values(employee_id,week_id,sales_mon)
into sales_info values(employee_id,week_id,sales_tue)
into sales_info values(employee_id,week_id,sales_wed)
into sales_info values(employee_id,week_id,sales_thur)
into sales_info values(employee_id,week_id,sales_fri)
select employee_id,week_id,sales_mon,sales_tue,
sales_wed,sales_thur,sales_fri
from sales_source_data;
从该例子可以看出,所谓旋转Insert是无条件 insert all 的一种特殊应用,但这种应用被oracle官方,赋予了一个pivoting insert的名称,即旋转insert
<think>嗯,用户现在想了解Oracle数据库中INSERT操作的使用方法和示例。首先,我需要回顾一下OracleINSERT语法,确保自己记得准确。基本的INSERT INTO语句结构应该是向表中插入单行数据,指定列名和对应的值。比如INSERT INTO table_name (column1, column2) VALUES (value1, value2); 这部分应该没问题,但要注意是否需要处理默认值或者省略某些列的情况。 然后,用户可能还关心批量插入的方法。记得Oracle支持多种批量插入方式,比如使用SELECT子句从其他表选择数据插入,或者用INSERT ALL进行多表插入。这里需要检查是否正确区分了无条件插入和有条件的插入,比如INSERT FIRST和INSERT ALL的不同。比如无条件多表插入是每个目标表都会插入所有查询结果的数据,而有条件的话会根据WHEN子句来决定插入哪个表。 另外,用户提供的引用中提到ALL into_clause,这是指INSERT ALL后面跟多个INTO子句,每个子句对应一个目标表,执行时每个子句都会为子查询返回的每一行执行一次。这个可能需要举例说明,比如同时向多个表中插入数据的情况。此外,引用还提到了单表插入和多表插入的区别,需要明确说明。 用户还可能想知道INSERT操作的一些高级用法,比如插入默认值、使用子查询插入多行数据,以及带条件的插入。比如,使用DEFAULT关键字或者省略列来插入默认值,或者通过子查询一次性插入多行数据,这样可以提高效率。同时,带条件的插入比如INSERT FIRST WHEN条件 THEN INTO ... ELSE INTO ...,这时候需要说明条件判断的逻辑。 需要注意的是用户提到的引用中关于ROWNUM的限制,这可能和INSERT操作关联不大,但需要避免混淆。例如,用户可能在使用子查询插入时涉及到ROWNUM,但根据引用2,ROWNUM只能用于<或<=,因此在INSERT的SELECT子句中使用ROWNUM时要注意这一点,不过这可能更多影响查询部分,而不是INSERT本身。 另外,用户可能在实际使用中遇到性能问题,比如批量插入大数据量时的优化方法。这时候可以提到使用多表插入或者批量绑定(BULK COLLECT)等技术,但具体是否在示例中包含这些可能需要看用户的接受程度。不过根据问题,用户主要需要语法和示例,所以可能暂时不需要深入性能优化,但相关问题可以生成。 还要检查是否有遗漏的INSERT类型,比如多表插入中的有条件插入和无条件插入的区别,以及INSERT INTO ... SELECT的正确用法。需要确保示例代码的语法正确,比如在INSERT ALL时是否需要结束子句,比如SELECT ... FROM DUAL等。 最后,生成相关问题时要考虑用户可能进一步的问题,比如性能分析、优化方法、应用场景等,类似之前快速排序的例子。例如,如何提升INSERT的性能,或者不同插入方式的适用场景。 总结一下,回答的结构应该是先介绍基本语法,再逐步展开到高级用法,每种情况都给出示例,并确保引用相关的参考资料,比如引用1、3中的多表插入和无条件插入。同时,注意使用正确的LaTeX格式,数学公式用$...$,独立公式用$$...$$,不过这里可能用不到数学公式,主要是在代码块和排版上注意。</think>### Oracle数据库INSERT操作详解 #### 一、基础语法 1. **单行插入** 向指定列插入单行数据: ```sql INSERT INTO employees (emp_id, name, salary) VALUES (1001, '张三', 5000); ``` 省略列名时需按表结构顺序提供所有字段值: ```sql INSERT INTO departments VALUES (10, '技术部', '北京'); ``` 2. **插入默认值** 使用`DEFAULT`关键字或省略列名: ```sql INSERT INTO orders (order_id, create_time) VALUES (2001, DEFAULT); -- create_time字段需预设默认值 ``` #### 二、批量插入 1. **通过子查询插入多行** 从其他表筛选数据插入: ```sql INSERT INTO sales_history SELECT product_id, sale_date, quantity FROM sales WHERE sale_date >= DATE '2023-01-01'; ``` 2. **无条件多表插入** 同时向多个表插入相同数据(需引用[^1][^3]): ```sql INSERT ALL INTO emp_archive (empno, ename) VALUES (empno, ename) INTO emp_active (empno, job) VALUES (empno, job) SELECT empno, ename, job FROM emp WHERE hire_date > DATE '2020-01-01'; ``` 3. **有条件插入** 使用`WHEN`条件控制插入路径: ```sql INSERT FIRST WHEN salary > 10000 THEN INTO high_salary_emp WHEN dept_id = 10 THEN INTO tech_dept_emp ELSE INTO other_emp SELECT * FROM employees; ``` #### 三、特殊场景 1. **插入包含ROWNUM的数据** 需在子查询中处理(引用[^2]): ```sql INSERT INTO ranked_employees SELECT ROWNUM, empno, sal FROM (SELECT empno, sal FROM emp ORDER BY sal DESC) WHERE ROWNUM <= 10; -- 仅插入前10行 ``` 2. **插入大对象(LOB)** 使用`EMPTY_BLOB()`初始化: ```sql INSERT INTO documents (doc_id, content) VALUES (3001, EMPTY_BLOB()); ``` #### 四、性能注意事项 - 批量插入时优先使用`INSERT INTO ... SELECT`替代逐行插入 - 多表插入语法可减少数据库访问次数[^3] - 大数据量插入建议结合`/*+ APPEND */`提示使用直接路径插入
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值