Oracle表的管理
表名和列的命名规则
- 必须以字母开头
- 长度不能超过30字符
- 不能使用Oracle的保留字
- 只能使用如下字符:A-Z,a-z,0-9,$,#等
Oracle的数据类型
类型 | 字段 | 特性 | 说明 | 示例 |
---|---|---|---|---|
字符型 | char | 查询速度最快 | 固定长度,最大2000字符 | char(10),"小明",前4个字符放"小明", 后6个字符用空格补全 |
varchar2 | 最节省空间 | 可变长度,最大4000字节 | varchar2(10),"小明";Oracke只分配4个字节放"小明" | |
nvarchar2 | 兼容性更强 | 可变长度,最大2000字符 | 单位为字符,一个汉字和一个字母均为一个字符(2个字节) | |
clob | 可存储最大空间 | 字符型大对象,最大4G | 超过4000字符的内容,用此类型存储 | |
数字型 | Number | 可以表示整数,也可以表示小数 | 范围-(1038)~1038 | Number(5,2) 表示5位数,有2位小数:-999.99~999.99 Number(5) 表示5位数整数:-99999~99999 |
日期类型 | date | 完整时间,精确到秒 | 包含年月日时分秒 | 最常用的日期类型,适用于大部分情况 |
timestamp | 精度非常高,精确到毫秒 | 表示时间戳 | 常用于银行等对时间精度要求特别高的情况 | |
图片类型 | blob | 二进制数据 | 可以存放图片、声音、视频 | 一般不将图片等文件存储到数据库,只存文件的路径, 文件存储在一个目录中,通过路径来调取 保密性高的文件一定要存储到数据库中 |
表操作
创建表格
- 创建一个学生表
create table student --表名student ( xh number(4), --学号 xm varchar2(20), --姓名 sex char(2), --性别 birthady date, --出生日期 sal number(7,2) --奖学金 );
- 创建一个班级表
create table classes --表名classes ( classid number(2), --班级ID cname varchar(40), --班级名称 );
- 子查询快速建表
- 语法:create table 新表名 (新字段1,新字段2...新字段n) as select 字段1,字段2...字段n from 表名;
- 复制整张表
create table myemp as select * from emp
- 根据子表部分字段建表
create table myemo(empno,ename,sal) as select empno,ename,sal from emp where deptno=10
- 查询表记录数
- 查询当前用户所有表记录数
select t.table_name,t.num_rows from user_tables t
- 查询数据库所有表记录数
select t.table_name,t.num_rows from dba_tables t
修改表
- 添加一个字段
- alter table student add (classid number(2));
- 删除一个字段(不要轻易使用)
- alter table student drop column sal;
- 修改字段长度
- alter table student modify (xm varchar2(30));
- 修改字段类型(不能有数据)
- alter table student modify (xm char(30));
- 修改字段名称
- alter table student rename column old_name to new_name;
- 修改表的名称
- rename student to Newstudent;
- 删除表
- drop table student;
- 修改表备注
- comment on table 表名 is '表的注释信息';
- 修改字段备注
- comment on column 表名.字段名 is '字段的注释信息';
- 获取表所有字段名
- select (column_name) from user_tab_columns where table_name= upper('表名')
- 获取表所有字段名、字段类型,字段长度
- select COLUMN_NAME,DATA_TYPE,DATA_PRECISION from user_tab_columns where table_name= upper('t_wms_bas_whsart_store')
数据操作
添加数据
- 所有字段都添加数据
- insert into student values ('A001','张三','男','01-5月-20',10)
- 部分字段添加数据
- insert into student (xh,xm,sex,birthday) values ('A002','李四','男','01-5月-20')
- 注意:Oracle中默认的日期格式是'DD-MON-YY',月份必须带'月'
- 修改日期默认格式:
- alter session set nls_date_format = 'yyyy-mm-dd';
- 修改后添加数据
- insert into student values('A003','李梅','女','2020-10-28',20);
- 修改日期默认格式:
- 添加空值
- insert into student values('A004','小红','女','2020-10-28',null);
- 查询字段为空的语句
- select * from student where sal is null;
- 查询字段为非空语句
- select * from student where sal is not null;
- 添加多条数据
- 当使用values子句时,一次只能插入一行数据。当使用子查询插入数据时,一条insert语句可以插入大量的数据
- 当处理行迁移或装载外部表的数据到数据库时,可以用子查询来插入数据
- 插入部分字段
insert into 表2(字段1, 字段2) select 字段1, 字段2 from 表1 where 条件;
- 插入所有字段
insert into 表2 select * from 表1 where 条件;
- 示例
>>> 创建一个表myemp2,包含字段myid, myname, mydept create table myemp2(myid number(4), myname varchar2(50), mydept number(5)); >>> 给新表批量插入数据 insert into myemp2(myid,myname) select empno,ename from emp where deptno=10; >>> 将所有字段数据全部插入到新表 insert into myemp2 select * from emp where deptno=10;
修改数据
- 修改一个字段
- 语法:update 表名 set 字段=值 where 条件;
- update student set sex='女' where xh='A001';
- 修改多个字段
- 语法:update 表名 set 字段1=值1,字段2=值2 where 条件;
- update student set sex='男',birthday='2019-01-01' where xh='A001';
- 修改含有null值的数据
- 语法:update 表名 set 字段=值 where 字段 is null;
- update student set sex='男' where sal is null;
- 关联表更新
update test1 set (test1.name,test1.age)= (select test2.name,test2.age from test2 where test2.id=test1.id)
- 用子查询更新多条数据
- 使用Update语句更新数据时,既可以使用表达式或者数值直接修改数据,也可以使用子查询修改数据
案例:希望员工scott的岗位、工资、补助与smith员工一样 update myemp set (job, sal, comm) = (select job, sal, comm from myemp where ename = 'SMITH') where ename = 'SCOTT'
删除数据
- 删除所有记录,表结构还在
- delete from student;
- 写日志,可以恢复,速度慢
- 删除表结构和数据
- drop table student;
- 删除一条记录
- delete from student where xh='A001';
- 删除所有记录,表结构还在
- truncate table student;
- 不写日志,无法恢复,速度快
- 恢复删除记录
- 通过回滚命令:Rollback
- 前提必须先设定保存点:Savepoint a;
- 回滚到保存点:Rollback to a;
- 此操作,让数据恢复到设置回滚点的时候,之后所有操作都丢失
查询数据
功能 | 关键字 | 语法 |
---|---|---|
查看表结构 | desc | desc 表名; |
查询所有数据 | select * from 表名 | |
查询指定列数据 | select 字段1,字段2,... from 表名 | |
去重查询 | distinct | select distinct 字段1,字段2,...from 表名 |
带条件查询 | where | select * from 表名 where 条件表达式 |
多条件查询 | and | select * from 表名 where 条件表达式1 and 条件表达式2 |
多条件查询 | or | select * from 表名 where 条件表达式1 or 条件表达式2 |
模糊查询 | [not]like | select * from 表名 where 字段 like '%元素%' |
关键字查询 | [not]in | select * from 表名 where 字段 in ('元素1','元素2',...) |
范围查询 | between and | select * from 表名 where 字段 between 值1 and 值2 |
空值查询 | is [not] null | select * from 表名 where 字段 is [not] null |
查询结果排序 | order by [ASC/DESC] | select * from 表名 order by 字段 [ASC/DESC] |
分组查询 | group by | select 分组字段,统计字段 from 表名 group by 分组字段 |
分组查询筛选 | group by 字段 having 条件表达式 | select 分组字段,统计字段 from 表名 group by 分组字段 having 统计字段条件表达式 |
分组查询汇总 | group by rollup(分组字段) | select 分组字段,统计字段 from 表名 group by rollup(分组字段) |
分组查询合并 | wm_concat(to_char(合并字段)) | select 分组字段,wm_concat(to_char(合并字段)) from t_bas_user group by 分组字段; |
分页查询 | rownum | select * from (select t.* rownum rn from (select * from 表名) t where rownum<=最大行数) where rn>=最小行数 |
- 查看表结构
- 语法:desc 表名;
- desc dept;
- 语法:desc 表名;
- 查询所有列数据
- 语法:select * from 表名;
- select * from dept;
- 语法:select * from 表名;
- 查询指定列数据
- 语法:select 列1,列2,列3 from 表名;
- select ename, sal, job, deptno from emp;
- 语法:select 列1,列2,列3 from 表名;
- 取消重复行
- 语法:select distinct 列1, 列2 from 表名;
- select distinct deptno, job from emp;
- 小练习
- 表格结构:
- 表数据
>>> emp表 EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ----- ---------- --------- ----- ----------- --------- --------- ------ 7369 SMITH CLERK 7902 1980/12/17 800.00 20 7499 ALLEN SALESMAN 7698 1981/2/20 1600.00 300.00 30 7521 WARD SALESMAN 7698 1981/2/22 1250.00 500.00 30 7566 JONES MANAGER 7839 1981/4/2 2975.00 20 7654 MARTIN SALESMAN 7698 1981/9/28 1250.00 1400.00 30 7698 BLAKE MANAGER 7839 1981/5/1 2850.00 30 7782 CLARK MANAGER 7839 1981/6/9 2450.00 10 7788 SCOTT ANALYST 7566 1987/4/19 3000.00 20 7839 KING PRESIDENT 1981/11/17 5000.00 10 7844 TURNER SALESMAN 7698 1981/9/8 1500.00 0.00 30 7876 ADAMS CLERK 7788 1987/5/23 1100.00 20 7900 JAMES CLERK 7698 1981/12/3 950.00 30 7902 FORD ANALYST 7566 1981/12/3 3000.00 20 7934 MILLER CLERK 7782 1982/1/23 1300.00 10 >>>dept表 DEPTNO DNAME LOC ------ -------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON
- 查询SMITH的薪水,岗位,所在部门
select sal, job, deptno from emp where ename='smith'; >>> 查询结果: SAL JOB DEPTNO --------- --------- ------ 查询不到任何数据 因为表格中SMITH为大写,SQL语句中为小写,所以查询不到 select sal, job, deptno from emp where ename='SMITH'; >>> 查询结果: SAL JOB DEPTNO --------- --------- ------ 800.00 CLERK 20
- 显示每个雇员的年工资(月工资*月份+奖金*月份)
select sal*12+comm*12 as "年薪",ename as "姓名",comm as "奖金" from emp; >>> 查询结果: 年薪 姓名 奖金 ---------- ---------- --------- SMITH 22800 ALLEN 300.00 21000 WARD 500.00 JONES 31800 MARTIN 1400.00 BLAKE CLARK SCOTT KING 18000 TURNER 0.00 ADAMS JAMES FORD MILLER >> 该结果可以看出来,奖金为空的,年薪也为空 >> Oracle运算特性:凡是运算过程中有null值,结果均为null >> 解决该问题,用nvl函数,nvl(x, 0):如果x的值为null,则替换成0; select ename as "姓名", sal*12+nvl(comm)*12 as "年薪",sal as "工资",comm as "奖金" from emp; 姓名 年薪 工资 奖金 ---------- ---------- --------- --------- SMITH 9600 800.00 ALLEN 22800 1600.00 300.00 WARD 21000 1250.00 500.00 JONES 35700 2975.00 MARTIN 31800 1250.00 1400.00 BLAKE 34200 2850.00 CLARK 29400 2450.00 SCOTT 36000 3000.00 KING 60000 5000.00 TURNER 18000 1500.00 0.00 ADAMS 13200 1100.00 JAMES 11400 950.00 FORD 36000 3000.00 MILLER 15600 1300.00
- 语法:select distinct 列1, 列2 from 表名;
- 带条件查询 where
- 语法:
- select 字段 from 表名 where 条件;
- 多条件用 and 或者 or
- 小练习
- 查询工资大于3000的员工
select ename, sal from emp where sal > 3000;
- 查询在1982.1.1之后入职的人员
用alter session set nls_date_format = 'yyyy-mm-dd';修改日期格式,仅仅是临时生效,数据库重启之前均有效,重启之后失效select ename, hiredate from emp where hiredate > '1-1月-1982';
- 查询工资在2000到5000之间的人员
select * from emp where sal>=2000 and sal<=5000;
- 语法:
- Where条件中使用 Like
字符 说明 % 0到多个任意字符 _ 单个任意字符 - 小练习
- 查询首字母为S的员工姓名和工资
select ename, sal from emp where ename like 'S%';
- 查询第三个字符为大写O的员工姓名和工资
select ename, sal from emp where ename like '__O%';
- Where条件中使用 In
- 查询员工编码为7499、7698、7876的员工姓名和工资
select ename, sal from emp where empno in (7499,7698,7876);
- 查询员工编码为7499、7698、7876的员工姓名和工资
- Where条件中使用 is null
- 查询没有上级的雇员的情况
select * from emp where mgr is null;
- 查询没有上级的雇员的情况
- Where条件中使用逻辑操作符(and,or)
- 查询工资高于500或者岗位为MANAGER,同时还要满足姓名首字母为J的雇员信息
select * from emp where (sal > 500 or job = 'MANAGER') and ename like 'J%';
- 查询工资高于500或者岗位为MANAGER,同时还要满足姓名首字母为J的雇员信息
- Order by 语句(排序)
- (升序) 如何按照工资的从低到高的顺序显示员工信息
select * from emp order by sal [asc];
- (降序) 如何按照工资从高到低的顺序显示员工信息
select * from emp order by sal desc;
- 按照部门号升序,而员工工资降序排列
select * from emp order by empno [asc], sal desc;
- 使用列的别名进行排序
select ename, (sal+ nvl(comm,0))*12 as "年薪" from emp order by "年薪";
- (升序) 如何按照工资的从低到高的顺序显示员工信息
- Oracle表的复杂查询——单表查询
- 说明:在实际应用中,经常需要执行复杂的数据统计,经常需要显示多张表的数据。
- 数据分组:
- Max(最大值),Min(最小值),Avg(平均值),Sum(总数),Count(个数)
1、查询所有员工中最高工资和最低工资
2、查询所有员工的总工资、平均工资和总人数select max(sal), min(sal) from emp;
3、查询所有员工中最高工资的员工姓名和工资select sum(sal), avg(sal), Count(ename) from emp;
4、查询所有员工中工资高于平均工资的员工信息selcet ename, sal from emp where sal = (select Max(sal) from emp);
5、查询所有员工中工资高于平均工资的员工信息并按工资升序排序select * from emp where sal>(select avg(sal) from emp);
select * from emp where sal>(select avg(sal) from emp) order by sal;
- Max(最大值),Min(最小值),Avg(平均值),Sum(总数),Count(个数)
- group by 和 having子句
- group by:用于对查询的结果分组统计
- having子句:用于限制分组显示结果
1、显示每个部门的平均工资和最高工资
2、显示每个部门、每个岗位的平均工资,并按部门代号排序select avg(sal), max(sal), deptno from emp group by deptno; >>> 查询结果 AVG(SAL) MAX(SAL) DEPTNO ---------- ---------- ------ 1566.66666 2850 30 2175 3000 20 2916.66666 5000 10
3、显示平均工资低于2000的部门号和它的平均工资select avg(sal) from emp group by deptno, job order by deptno; >>> 查询结果 AVG(SAL) MAX(SAL) DEPTNO JOB ---------- ---------- ------ --------- 1300 1300 10 CLERK 2450 2450 10 MANAGER 5000 5000 10 PRESIDENT 3000 3000 20 ANALYST 950 1100 20 CLERK 2975 2975 20 MANAGER 950 950 30 CLERK 2850 2850 30 MANAGER 1400 1600 30 SALESMAN
select avg(sal), max(sal),deptno from emp group by deptno having avg(sal)>2000; >>> 查询结果 AVG(SAL) MAX(SAL) DEPTNO ---------- ---------- ------ 2175 3000 20 2916.66666 5000 10
- 数据分组总结
- 分组函数(Max、Min、Avg、Sum、Count)只能出现在选择列表、having、order by子句中
- 如果在select语句中,同时包含有group by、having、order by,那么他们的顺序是:group by,having,order by
select avg(sal), max(sal), deptno, (sal+nvl(comm,0))*12 from emp group by deptno, (sal+nvl(comm,0))*12 having avg(sal)>1000 order by max(sal);
- 在选择列中如果有列、表达式、分组函数,那么这些列和表达式必须出现在group by子句中,否则就会出错
select avg(sal), max(sal), deptno, (sal+nvl(comm,0))*12 from emp group by deptno, (sal+nvl(comm,0))*12;
- Oracle表的复杂查询——多表查询
- 说明:多表查询是指基于两个或两个以上的表或者视图的查询。
- 查询员工姓名、员工工资以及所在部门的名称
select e.ename, e.sal, d.dname from emp e, dept d where e.deptno=d.deptno;
- 查询部门号为10的部门号、部门名、员工姓名、工资
方法一: select * from ( select d.deptno,d.dname,e.ename,e.sal from emp e,dept d where d.deptno=e.deptno) where deptno='10'; 方法二: select d.deptno,d.dname,e.ename,e.sal from emp e,dept d where d.deptno=e.deptno and d.deptno='10'
- 查询个员工姓名、工资及其工资级别(salgrade表)
GRADE LOSAL HISAL ------ ---------- ------ 1 700 1200 2 1201 1400 3 1401 2000 4 2001 3000 5 3001 9999 select e.ename,e.sal,s.grade from emp e, salgrade s where e.sal between s.losal and s.hisal;
- 关键字:between 在什么范围内
- 查询员工姓名、员工工资及所在部门的名字,并按部门代号排序
select e.ename, e.sal, d.dname from emp e, dept d where e.deptno=d.deptno order by e.deptno; >>> 查询结果 ENAME SAL DNAME ---------- ---------- -------------- CLARK 2450 ACCOUNTING KING 5000 ACCOUNTING MILLER 1300 ACCOUNTING JONES 2975 RESEARCH FORD 3000 RESEARCH ADAMS 1100 RESEARCH SMITH 800 RESEARCH SCOTT 3000 RESEARCH WARD 1250 SALES TURNER 1500 SALES ALLEN 1600 SALES JAMES 950 SALES BLAKE 2850 SALES MARTIN 1250 SALES
- Oracle表复杂查询-多表查询-自连接
- 说明:自连接是指在同一张表的连接查询
- 查询某个员工的上级领导的姓名。比如:查询'FORD'的上级
- 将一张表当作两张表来查询
select worker.ename, boss.ename from emp worker, emp boss where worker.mgr=boss.empno and worker.ename='FORD'; >>> 查询结果 ENAME ENAME ---------- ---------- FORD JONES
- Oracle表复杂查询-子查询
- 子查询:是指嵌入在其他Sql语句中的select语句。也叫嵌套查询
select * from emp where deptno=(select deptno from emp where ename='SMITH');
- 该查询语句中select deptno from emp where ename='SMITH'为子查询
- 单行子查询
- 单行子查询是指只返回一行数据的子查询语句
- 如何显示与SMITH同一部门的所有员工
select ename deptno from emp where deptno=(select deptno from emp where ename='SMITH'); >>> 查询结果 ENAME DEPTNO ---------- ------ SMITH 20 JONES 20 SCOTT 20 ADAMS 20 FORD 20
- 如何显示与SMITH同一部门的所有员工
- 多行子查询
- 多行子查询是指返回多行数据的子查询
- 如何查询和部门10的员工工作相同的员工姓名、岗位、工资、部门代号
select ename, job, sal, deptno from emp where job in (select distinct job from emp where deptno='10');
- 如何查询和部门10的员工工作相同的员工姓名、岗位、工资、部门代号
- 多行子查询中使用all操作符
- 如何查询工资比部门30的所有员工的工资高的员工姓名、工资和部门代号
>>> 方法一:all select ename, sal, deptno from emp where sal > all (select sal from emp where deptno='30'); >>> 方法二:max select ename, sal, deptno from emp where sal > (select max(sal) from emp where deptno='30'); 方法二的执行效率比方法一的高很多
- 如何查询工资比部门30的所有员工的工资高的员工姓名、工资和部门代号
- 多行子查询中使用any操作符
- 如何查询工资比部门30的任意一个员工的工资高的员工姓名、工资、部门代号
>>> 方法一:any select * from emp where sal > any (select sal from emp where deptno='30'); >>> 方法二:min select * from emp where sal > (select min(sal) from emp where deptno='30');
- 如何查询工资比部门30的任意一个员工的工资高的员工姓名、工资、部门代号
- 多列子查询
- 单行子查询和多行子查询都是返回单列数据;而多列子查询则是指查询返回多个列数据的子查询语句
- 如何查询与SMITH的部门和岗位完全相同的所有员工
select * from emp where (deptno,job)=(select deptno, job from emp where ename='SMITH');
- 查询的条件与子查询中的返回结果位置要一一对应
- 如何查询与SMITH的部门和岗位完全相同的所有员工
- 在from子句中使用子查询
- 当在from子句中使用子查询时,该子查询会被作为一个试图来对待,因此也叫做内嵌试图。
- 当在from子句中使用子查询时,必须给子查询指定别名。
- 如何显示高于自己部门平均工资的员工的信息
>> 第一步:查询出各个部门的平均工资和部门号 select deptno, avg(sal) mysal from emp group by deptno; >> 第二步:把查询的结果看作是一张子表 select a1.ename, a1.sal, a1.deptno, a2.mysal from emp a1, (select deptno, avg(sal) mysal from emp group by deptno) a2 where a1.deptno=a2.deptno and a1.sal > a2.mysal;
- 如何显示高于自己部门平均工资的员工的信息
- 分页查询
- 分页需要用两个子查询
- Oracle分页查询一共有三种方式
方法 特点 说明 根据rownum分页 执行效率中等,最容易理解 所有的查询改变,均只需要更改最里层的查询 根据rowid分页 执行效率最高,但是最难理解 根据分析函数分页 写法最简单,执行效率最慢 - 小练习
- 按员工的ID号升序取出
- rownum分页法
1. 先做一个子查询 select * from emp; 2. 显示rownum(Oracle分配的),把上一个查询作为from的子查询 select a1.* rownum rn from (select * from emp) a1; 3. 添加第一个筛选条件 select a1.* rownum rn from (select * from emp) a1 where rownum<=10; 注意:该处的条件必须用rownum,不能用rn。并且不能同时写两个条件,oracle设定的 4. 添加第二个筛选条件,把上一个查询作为from的子查询 select * from (select a1.*, rownum rn from (select * from emp) a1 where rownum<=10) where rn>5; rownum分页的变动 查询字段改变:select * from (select a1.*, rownum rn from (select ename, sal from emp) a1 where rownum<=10) where rn>5; 查询结果需要排序:select * from (select a1.*, rownum rn from (select ename, sal from emp order by sal) a1 where rownum<=10) where rn>5; 查询条目的变动:select * from (select a1.*, rownum rn from (select ename, sal from emp order by sal) a1 where rownum<=6) where rn>1;
- rowid分页法
select * from emp where rowid in ( select rid from ( select rownum rn, rid from ( select rowid rid, sal from emp order by sal desc) where rownum<=10) where rn>5) order by sal desc;
- 分析函数分页法
select * from ( select a1.*, row_number() over(order by sal desc) rk from emp a1) where rk<=10 and rk>5;
- 用查询结果创建新表
- 这个命令是一个快速建表的方法
- 语法:create table 新表名 (新字段1,新字段2...新字段n) as select 字段1,字段2...字段n from 表名;
- 复制整张表:create table 新表名 as select * from 表名;
create table mytable (id,name,sal,job,deptno) as select empno,ename,sal,job,deptno from emp;
- 合并查询
- 在实际应用中,为了合并多个select语句的结果,可以使用集合操作符号:union,union all,intersect,minus
- union
- 该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中重复行
select * from emp where sal>2500 union select * from emp where job='MANAGER';
- 该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中重复行
- union all
- 该操作符与union相似,但是不会取消重复行,而且不会排序
select * from emp where sal>2500 union all select * from emp where job='MANAGER';
- 该操作符与union相似,但是不会取消重复行,而且不会排序
- intersect
- 使用该操作符,用于取两个结果集的交集
select * from emp where sal>2500 intersect select * from emp where job='MANAGER';
- 使用该操作符,用于取两个结果集的交集
- minus
- 使用该操作符用于取得两个结果集的差集,它会显示存在于第一个结果集,而不存在第二个结果集中的数据
select * from emp where sal>2500 minus select * from emp where job='MANAGER';
- 使用该操作符用于取得两个结果集的差集,它会显示存在于第一个结果集,而不存在第二个结果集中的数据
- 合并查询在日常工作中用的少,但是合并查询的效率比and、or条件查询效率快很多
- union
- 用子查询插入多条数据
- 当使用values子句时,一次只能插入一行数据。当使用子查询插入数据时,一条insert语句可以插入大量的数据
- 当处理行迁移或装载外部表的数据到数据库时,可以用子查询来插入数据
- insert into myemp(myid, myname, mydept) select empno,ename,deptno from emp where deptno=10;
案例:给新建表格添加部门ID为10的员工信息 >>> 创建一个表myemp2,包含字段myid, myname, mydept create table myemp2(myid number(4), myname varchar2(50), mydept number(5)); >>> 给新表批量插入数据 insert into myemp2(myid,myname,mydept) select empno,ename,deptno from emp where deptno=10;
- 用子查询更新多条数据
- 使用Update语句更新数据时,既可以使用表达式或者数值直接修改数据,也可以使用子查询修改数据
案例:希望员工scott的岗位、工资、补助与smith员工一样 update myemp set (job, sal, comm) = (select job, sal, comm from myemp where ename = 'SMITH') where ename = 'SCOTT'
- 子查询:是指嵌入在其他Sql语句中的select语句。也叫嵌套查询
创建数据库的两种方法
- 通过oracle提供的向导工具
- Database Configuration Assistant(dbca 数据库配置助手)
- 通过手工步骤直接创建
- DBCA数据库配置助手创建数据库
课外小知识
- 打开显示操作时间的开关:set timing on;
- Oracle运算特性:凡是运算过程中有null值,结果均为null
解决该问题,用nvl函数,nvl(x, 0):如果x的值为null,则替换成0; - 数据库在执行SQL语句时候,是从右到左执行扫描
- 比如:select * from emp where ename='SMITS' and job='CLERK';
- 这个sql语句,先筛选job='CLERK',再筛选ename='SMITS'
- 所以在写sql语句时候把能筛选掉大部分数据的条件写在最左边(最后面)
- Sql语句中,给列取别名可以加as,但是在给表取别名的时候一定不能加as.否则会出错