oracle学习笔记(十九):增、删、改 操作


回顾 SQL92/99 标准的四大类

(1)DML(数据操纵语言):select,insert,update,delete
(2)DDL(数据定义语言):create table,alter table,drop table,truncate table
(3)DCL(数据控制语言):grant select any table to scott/revoke select any table from scott
(4)TCL(事务控制语言):commit,rollback,savepoint to 回滚点


因为此章节会修改 emp 表,或删除 emp 表,所以先把 emp 表做一个备份:使用关键字 as;

下面语句表示:创建新表 xxx_emp,复制 emp 表中的结构,同时复制 emp 表中的所有数据;

SQL> create table xxx_emp
  2  as
  3  select * from emp;

表已创建。

1、向 emp 表中插入一条记录:(方式一:按表默认结构顺序,insert into 表名 values ... 语法)

SQL> insert into emp values(1111,'JACK','IT',7788,sysdate,1000,100,40);

已创建 1 行。

2、向 emp 表中插入一条记录:(方式二:按自定义顺序,insert into 表名(列名) values ... 语法)

SQL> insert into emp(ENAME,EMPNO,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO)
  2  values('MARRY',2222,'IT',7788,sysdate,1000,100,40);

已创建 1 行。

3、向 emp 表中插入 NULL 值(方式一:采用显示插入 NULL 值,明确指定字段的值为 NULL)

SQL> insert into emp values(3333,'SISI','IT',7788,sysdate,1000,NULL,40);

已创建 1 行。

4、向 emp 表中插入 NULL 值 (方式二:采用隐式插入 NULL 值,不给某个字段插入值,该字段默认就是 NULL)

SQL> insert into emp(ENAME,EMPNO,JOB,MGR,HIREDATE,SAL,DEPTNO)
  2  values('SOSO',4444,'IT',7788,sysdate,1000,40);

已创建 1 行。

5、使用 & 占位符,动态输入值:

& 可以运用在任何一个 DML 语句中;

& 是 sqlplus 工具提供的占位符,如果是字符串 或者 日期类型,需要加单引号,数字类型不需要加;

1)、在 values 子句中使用 &:

        如果在 values 语句中加了单引号,例如 values('&ename'),那么在后面输入 ename 值的时候,就不用再加了;

SQL> insert into emp values(&empno,'&ename','&job',&mgr,&hiredate,&sal,&comm,&xxxx);
输入 empno 的值:  5555
输入 ename 的值:  LILY
输入 job 的值:  IT
输入 mgr 的值:  7788
输入 hiredate 的值:  sysdate
输入 sal 的值:  1000
输入 comm 的值:  100
输入 xxxx 的值:  40
原值    1: insert into emp values(&empno,'&ename','&job',&mgr,&hiredate,&sal,&comm,&xxxx)
新值    1: insert into emp values(5555,'LILY','IT',7788,sysdate,1000,100,40)

已创建 1 行。

        如果在 values 语句中没有加单引号,例如 values(&ename),那么在后面输入 ename 值的时候,就需要加 单引号;

SQL> insert into emp values(&empno,&ename,&job,&mgr,&hiredate,&sal,&comm,&xxxx);
输入 empno 的值:  6666
输入 ename 的值:  'Lucy'
输入 job 的值:  'IT'
输入 mgr 的值:  7788
输入 hiredate 的值:  sysdate
输入 sal 的值:  1000
输入 comm 的值:  100
输入 xxxx 的值:  40
原值    1: insert into emp values(&empno,&ename,&job,&mgr,&hiredate,&sal,&comm,&xxxx)
新值    1: insert into emp values(6666,'Lucy','IT',7788,sysdate,1000,100,40)

已创建 1 行。

        如果需要在后面输入 hiredate 值的时候用 sysdate,那么 &hiredate 可以不加单引号(例如 上面的语句);

        如果在后面输入 hiredate 值的时候指定具体的日期,就需要单引号(例如 '12-10月-19');

SQL> insert into emp values(&empno,&ename,&job,&mgr,&hiredate,&sal,&comm,&xxxx);
输入 empno 的值:  7777
输入 ename 的值:  'Tom'
输入 job 的值:  'IT'
输入 mgr 的值:  7788
输入 hiredate 的值:  '12-10月-19'
输入 sal 的值:  1000
输入 comm 的值:  100
输入 xxxx 的值:  40
原值    1: insert into emp values(&empno,&ename,&job,&mgr,&hiredate,&sal,&comm,&xxxx)
新值    1: insert into emp values(7777,'Tom','IT',7788,'12-10月-19',1000,100,40)

已创建 1 行。

2)、在 from 子句中使用 &:

SQL> select * from &table;
输入 table 的值:  dept
原值    1: select * from &table
新值    1: select * from dept

DEPTNO DNAME       LOC
------ ----------- ---------
    10 ACCOUNTING  NEW YORK
    20 RESEARCH    DALLAS
    30 SALES       CHICAGO
    40 OPERATIONS  BOSTON

3)、在 select 子句中使用 &:

SQL> select empno,ename,&colname from emp;
输入 colname 的值:  sal
原值    1: select empno,ename,&colname from emp
新值    1: select empno,ename,sal from emp

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
 7900 JAMES        950
 7902 FORD        3000
 7934 MILLER      1300

已选择14行。

注意:前面 insert 插入的数据,我全部 rollback 了,所以查询到的还是原始的 14 条数据;

rollback 表示回滚,如下所示操作,后面事务中再讲;

SQL> rollback;

回退已完成。

SQL> commit;

提交完成。

4)、在 where 子句中使用 &:

SQL> select * from emp where sal > &money;
输入 money 的值:  2000
原值    1: select * from emp where sal > &money
新值    1: select * from emp where sal > 2000

EMPNO ENAME      JOB          MGR HIREDATE       SAL  COMM DEPTNO
----- ---------- ---------- ----- ------------ ----- ----- ------
 7566 JONES      MANAGER     7839 02-4月 -81    2975           20
 7698 BLAKE      MANAGER     7839 01-5月 -81    2850           30
 7782 CLARK      MANAGER     7839 09-6月 -81    2450           10
 7788 SCOTT      ANALYST     7566 19-4月 -87    3000           20
 7839 KING       PRESIDENT        17-11月-81    5000           10
 7902 FORD       ANALYST     7566 03-12月-81    3000           20

已选择6行。

5)、在 group by 和 having 子句中使用 &:(查询平均工资超过 2000 的部门)

SQL> select deptno,avg(sal)
  2  from emp
  3  group by &deptno
  4  having avg(sal) > &money;
输入 deptno 的值:  deptno
原值    3: group by &deptno
新值    3: group by deptno
输入 money 的值:  2000
原值    4: having avg(sal) > &money
新值    4: having avg(sal) > 2000

DEPTNO   AVG(SAL)
------ ----------
    20       2175
    10 2916.66667

6、删除 emp 表中的所有数据:

SQL> delete from emp;

已删除14行。

7、将 xxx_emp 表中所有 20 号部门的员工,复制到 emp 表中(批量插入:insert into 表名 select ... 语法)

SQL> insert into emp
  2  select *
  3  from xxx_emp
  4  where deptno = 20;

已创建5行。

SQL> select * from emp;

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 19-4月 -87    3000           20
 7876 ADAMS      CLERK       7788 23-5月 -87    1100           20
 7902 FORD       ANALYST     7566 03-12月-81    3000           20

8、将 'SMITH' 的工资增加 20%:('SMITH' 区分大小写)

SQL> update emp set sal=sal*1.2 where ename = upper('smith');

已更新 1 行。

9、将 'SMITH' 的工资设置为 20 号部门的平均工资(这是一个条件未知的事务,优先考虑子查询)

SQL> update emp
  2  set sal = (
  3      select avg(sal)
  4      from emp
  5      where deptno=20
  6  )
  7  where ename = 'SMITH';

已更新 1 行。

10、删除工资比 所有部门平均工资 都低的员工(这是一个条件未知的事务,优先考虑子查询)


SQL> delete
  2  from emp
  3  where sal < all(
  4      select avg(sal)
  5      from emp
  6      group by deptno
  7  );

已删除7行。

11、删除无佣金的员工:判断是否为 NULL,用关键字 is


SQL> delete from emp where comm is null;

已删除6行。

12、依据 xxx_emp 表结构,创建 emp 表的结构,但不插入数据(前提 emp 表已被删除)

下面语句表示:创建 emp 表,根据 xxx_emp 表的结构,where 条件为假 表示不复制数据;

SQL> create table emp
  2  as
  3  select * from xxx_emp where 1<>1;

表已创建。

13、将 emp 截断,再自动创建 emp 表:truncate table 表名(表结构还在,表中的数据全部删除)


SQL> truncate table emp;

表被截断。

14、向 emp 表批量插入来自 xxx_emp 表中 部门号为 20 的员工信息,只包括 empno,ename,job,sal 字段:

SQL> insert into emp(empno,ename,job,sal)
  2  select empno,ename,job,sal
  3  from xxx_emp
  4  where deptno=20;

已创建5行。

15、依据 xxx_emp 表,只创建 emp 表,不复制数据,且 emp 表只包括 empno,ename 字段:(emp 表已被删除)

SQL> create table emp(empno,ename)
  2  as
  3  select empno,ename from xxx_emp where 1=2;

表已创建。

16、向 emp 表(只含有 empno 和 ename 字段),批量插入 xxx_emp 表中部门号为 20 的员工信息:

SQL> insert into emp(empno,ename)
  2  select empno,ename from xxx_emp where deptno=20;

已创建5行。

 

drop table、truncate table、delete from table 的区别:

1、drop table 和 truncate table 都属于 DDL,delete from table 属于 DML;

2、drop table 和 truncate table 操作不可回滚,delete from table 操作可回滚;

3、drop table 和 truncate table 不可带 where 子句,delete from table 可带 where 子句;

4、drop table 是将表结构和表内容全部删除;

truncate table 是将表内容完全删除,但是表结构还在;

delete from table 删除时,表结构在,删除多少数据要看具体条件;

5、drop table 删除速度最快;truncate table 删除速度较快;delete from table 删除速度较慢,需要逐行删除;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值