回顾 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 删除速度较慢,需要逐行删除;