在oracle 中怎么处理以下数据
发布网友
发布时间:2022-04-07 20:34
我来回答
共3个回答
懂视网
时间:2022-04-08 00:55
):insert delete update select
SQL> 2. DDL(Data Definition Language 数据定义语言): create table,create view,create user
SQL> alter table,alter user
SQL> drop table,drop user
SQL> 3. DCL(Data Control Language 数据控制语言): commit rollback truncate
SQL> */
SQL> host cls
插入 insert语句
语法
INSERT INTO table[(column [,column...])]
VALUES (value[, value...]);
使用INSERT 语句向表中插入数据。
使用这种语法一次只能向表中插入一条数据。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - -
INSERT INTO departments(department_id, department_name,
manager_id, location_id)
VALUES (70, ‘PublicRelations‘, 100, 1700);
为每一列添加一个新值。
按列的默认顺序列出各个列的值。
在INSERT 子句中随意列出列名和他们的值。
字符和日期型数据应包含在单引号中。
- - - - - - - - - - - -- - - - - - - - - - - -- - - - - - - - - - - -- - - - - - - - - - - -- - - - - - - - - - - -- - - - - - - - - - - -
SQL> --插入 insert
SQL> desc emp
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
EMPNO NOT NULL NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
SQL> insert into emp(empno,ename,job,mgr,hiredate,sal,comm,deptno)
2 values (1001,‘Tom‘,‘CLERK‘,7839,sysdate,2000,100,10);
已创建 1 行。
隐式插入空值 显式插入空值
?隐式方式:在列名表中省略该列的值。
?显式方式:在VALUES 子句中指定空值。
SQL> --隐式插入空值 显式插入空值
SQL> insert into emp(empno,ename,sal,deptno) values(1002,‘Mary‘,2000,10);
SQL> insert into emp(empno,ename,sal,deptno) values(1003,‘Mary‘,null,10);
地址符的应用
SQL> --地址符 &
l在SQL
语句中使用& 变量指定列值。
l&
变量放在VALUES子句中。
SQL> insert into emp(empno,ename,sal,deptno)
2 values(&empno,&ename,&sal,&deptno);
输入 empno 的值: 1004
输入 ename 的值: ‘Mike‘
输入 sal 的值: 2000
输入 deptno 的值: 10
原值 2: values(&empno,&ename,&sal,&deptno)
新值 2: values(1004,‘Mike‘,2000,10)
已创建 1 行。
SQL> /
输入 empno 的值: 1005
输入 ename 的值: ‘aaa‘
输入 sal 的值: 3000
输入 deptno 的值: 20
原值 2: values(&empno,&ename,&sal,&deptno)
新值 2: values(1005,‘aaa‘,3000,20)
已创建 1 行。
给&xxx加引号之后,在后面赋值可不需要加引号:
SQL> insert into emp(empno,ename,sal,deptno) values(&empno,‘&ename‘,&sal,&deptno);
输入 empno 的值: 1006
输入 ename 的值: Tomaa
输入 sal 的值: 1500
输入 deptno 的值: 10
原值 1: insert into emp(empno,ename,sal,deptno) values(&empno,‘&ename‘,&sal,&deptno)
新值 1: insert into emp(empno,ename,sal,deptno) values(1006,‘Tomaa‘,1500,10)
已创建 1 行。
SQL> host cls
&可用于语句的任何地方:
SQL> select empno,ename,&unknown
2 from emp;
输入 unknown 的值: sal
原值 1: select empno,ename,&unknown
新值 1: select empno,ename,sal
EMPNO ENAME SAL
---------- ---------- ----------
7369 SMITH 800
7499 ALLEN 1600
7521 WARD 1250
7566 JONES 2975
7654 MARTIN 1250
7698 BLAKE 2850
7782 CLARK 2450
7788 SCOTT 3000
7839 KING 5000
7844 TURNER 1500
7876 ADAMS 1100
EMPNO ENAME SAL
---------- ---------- ----------
7900 JAMES 950
7902 FORD 3000
7934 MILLER 1300
1001 Tom 2000
1002 Mary 2000
1003 Mary
1004 Mike 2000
1005 aaa 3000
1006 Tomaa 1500
已选择20行。
SQL> /
输入 unknown 的值: job
原值 1: select empno,ename,&unknown
新值 1: select empno,ename,job
EMPNO ENAME JOB
---------- ---------- ---------
7369 SMITH CLERK
7499 ALLEN SALESMAN
7521 WARD SALESMAN
7566 JONES MANAGER
7654 MARTIN SALESMAN
7698 BLAKE MANAGER
7782 CLARK MANAGER
7788 SCOTT ANALYST
7839 KING PRESIDENT
7844 TURNER SALESMAN
7876 ADAMS CLERK
EMPNO ENAME JOB
---------- ---------- ---------
7900 JAMES CLERK
7902 FORD ANALYST
7934 MILLER CLERK
1001 Tom CLERK
1002 Mary
1003 Mary
1004 Mike
1005 aaa
1006 Tomaa
已选择20行。
SQL> select *
2 from &t;
输入 t 的值: dept
原值 2: from &t
新值 2: from dept
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> /
输入 t 的值: salgrade
原值 2: from &t
新值 2: from salgrade
GRADE LOSAL HISAL
---------- ---------- ----------
1 700 1200
2 1201 1400
3 1401 2000
4 2001 3000
5 3001 9999
SQL> host cls
从其它表中拷贝数据
·在INSERT语句中加入子查询。
INSERT INTO
sales_reps(id, name, salary,
commission_pct)
SELECT
employee_id,
last_name, salary,
commission_pct
FROM employees
WHERE
job_id LIKE ‘%REP%‘;
·不必书写 VALUES
子句。
·子查询中的值列表应与INSERT 子句中的列名对应
SQL> --一次插入(拷贝)多条数据?
SQL> create table emp10 as select * from emp where 1=2; (因为1=2不成立,所以不会拷贝任何数据,但是会将表结构拷贝过来!)
表已创建。
SQL> desc emp10
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
EMPNO NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
SQL> insert into emp10
2 select * from emp where deptno=10;
已创建3行。
SQL> select * from emp10;
EMPNO ENAME JOB MGR HIREDATE SAL COMM
---------- ---------- --------- ---------- -------------- ---------- ----------
DEPTNO
----------
7782 CLARK MANAGER 7839 09-6月 -81 2450
10
7839 KING PRESIDENT 17-11月-81 5000
10
7934 MILLER CLERK 7782 23-1月 -82 1300
10
SQL> --在插入中使用子查询
SQL> create table emp20 as select * from emp where deptno=20;
表已创建。
SQL> select * from emp20;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ----- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7788 SCOTT ANALYST 7566 13-7月 -87 3000 20
7876 ADAMS CLERK 7788 13-7月 -87 1100 20
7902 FORD ANALYST 7566 03-12月-81 3000 20
更新数据 update
·使用UPDATE 语句更新数据。
UPDATE
table
SET
column =
value [,
column=
value, ...]
[WHERE
condition];
·可以一次更新多条数据。
使用 WHERE 子句指定需要更新的数据
如果省略WHERE子句,则表中的所有数据都将被更新
可在update中使用子查询
删除:delete
SQL> --删除:delete
SQL> delete from emp10;
已删除3行。
SQL> truncate table emp20;
表被截断。
SQL> /*
SQL> 1. delete逐条删除;truncate先摧毁,再重建
SQL> 2. delete 不会释放空间;truncate会
SQL> 3. delete会产生碎片;truncate不会
SQL> 4. deleted可以闪回;truncate不可以闪回
SQL> */
SQL> select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ----- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7788 SCOTT ANALYST 7566 13-7月 -87 3000 20
7839 KING PRESIDENT 17-11月-81 5000 10
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7876 ADAMS CLERK 7788 13-7月 -87 1100 20
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ----- ---------- ----------
7900 JAMES CLERK 7698 03-12月-81 950 30
7902 FORD ANALYST 7566 03-12月-81 3000 20
7934 MILLER CLERK 7782 23-1月 -82 1300 10
已选择14行。
SQL> set feedback off
SQL> select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ----- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
7566 JONES MANAGER 7839 02-4月 -81 2975 20
7654 MARTIN SALESMAN 7698 28-9月 -81 1250 1400 30
7698 BLAKE MANAGER 7839 01-5月 -81 2850 30
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7788 SCOTT ANALYST 7566 13-7月 -87 3000 20
7839 KING PRESIDENT 17-11月-81 5000 10
7844 TURNER SALESMAN 7698 08-9月 -81 1500 0 30
7876 ADAMS CLERK 7788 13-7月 -87 1100 20
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ----- ---------- ----------
7900 JAMES CLERK 7698 03-12月-81 950 30
7902 FORD ANALYST 7566 03-12月-81 3000 20
7934 MILLER CLERK 7782 23-1月 -82 1300 10
SQL> @c:sql.sql
SQL> select count(*) from testdelete;
COUNT(*)
----------
5000
SQL> set timing on
SQL> delete from testdelete;;
delete from testdelete;
*
第 1 行出现错误:
ORA-00911: 无效字符
已用时间: 00: 00: 00.00
SQL> delete from testdelete;
已用时间: 00: 00: 00.04
SQL> drop table testdelete purge;
已用时间: 00: 00: 01.36
SQL> set timing on
SQL> set timing off
SQL> @c:sql.sql
SQL> set timing on
SQL> truncate table testdelete;
已用时间: 00: 00: 03.21
SQL> set timing off
SQL> host cls
Oracle中的事务
事务知识点
数据库事务由以下的部分组成:
一个或多个DML 语句
一个DDL(Data Definition Language – 数据定义语言) 语句
一个DCL(Data Control Language – 数据控制语言) 语句
1. 起始标志: DML语句-自动开启
2. 结束标志:提交: 显式提交 commit
隐式提交: DDL(create table,drop user,..)
回滚:显式回滚 rollback
隐式回滚: 掉电,宕机,非正常退出
使用COMMIT
和ROLLBACK语句,我们可以:
l确保数据完整性。
l数据改变被提交之前预览。
l将逻辑上相关的操作分组。
自动提交在以下情况中执行:
?DDL 语句。
?DCL 语句。
?不使用 COMMIT 或 ROLLBACK 语句提交或回滚,正常结束会话exit。
会话异常结束或系统异常会导致自动回滚。
保存点
使用SAVEPOINT 语句在当前事务中创建保存点。
使用ROLLBACK TOSAVEPOINT 语句回滚到创建的保存点。
SQL> create table testsavepoint
2 (tid number,tname varchar2(20));
SQL> set feedback on
SQL> insert into testsavepoint values(1,‘Tom‘);
已创建 1 行。
SQL> insert into testsavepoint values(2,‘Mary‘);
已创建 1 行。
SQL> savepoint a;
保存点已创建。
SQL> insert into testsavepoint values(3,‘Mike‘);
已创建 1 行。
SQL> rollback to savepoint a;
回退已完成。
SQL> select * from testsavepoint;
TID TNAME
---------- --------------------
1 Tom
2 Mary
已选择2行。
SQL> commit;
提交完成。
JDBC中如何使用保存点
SQL> /*
SQL> JDBC中使用存储点
SQL> Connection conn = ...
SQL> conn.setAutoCommit(false);
SQL> Savepoint sp = conn.setSavepoint("aaa")
SQL> DML
SQL>
SQL> conn.rollback(sp);
SQL> */
SQL> spool off
Oracle学习(8):处理数据
标签:oracle 学习笔记 数据库
热心网友
时间:2022-04-07 22:03
没有试验,不敢保证第2种方法正确:
1. 写一段pl/sql,倒序取出id的数据,
循环:
当本行data不为null,赋予变量
当本行data为null,则将变量中的data值赋予当前行
2. 反复执行下来sql,直到无数据行被更新:
update table a set data=(
select data from table b where b.id -1 = a.id and b.date is not null
)
where date is null
热心网友
时间:2022-04-07 23:21
多次执行:update tablename t1 set data=(select data from tablename t2 where t2.id=t1.id+1 ) where t1.data is null 直至填满来自:求助得到的回答