-------------------3.2---------------------
依次创建三张表
create table s
(
sno varchar2(10) not null,
sname varchar2(20)
);
create table c
(
cno varchar2(5) not null,
cname varchar2(20),
cteacher varchar2(20)
);
create table sc
(
sno varchar2(10),
cno varchar2(5),
scgrade varchar2(20)
);
② 修改表s,为其增加一列stel(电话);
alter table s add stel number(20);
③ 修改表c,将其“课程名称”列的数据类型长度增加一倍;
alter table c modify cname varchar2(40);
④ 修改表sc,将其“成绩”列名改为“总分”;
alter table rename column scgrade to scall;
⑤ 删除表c;
drop table c;
⑥ 重命名表s为ss;
rename s to ss;
-----------------3.3-----------------
2 在3.2章节“上机练习”中,为表s的sno,表c的cno添加主键约束; 为表sc中的sno和cno添加外键约束,scgrade列添加非空约束; 为表s中新添加的的stel列添加唯一约束。 alter table s add constranit sno primary key alter table c add constranit cno primary key alter table sc add constranit sno cno foreign key alter table sc modify (scgrade varchar2(20) not null) alter table s add constranit stel unique
3、 新创建一张带有约束的雇员表emptest,表结构如下:
属性 数据类型 相应约束
员工编号 number(3) 主键
姓名 varchar2(20) 非空
性别 varchar2(2) 默认为“男”,且性别只能为“男”或“女”
生日 date
请问该如何创建这张表?
create table emptest
(
eno number(3) primary key,
ename varchar2(20) not null,
esex varchar2(2) default’男’ check(esex in(‘男’,‘女’)),
ebirth date
);
--------------3.4-------------------------
上机练习
1、 在3.2章节的“上机练习”中,向s表中插入数据。插入内容如下:
学号 姓名 电话
10001 王晓明 13112341118
10002 王涵 13212341118
10003 李有才 13312341118
10004 张小小 13412341118
10005 董强 13512341118
insert into s values(10001,‘王晓明’,13112341118)
insert into s values(10002,‘王涵’,13212341118)
insert into s values(10003,‘李有才’,13312341118)
insert into s values(10004,‘张小小’,13412341118)
2、 生成一个新的表s1,表结构与s表基本一致,有“学号”和“姓名”两列,表中内容如下:
学号 姓名
10001 王晓明
10002 王涵
要求用旧表s生成新表s1去实现。
create table s1 as select * from s;
3、 修改s表中的数据,将董强的电话改为13612341118。
update s set stel=13612341118 where sno=10004;
4、 查询修改后的s表中的全部信息。
select * from s;
5、 删除s1表中的学号列。
alter table s1 drop column sno;
--------------3.5----------------
1、 假设用户student2创建了表s,表s的表结构和数据参见3.3、3.5章节。
现要求把查询、修改表s的权限赋予普通用户student1,该如何操作?
grant select on s to student1;
grant update on s to student1;
2、 收回student1对表s进行修改的权限,该如何操作?
revoke update on s from student1;
--------------3.6-----------------
1、 向3.2章节“上机练习”中的s表添加两行数据,添加后设置保存点p1,应该如何操作?添加的数据内容如下
学号 姓名 电话
10010 孙燕姿 18600001111
10020 周杰伦 18900002222
insert into s values(10010,‘孙燕姿’,18600001111);
insert into s values(10020,‘周杰伦’,18600002222);
savepoint p1;
2、 更新学号为10020的电话为18000000000,更新后设置保存点p2,应该如何操作?
update s set stel=180000000000 where sno=10020;
savepoint p2;
3、 删除学号为10010的学生记录,删除后设置保存点p3,应该如何操作?
delete from s where sno=10010;
savepoint p3;
4、 分别回滚到p1,p2,p3的状态,查看表s中数据的变化;
rollback to p1;
rollback to p2;
rollback to p3;
5、 最后提交操作,查看表s中数据的变化。
select * from s;
--------------4.1-----------------------
1、 下面的语句是否可以执行成功?
select ename , job , sal as salary from emp;
2、 下面的语句是否可以执行成功?
select * from emp;
不可以,应该是select * from scott.emp
3、 找出下面语句中的错误:
select empno , ename sal * 12 ANNUAL SALARY from emp
4、 显示表dept的结构,并查询其中的全部数据。
desc dept;
select * from dept;
5、 显示出表emp中的不重复的岗位job。
select distinct jobno from emp;
select jobno from emp group by jobno;
6、 选择员工姓名的第三个字母是A的员工姓名。
select ename from emp where ename like ‘__A%’
7、 选择姓名中有字母A和E的员工姓名。
select ename from emp where ename like ‘%A%E%’;
----------------4.2-------------------------
1、 对scott用户下的表进行多表链接查询:
①在一张表中,显示所有员工的姓名ename,部门号deptno和部门名称dname。
select ename,d.deptno,dname from emp e join dept d on e.deptno=d.deptno;
②查询20号部门员工的job和20号部门的loc。
select distinct e.job,d.loc from emp e,dept d where d.deptno =d.deptno and e.deptno=20;
③选择所有有奖金comm的员工的ename , dname , loc。
select ename,dname,loc from join dept using(deptno) where comm is not null;
④选择在DALLAS工作的员工的ename , job , deptno, dname。
select ename ,dname ,loc from emp join dept using(deptno) where loc=‘DALLAS’;
--------------4.3------------------------------
1、 基于scott.emp表进行一下查询:
① 查询公司员工工资的最大值,最小值,平均值,总和
select max(salary),min(salary),avg(salary),sum(salary) from employees;
② 查询各种job的员工工资的最大值,最小值,平均值,总和
select job_id max(salary),min(salary),avg(salary),sum(salary) from employees
group by job_id;
③ 查询各种job的员工人数(提示:对job进行分组)
select job_id ,count(employees_id)
from employees
group by job_id;
④ 查询员工最高工资和最低工资的差距(DIFFERENCE)
select max(salary)-min(salary) difference from employees;
⑤ 查询各个管理者手下员工的最低工资,其中最低工资不能低于800,没有管理者的员工不计算在内
select manager_id ,min(salary) from employees
where manager_id is not null
group by manager_id
having min(salary) >=800;
⑥ 查询所有部门的名字dname,所在位置loc,员工数量和工资平均值
select dname,loc,count(employees_id),avg(salary)
from employees e join departments d
on e.department_id =d.department_id
gruop by dname ,loc;
---------------4.4-----------------------------
1、 查询和scott相同部门的员工姓名ename和雇用日期hiredate;
select ename ,hiredate from emp where deptno=(select deptno from emp where ename=‘SCOTT’)
2、 查询工资比公司平均工资高的所有员工的员工号empno,姓名ename和工资sal;
select ename ,empno ,sal from emp where sal>(select avg(sal) from emp);
3、 查询和姓名中包含字母u的员工在相同部门的员工的员工号empno和姓名ename;
select empno ,ename from emp where deptno =(select deptno from emp where ename like’’%U%’);
4、 查询在部门的loc为NewYork的部门工作的员工的员工姓名ename,部门名称dname和岗位名称job;
select ename ,dname ,job from emp e ,dept d where e.deptno=d.deptno and loc=‘NEW YORK’;
5、 查询管理者是king的员工姓名ename和工资sal。(mgr 为上级员工编号)
select ename ,sal from emp where mgr=(select empno from emp where enaem=‘KING’);
--------------5.1------------------------------
1、 查询工资大于1600的员工姓名和工资;
select ename ,sal from emp where sal >1600;
2、 选择工资不在4000到5000的员工的姓名和工资;
select ename ,sal from emp where sal not between 4000 and 5000;
3、 选择雇用时间在1981-2-19到1981-12-3之间的员工姓名,JOB和雇用时间HIREDATE;
select ename ,job,hiredate from emp where hiredate between 1981-2-19 and 1981-12-3;
4、 选择在20和30号部门工作的员工姓名和部门号;
select ename ,deptno from emp where deptno in(20,30);
5、 选择在1987年雇用的员工的姓名和雇用时间;
select ename,hiredate from emp where hiredate=1987;
6、 选择公司中没有管理者的员工姓名及JOB;
select ename,job from emp where mgr is null order by job;
7、 选择公司中有奖金的员工姓名,工资和奖金级别;
select ename ,job from emp where comm is not null;
8、 连接表emp的全部列,各个列之间用逗号连接,列头显示成OUT_PUT(提示:使用连接符||)。
select empno||’,’||ename||’,’||job||’,’||mgr||’,’||hiredate||’,’||sal||’,’
||comm||’,’||deptno as “OUTPUT” from emp;
--------------5.2----------------------------