oracle 增删改查

表的增删改查

 

创建表

CREATE TABLE [用户名.]表名

              (列名 数据类型 [default 默认值] [,...]...);

 

SQL> createtable t1 (     

  2  idnumber(10),        

  3  namevarchar2(20),    

  4 password varchar2(30));

 

SQL> createtable tab1 as select * from emp where sal>2000;

 

SQL> createtable tab2 as select * from emp where 1=2;

 

 

增加修改删除列

 

增加一列

 

    ALTER TABLE [用户名.]表名

    ADD (列名1 数据类型[DEFAULT 表达式],[列名2 数据类型],...)

 

SQL> desc t1;

 名称          是否为空? 类型

 ------------- -----------------------

 ID                      NUMBER(10)

 NAME                    VARCHAR2(20)

 PASSWORD                VARCHAR2(30)

 

SQL> altertable t1 add (sal number(10));

 

SQL> desc t1;

 名称           是否为空? 类型

 --------------- ----------------------------

 ID                       NUMBER(10)

 NAME                     VARCHAR2(20)

 PASSWORD                 VARCHAR2(30)

 SAL                      NUMBER(10)

 

SQL> altertable t1 add (job varchar(10));

 

SQL> desc t1;

 名称               是否为空? 类型

 ------------------ ------------------------

 ID                           NUMBER(10)

 NAME                         VARCHAR2(20)

 PASSWORD                     VARCHAR2(30)

 SAL                          NUMBER(10)

 JOB                          VARCHAR2(10)

 

 

修改表已存列的数据类型与列名重命名

语法格式:

 

    ALTER TABLE 表名

    MODIFY(列名1,数据类型 [DEFAULT 表达式],列名2,数据类型,...)

 

SQL> desc t1;

 名称                是否为空? 类型

 -------------------- -----------------------

 ID                            NUMBER(10)

 NAME                          VARCHAR2(20)

 PASSWORD                      VARCHAR2(30)

 SAL                           NUMBER(10)

 JOB                           VARCHAR2(10)

 

SQL> altertable t1 modify (sal varchar2(20));

 

 

SQL> desc t1;

 名称                 是否为空? 类型

 --------------------- -----------------------

 ID                             NUMBER(10)

 NAME                           VARCHAR2(20)

 PASSWORD                       VARCHAR2(30)

 SAL                            VARCHAR2(20)

 JOB                            VARCHAR2(10)

 

SQL> altertable t1 rename column job to comm;

 

 

SQL> desc t1;

 名称                 是否为空? 类型

 -------------------- -----------------------

 ID                              NUMBER(10)

 NAME                            VARCHAR2(20)

 PASSWORD                        VARCHAR2(30)

 SAL                             VARCHAR2(20)

 COMM                            VARCHAR2(10)

 

SQL> alter table t1 modify (comm number(10));

 

SQL> desc t1;

 名称                   是否为空? 类型

 ------------------------ -----------------------

 ID                                NUMBER(10)

 NAME                              VARCHAR2(20)

 PASSWORD                          VARCHAR2(30)

 SAL                               VARCHAR2(20)

 COMM                              NUMBER(10)

 

 

删除表里的某列

 

    ALTER TABLE 表名 DROP COLUMN 列名;

 

SQL> desc t1;

 名称                   是否为空? 类型

 -------------------------------------------------

 ID                                NUMBER(10)

 NAME                              VARCHAR2(20)

 PASSWORD                          VARCHAR2(30)

 SAL                               VARCHAR2(20)

 COMM                              NUMBER(10)

 

SQL> altertable t1 drop column comm;

 

 

SQL> desc t1;

 名称                     是否为空? 类型

 ------------------------ ---------------------------

 ID                                  NUMBER(10)

 NAME                                VARCHAR2(20)

 PASSWORD                            VARCHAR2(30)

 SAL                                 VARCHAR2(20)

 

 

间接删除表里已存在的列

删除表里的列特别是删除大表里的列是特耗资源的 所以 在删除一个列时 可以先把要删除的列打标记,标记成无用列 ,然后等系统不忙时在彻底删除这个列

语法格式:

    ALTERTABLE 表名 SET UNUSED COLUMN 列名;

   

把一个列设置成无用列 注意一下事项

_       必需在8i以上版本适用

_       该列被设置成无用列后,并不是删除了而是设置成无用标记而已还需要手工删除这个列

_       设置成无用列后,无法用sqlplus或是sql 语句看到的

_       oracle把设置成无用列当作删除列处理

_       可以适用DROP UNUSED (列名) 选项删除被设置成无用的列

_       因为该语句是DDL语句 没有恢复无用列的命令

 

然后 等系统不忙时在用

    ALTER TABLE 表名  DROPUNUSED COLUMN;

 

SQL> altertable t1 set unused column sal;

 

SQL> desc t1;

 名称                    是否为空? 类型

 ----------------------- ----------------------

 ID                                NUMBER(10)

 NAME                              VARCHAR2(20)

 PASSWORD                          VARCHAR2(30)

 

SQL> altertable t1 drop unused column;

 

SQL> desc t1;

 名称                      是否为空? 类型

 ------------------------ ----------------------

 ID                                UMBER(10)

 NAME                               VARCHAR2(20)

 PASSWORD                           VARCHAR2(30)

 

 

truncate table 截断表

当一个表里的数据不再需要时,可以适用truncate table 全部删除表里的数据,该语句为DDL语句 无法适用rollback来回滚数据

 

语法格式:

    TRUNCATETABLE 表名

 

特点:

_       删除表中的数据行,但保留表的结构

_       truncate 是DDL 语句,如果没有备份 数据无法恢复

_       truncate 删除表中的数据行后,立即释放磁盘空间

 

如果只删除数据,而保留数据结构适用truncate  如果既要删除数据,也要删除表结构 适用DROP

 

语法格式:

    DROPTABLE 表名

 

特点:

_       DROP删除表中的所有数据行和表的结构

_       DROP 也删除表的所有索引

_       提交所有挂起事务

_       所有基于被DROP的表的视图别名依然保留 但已经无效

 

 

对象表的重命名

语法格式:

 

    RENAME旧表名 TO 新表名

 

SQL> rename t1 to table1;

 

 

SQL> desc t1;

ERROR:

ORA-04043: 对象 t1 不存在

 

SQL> desc table1;

 名称                 是否为空? 类型

 ---------------------- ---------------------

 ID                              NUMBER(10)

 NAME                            VARCHAR2(20)

 PASSWORD                        VARCHAR2(30)

 

 

删除一个表

 

       DROPTABLE TABLENAME

 

SQL> drop table tab1;

 

SQL> select * from tab;

 

TNAME                         TABTYPE  CLUSTERID

------------------------------ ------- ----------

DEPT                           TABLE

EMP                            TABLE

BONUS                          TABLE

SALGRADE                       TABLE

BIN$DCVrueY1SDSmKp/kGnvFpA==$0 TABLE

TAB2                           TABLE

TABLE1                         TABLE

清空闪回回收站

 

SQL> purge Recyclebin;

 

回收站已清空。

 

SQL>  select * from tab;

TNAME                         TABTYPE  CLUSTERID

------------------------------ ------- ----------

DEPT                           TABLE

EMP                            TABLE

BONUS                          TABLE

SALGRADE                       TABLE

TAB2                           TABLE

TABLE1                         TABLE

 

 

插入数据

INSERT语法格式:

 

    INSERTINTO 表名 [(列名,[列名...)]] VALUES ('数值'[,'数值',...])

 

SQL> rename table1 to t1;

 

SQL> select * from t1;

 

未选定行

SQL> insert into t1 values (1,'aa',1234);

 

SQL> insertinto t1 (id,name)values(2,'bb');

 

SQL> select * from t1;

 

        ID NAME                 PASSWORD

---------- -------------------- -------------

         1 aa                   1234

         2 bb

 

UPDATE 语法格式:

 

    UPDATE表名 SET 列名=值[,列名=值] [WHERE 条件];

 

SQL> select * from t1;

 

       ID NAME                 PASSWORD

---------- -------------------- ---------

        1 aa                   1234

        2 bb

 

SQL> updatet1 set password=5555 where id=1;

 

已更新 1 行。

 

SQL> select * from t1;

       ID NAME                 PASSWORD

---------- -------------------- ------------

        1 aa                   5555

        2 bb                  

 

SQL> update t1 set password=6666 whereid=2;

 

已更新 1 行。

 

SQL> select * from t1;

 

       ID NAME                 PASSWORD

---------- -------------------- ------------

         1 aa                   5555

        2 bb                   6666

 

 

DELETE 语法:

 

    DELETE[FROM] 表名 [WHERE 条件];

 

delete 语句是删除 表里的数据

 

SQL> select * from t1;

 

       ID NAME                 PASSWORD

---------- -------------------- -------------

        1 aa                   5555

        2 bb                   6666

 

SQL> deletefrom t1 where id=1;

 

已删除 1 行。

 

SQL> select * from t1;

 

       ID NAME                 PASSWORD

---------- -------------------- -------------

        2 bb                   6666

 

SQL> deletefrom t1;

 

已删除 1 行。

 

SQL> select * from t1;

 

未选定行

SQL> insert into t1 values (1,'aa',11111);

 

SQL> insert into t1 values (2,'bb',22222);

 

SQL> select * from t1;

 

       ID NAME                 PASSWORD

---------- -------------------- -------------

        1 aa                   11111

        2 bb                   22222

 

SQL> delete from t1;

 

已删除2行。

 

SQL> select * from t1;

 

未选定行

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Oracle增删改查

(2009-11-11 10:53:53)

转载

标签:

it

 

--PL/SQL块完成增删改+
--
案例1:删除指定工资以上的员工
create or replace procedure sp_del_emp(
p_sal emp.sal%type
)
as
begin
delete from emp where sal>=p_sal;

end;
call sp_del_emp(100);
--
案例1:删除指定工资以上的员工,并且打印删除的行数
create or replace procedure sp_del_emp(
p_sal emp.sal%type
)
as
v1 number;
begin
delete from emp where sal>=p_sal;
v1 := SQL%rowcount;
dbms_output.put_line('
删除行数='||v1);
end;
call sp_del_emp(2000000);
--了解SQL对象
--这是一个隐式游标(cursor,数据所在的内存地址)对象
--隐式:自动创建,打开,关闭

create or replace procedure sp_del_emp(
p_sal emp.sal%type
)
as
v1 number;
begin
delete from emp where sal>=p_sal;
v1 := SQL%rowcount;
if(sql%isopen=false)then
dbms_output.put_line('
果然是false');
end if;
dbms_output.put_line('
删除行数='||v1);
--
如果有数据被修改(增删改)
if(sql%found)then --SQL%rowcount>0
dbms_output.put_line('
有数据被修改');
end if;

if(sql%notfound)then
dbms_output.put_line('
没有数据被修改');
end if;
end;
--小结:在块中增删改数据以后,所影响的行数通过SQL%rowcount获得

--获取更新后提交前内存中的数据
--
案例3:给指定员工工资翻番。
--
如果更新以后工资有大于8000,则不允许更新
declare
v1 emp.empno%type;
v2 emp.sal%type;
begin
v1:=&
工号;
--update emp set sal=sal*2 where empno=v1;
--select sal into v2 from emp where empno=v1;
update emp set sal=sal+1 where empno=v1;
update emp set sal=sal*2 where empno=v1
returning sal into v2;

if(v2>8000)then
--rollback;
raise_application_error(-20001,'
工资太高了!');
end if;
end;

--forall能够提高效率,但PL/SQL集合少用,所以跳过


--PL/SQL中查询数据
--分类:查询单行,查询多行

--
案例:根据工号查询姓名
declare
v1 emp.empno%type;
--v2 emp.ename%type;
v2 emp%rowtype;
begin
v1:=7788;
select * into v2 from emp
where empno = v1;
dbms_output.put_line(v2.ename);
end;

--查询单行:select..into
--特点:要求返回有且仅有1行才不出错。

--不成文技巧:用统计函数

declare
v1 emp.empno%type;
v2 emp.ename%type;
v3 emp.sal%type;
begin
v1:=7788;
select ename,sal into v2,v3 from emp
where empno = v1;
dbms_output.put_line(v3);
end;
--隐式游标
--错误处理:no_data_found,too_many_rows

--实际上:no_data_found时,返回NULL
--多行:用显式游标

--案例:查询指定部门的所有员工的工资
declare
v_total number default 0;
begin
--x:
相当于一个行变量
for x in (select sal from emp where deptno=10)
loop
v_total := v_total + x.sal;
end loop;
dbms_output.put_line('
总工资='||v_total);
end;
--缺点:不能中途退出(并不影响开发)

--注意:在工作中,尽量用SQL完成业务
declare
v_total number default 0;
begin
select sum(sal) into v_total
from emp where deptno=10;
dbms_output.put_line('
总工资='||v_total);
end;

--面试中如果不会下面的,
--
就回答:工作中只用到FOR,简单高效!

--证明实力:dofwc(手工处理显式游标)

--案例:查询指定部门的所有员工的工资
declare
cursor x is select ename,sal
from emp where deptno=10;
v1 x%rowtype;
begin
open x;
fetch x into v1;--2
个动作!
--
将第一行数据的地址赋值给行变量(后下移)
while(x%found)
loop
dbms_output.put_line(v1.ename||','||v1.sal);
fetch x into v1;
end loop;
close x;
end;

--小结:
--select.into;
--update..return into
--for,dofwc

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值