oracle 数据操作、数据库对象、表、约束、视图、序列、索引、同义词学习笔记和练习题答案、课后作业

数据操作:增、删、改

DQL(Data Query Language) 数据查询语言:select
DML(Data Manipulation Language) 数据操作语言:insert update delete
TPL(Transaction Process Language) 事务处理语言:commit rollback


– 新增 insert into 表名(列名1,[列名2….]) values(值1,[值2…..])
– 注意:
– –1.列名列表与值列表个数、数据类型保持一致
– –2.字符类型与日期类型用”单引号括起来
– –3.列名列表可省略,默认值列表为所有列赋值


–插入空值NULL 隐含法: 在列名列表中忽略该列
insert into dept(deptno,dname) values(50,’软件开发事业部’);
–插入空值NULL 显示法: 指定 NULL关键字或者”
insert into dept(deptno,dname,loc) values(60,’测试部’,null);
insert into dept values(70,’运维部’); –错误,没有足够的值
insert into dept values(70,’运维部’,”);–正确,所有列全部需要赋值

–插入日期值 SYSDATE 函数记录当前日期和时间
insert into emp(empno,ename,hiredate) values(1111,’张三’,sysdate);

–插入日期值 用户指定日期,需用to_date()函数将字符串转换为日期类型
insert into emp(empno,ename,hiredate) values(2222,’李四’,’2018-07-30’);–错误 文字与字符格式不匹配
insert into emp(empno,ename,hiredate) values(2222,’李四’,to_date(‘2018-07-30’,’YYYY-MM-DD’)); –正确

–插入特字符&
insert into dept(deptno,dname,loc) values(80,’#@$%实施部&’,’东软软件园’); –完全ok
insert into dept(deptno,dname,loc) values(90,’&’ || ‘实施部’,’东软软件园’);
insert into dept(deptno,dname,loc) values(90,chr(38) || ‘实施部’,’东软软件园’);

select ascii(”) from dual; –38 ascii() 获取指定字符的ascii码
select chr(38) from dual; –& chr() 将指定数字装换为对应字符

–插入多行数据
1.创建表manager,且结构与emp表一致
–create table manager as select * from emp; –复制表结构及所有表数据
create table manager as select * from emp where 1=0; –仅复制表结构

2.将emp表中职位为MANAGER的员工信息插入到manager表中
insert into manager select * from emp where job=’MANAGER’;


–修改数据 :
– 语法: update 表名 set 列名=新值,[列名1=新值1…] where 限制条件


–使用 WHERE 子句指定要修改的记录
1.把员工编号为7782的部门编号修改为20;
update emp set deptno=20 where empno=7782;

–如果要修改所有记录,WHERE子句可以忽略
1.把所有员工的部门编号修改为20
update emp set deptno = 20;

–一次修改多列
1.把部门编号为10的员工,部门编号调整为20,工资增加100
update emp set deptno=20,sal = sal+100 where deptno=10;

–嵌入子查询修改
1.把部门编号为10的员工,部门编号调整为20,工资在原有的基础上,增加所有人的平均工资
update emp set deptno=20,sal=sal+(select avg(sal) from emp) where deptno=10;

–修改记录时的完整性约束错误
1. 把部门编号为10的员工,部门编号调整为55
update emp set deptno=55 where deptno=10; –错误 未找到父项关键字 外键(emp.deptno)对应的值不在主键(dept.deptno)范围之内

–练习
2.修改奖金为null的员工,奖金设置为0
update emp comm=0 where comm is null;

–相关修改
3.修改工作地点在NEW YORK或CHICAGO的员工工资,工资增加500
update emp set sal = sal+500 where (select loc from dept where deptno=emp.deptno) in(‘NEW YORK’,’CHICAGO’);
select * from emp where (select loc from dept where deptno=emp.deptno) in(‘NEW YORK’,’CHICAGO’);

4.在emp表中增加一个列dname, 来存储部门名称.
alter table emp add(dname varchar2(14));

5.使用相关子查询更新dname列为正确的部门名称
update emp set dname= (select dname from dept where deptno = emp.deptno);


–删除数据 :
– 语法: delete [from] 表名 where 限制条件


–删除选中记录
1. 删除职位是CLERK的员工记录
delete from emp where job=’CLERK’;

–删除全部记录
2.删除所有员工记录
delete from emp;
delete emp;

–基于另外一张表进行删除操作
1.删除部门SALES的员工记录
delete from emp where deptno=(select deptno from dept where dname=’SALES’);

2.删除部门编号为10的部门信息
delete from dept where deptno = 10;–错误 已找到子记录 (留意错误:未找到父项关键字)

–相关删除
1.删除曾经做过入职的员工的记录
delete from emp where exists (select * from emp_jobhistory where empno = emp.empno);

2.删除没有员工的部门记录
delete from dept where not exists (select * from emp where deptno=dept.deptno)

练习
3.使用如下语句,建立以下表
CREATE TABLE copy_emp (
empno number(4),
ename varchar2(20),
hiredate date default sysdate ,
deptno number(2),
sal number(8,2));

课后作业
4.在第三题表的基础上,完成下列问题
(1)在表copy_emp中插入数据,要求sal字段插入空值,部门号50
,参加工作时间为2000年1月1日,其他字段随意
select * from copy_emp;
insert into copy_emp values(101,’张三’,to_date(‘2000-1-1’,’YYYY-MM-DD’),50,null);
(2)在表copy_emp中插入数据,要求把emp表中部门号为10号部门
的员工信息插入
insert into copy_emp select empno,ename,hiredate,deptno,sal from emp where deptno = 10;
(3)修改copy_emp表中数据,要求10号部门所有员工涨20%的工资
update copy_emp set sal=sal*1.2 where deptno = 10;
(4)修改copy_emp表中sal为空的记录,工资修改为平均工资
update copy_emp set sal = (select avg(sal) from copy_emp) where sal is null;
(5)把工资为平均工资的员工,工资修改为空
update copy_emp set sal = null where sal = (select avg(sal) from copy_emp);
(6)另外打开窗口2查看以上修改
(7)执行commit,窗口2中再次查看以上信息
commit;
(8)删除工资为空的员工信息
delete from copy_emp where sal is null;
(9)执行rollback
rollback;
这里写图片描述


– 创建表


1.创建一张表名为person的表,数据结构定义如下:
列名 列类型 长度 精度 默认值
id number 4
cname varchar2 20
birthday date
heigth number 3
weigth number 5 2
country_code char 2 ‘01’

create table person (
id number(4),
cname varchar2(20),
birthday date,
heigth number(3),
weigth number(5, 2),
country_code char(2) default ‘01’
);

–插入默认值
insert into person(id,cname,birthday,heigth,weigth) values(1,’Tom’,sysdate,180,250);

–使用默认值修改
insert into person(id,cname,birthday,heigth,weigth,country_code) values(2,’Marry’,sysdate,180,250,’03’);
update person set country_code=default where id=2;

约束


check –检查约束
unique –唯一约束
primary key –主键约束
foreign key –外键约束
constraint fk (deptno) references dept(deptno)


create table emp_bak(
empno number(4) primary key,
ename varchar2(10) not null,
job varchar2(9) unique,
mgr number(4),
hiredate date,
sal number(7,2) check (sal>1600),
comm number(7,2),
deptno number(4) constraint emp_deptno_fk references dept(deptno),
constraint emp_ename_uq unique (ename),
constraint emp_sal_ck check(sal between 1000 and 10000),
constraint emo_empno_pk primary key (empno),
constraint emp_deptno_fk foreign key (deptno) references dept(deptno)
);


–追加约束
–语法

alter table 表名 add constraint 约束名 约束类别primary key;

alter table emp_bak add constraint emp_empno_pk primary key(empno);–主键约束
alter table emp_bak add constraint emp_ename_unique unique(ename);–唯一约束
alter table emp_bak add constraint emp_sal_check check(sal>0); –检查性约束
alter table emp_bak add constraint emp_deptno_fk foreign key(deptno) references dept(deptno);–外键约束
–not null非空约束
alter table emp_bak modify(job constraint emp_job_nn not null);


–删除约束
–语法
alter table 表名 drop constraint 约束名;


alter table emp_bak drop primary key; –删主键
alter table emp_bak drop constraint emp_empno_pk; –删主键

alter table emp_bak drop unique(ename);–删唯一键
alter table emp_bak drop constraint emp_ename_unique;–删唯一键

alter table emp_bak drop constraint emp_sal_check;–删检查性约束
alter table emp_bak drop constraint emp_deptno_fk;–删除外键

–alter table emp_bak modify(job);–not ok设置为可以为null
alter table emp_bak drop constraint emp_job_nn; –允许为null


–禁用约束
–语法
alter table 表名 disable constraint 约束名;


alter table emp_bak disable constraint emp_empno_pk;–禁用主键


–启用约束
–语法
alter table 表名 enable constraint 约束名;–启用主键
alter table emp_bak enable constraint emp_empno_pk;–启用主键

–查看约束的数据字典表
select * from user_constraints;–查看当前用户所有的约束
select * from user_cons_columns where constraint_name =’EMP_DEPTNO_FK’; – 查看约束及对应的列名


–创建视图

视图是一个命名的查询 用于改变基表数据的显示 通过视图能简化查询,访问方式与表相同


–简单视图
1.创建一个视图v_emp10,通过该视图只能查看10号部门的员工编号,员工姓名,职位。
create view v_emp10
as
select empno,ename,job from emp where deptno=10;

–权限不足,需sys授权create view给scott
grant create view to scott;

–创建视图时,在子查询中使用列的别名
–create or replace 当视图不存在时创建,已存在时替换并修改
create or replace view v_emp10
as
select empno 雇员编号,ename 雇员姓名,job 职位 from emp where deptno=10;

–复杂视图
1.创建一个视图,通过该视图可以查看每个部门的名称,最低工资,最高工资,平均工资
create or replace view deptAvgSal(deptName,minSal,maxSal,avgSal)
as
select dname,min(sal),max(sal),avg(sal) from emp,dept where emp.deptno = dept.deptno group by dept.dname;


–序列:通常用来生成主键值,可用来自增或自减数字


–简单创建
create sequence emp_seq;

–复杂创建:指定所有属性值
create sequence emp_seq
start with 1 –从1开始取值
increment by 1 –每次累增1
minvalue 1 –最小值为1
maxvalue 9999999 –最大值为9999999
nocycle –无循环
cache 20 –默认缓存20个值在内存中

–currval与nextval伪列
– 注意:同一会话中,需先执行nextval才能获取currval
select emp_seq.nextval from dual;–查看序列生成的下一个值
select emp_seq.currval from dual;–查看序列生成的当前值


–使用序列


insert into emp(empno,ename,job) values(emp_seq.nextval,’tom’,’sales’);
select * from emp;

–修改序列:出start with之外的值都可以修改
alter sequence emp_seq
increment by 1
minvalue 1
maxvalue 2000;–注意:最大值不能小于序列的当前值

–删除序列
drop sequence emp_seq;


–索引:通常用优化查询速度


–创建索引
1.在emp表的ename字段上创建索引
create index emp_ename_index on emp(ename); –单列索引

2.在emp表的deptno和job的组合上创建索引
create index emp_dept_job_index on emp(deptno,job);–复合索引

–测试索引
1.创建表emp_bak,复制emp表结构,以及所有的数据
create table emp_bak as select * from emp;

2.批量新增数据到emp_bak表中(单位:百万)
insert into emp_bak select * from emp_bak; –多次重复执行,目前3670016

3.将empno列的数据更新为唯一值
update emp_bak set empno = rownum; –第一种方式
update emp_bak set empno = emp_seq.nextval; –第二种方式

alter table emp_bak modify(empno number(10));–原empno长度为4,精度不够,修改为长度10

4.测试效率–(可借助F5(explain plan window)窗口分析SQL语句执行效率)
select * from emp_bak where empno=3000000; –无索引 0.12左右
create index emp_empno_index on emp_bak(empno);–创建empno列的索引
select * from emp_bak where empno=3000000; –有索引 0.015左右

–删除索引
drop index emp_empno_index;

–数据字典
select * from user_tables; – 查询表

select * from user_constraints;–查询约束
select * from user_cons_columns; –查询约束及相关列

select * from user_indexes;–查询当前用户所有的索引
select * from user_ind_columns;–查询当前用户的所有索引,及相关列


–同义词


–创建同义词(private私有同义词:属于当前用户scott)
create synonym e for emp;–相当于给emp表取别名
–权限不足,sys授权
grant create synonym to scott;
–测试
select * from scott.emp;
select * from scott.e;

–创建同义词(public公有同义词:属于共有用户,不属于某一指定用户)
create public synonym a for emp;
–权限不足,sys授权
grant create public synonym to scott;
–测试
select * from a;

–删除同义词
drop synonym e;
drop public synonym a;

猜你喜欢

转载自blog.csdn.net/qq_34693104/article/details/81407962