Oracle实验总结
近日做了基于ORACLE的数据库安全、对象——sql数据库,XML数据库的实验,其中遇到很多问题,先总结如下。
1、安装Oracle的过程中可以‘选择建立数据库’,也可以选择‘只安装软件’,后者可在安装好软件后,建立数据库,可参考网上的很多安装步骤。
2、Oracle的默认用户有sys和system,在命令行或者sQl*plus中登陆时,写法如下:
Connect sys/123456 as sysdba; 其中123456是密码,在创建数据库的时候设置的。
普通用户登录,connect zhangsan/123456;
3、grant select不支持对表中选定的几列授权,只能将整个表的select权限授权出去。所以实验中先建立了基于选课信息表的视图SelectiveInfo1,视图中包含成绩列,学号列以及班级列(不包含其他的列),再将对视图SelectiveInfo1的select权限授予角色teacher。
4、创建用户的时候,一定要说明该用户对表空间的权限即(quota unlimited on tablespace或者具体限定大小的句子),否则该用户即使被授予了建表权限,也不能建表。
创建用户的时候必须给用户授予create session的权限,这是最基本的权限。
5、不同的用户可以创建相同的表格,例如,teacher用户创建了table1,student用户也创建了table1,且这两个表格式完全相同的,那么其他用户需要用这两个表格时,可以用teacher. table1和student. table1加以区分。
系统用户创建的表,和用户自己创建的表,本用户引用是可不加前缀。
6、oracle有自带的密码验证函数,默认情况下是不启用的,可以用下面的语句启用,注意必须以Connect sys/123456 as sysdba的身份登陆(其他DBA身份的用户可不可以,本人没有试过)才能启用密码函数,启用方式如下
7、将日期装换为字符串可以to_char()函数,将字符串转换为日期用to_date()函数。网上有很多这两个函数的资料。
8、Xml数据库使用的简单举例(具体路劲写法好像不对,只要将改改‘//’为‘/’并把路径写全就可以了,路径的用法其实是xpath技术)
建立含xmltype数据的表
create table abc
(id number,
xmldoc sys.xmltype);
向表中插入数据
insert into abc (id,xmldoc)
values
(1 ,
sys.xmlType.createXML
(''<name>
<a id="1" value="some values">abc</a>
</name>'')
);
查询表中的数据:
得到id=1的value变脸的值
select
i.xmldoc.extract(''//name/a[@id=1]/@value'').getStringVal() as ennames, id
from abc i
得到a节点的值
select id, i.xmldoc.extract('/name/a/text()').getStringVal() as truename
from abc i
得到节点id属性的值
Select hd.Data_t.extract(''/root/name/@id'').getStringVal() As Name
FROM sehr_house_data hd
一、查看表结构
desc 表名
例如:desc emp;
二、查询所有列
例如:select * from emp;
三、查询指定列
例如:select ename,sal,job,deptno from emp;
四、取消重复的行,使用distinct关键字
例如:select distinct deptno,job from emp;
五、处理null值,使用nvl函数来处理
例如:select sal*13+nvl(comm,0)*13,ename,comm from emp;
nvl(comm,0)的意思是如果comm的值不为null,就用comm的值,如果为null,则用0代替null。
六、如何连接字符串,使用||
例如:select ename || 'is a'||job from emp;
七,使用where关键字作为条件来实行查询
例如select empno,sal from emp where ename='SMITH';这句的意思是从表emp中找出名字叫SMITH的人的雇员号和薪水。
八、使用like关键字进行模糊查询
%表示多个字符,_代表单个字符,最后一个字符必须是%
例如select * from emp where ename like '%A%';这句话的意思是找出emp表中名字中间包含A的所有人的信息
九、在where条件中使用in关键字
例如select * from emp where empno in(123,456,789);这句话的意思是找出emp表中empno在(123,456,789)中的人的信息.补充一句,select语句和java语句一样,要以分号结尾,不区分大小写。
十、使用is not null
例如;select * from emp where emmpno is not null;
十一、使用order by子句进行查询(order by用来排序)
例如;select * from emp order by deptno asc,sal desc;这句话的意思是将emp表中的deptno升序排列,sal降序排列
十二、使用列的别名排序
例如:select ename,sal*12 '年薪' from emp order by '年薪' asc;
十三、group by子句和having子句
group by 子句用于对查询的结果分组统计
having 子句用于限制分组显示结果
如果在select语句中同时包含有group by,having,order by,那么他们的顺序是group by,having,order by。
十四、多表连接查询(重点)
多表连接查询是指基于两个或两个以上表或是视图的查询。
例如:slect a1.ename,a1.sal,a2.dname from emp a1,dept a2 where a1.deptno=a2.deptno;这句话的意思是显示所有雇员的姓名,薪水和部门名称。因为这三个条件是分别位于emp和dept表
中的,所以需要使用多表连接查询,因为两张表都有deptno,于是便可以使用deptno将两张表连接起来进行查询。
1.查询的时候,可以from多个表
SELECT * FROM EMP,DEPT
这样会产生一个笛卡尔集
表示:两个表任何组合的结果
2.需求:取关联数据
我的部门20号,我想要20号部门的名称====连接条件
select emp.ename,dept.dname from emp,dept where emp.deptno=dept.deptno
3.语法格式:
select 字段 from 表1,表2 where 表1.列=表2.列
select empno,ename,d.deptno,dname from emp e,dept d where e.deptno=d.deptno
当然,你可以为表定义一个别名,但是不能使用as(字段重命名可以使用)
不同的连接条件可以使用and或or
select empno,ename,d.deptno,dname,e.sal from emp e,dept d where e.deptno=d.deptno And sal>1600
4.使用不等值连接
连接条件:一个表中的记录,在另一个表中能够找到匹配的记录即可
Select e.*,g.grade From emp e,salgrade g Where e.sal Between g.losal And g.hisal
5.外连接:把不满足条件的数据显示出来
Select * From EMP E,DEPT D Where E.DEPTNO=D.DEPTNO(+)
外连接可以在左表,也可以在右表
6.自连接
从同一个表中联合查询
Select E.ENAME,P.ENAME From EMP E,EMP P Where E.MGR=P.EMPNO
-----sql1999:
7.交叉连接:
其结果是笛卡尔集,是没加任何条件所产生出来的数据集合
8.自然连接:默认情况下,以两个表中有相同名称的列来进行连接查询
Select * From EMP Natural Join DEPT
其效果相当于
select * from emp,dept where emp.deptno=dept.deptno
9.使用using子句来查询
select * from emp join dept using(deptno)
10.使用on子句
使用on来指定连接具体条件
Select * From EMP Join DEPT On emp.deptno=dept.deptno And EMP.DEPTNO=20
多个表连接查询
Select E.ENAME,E.SAL,D.DNAME,S.GRADE
FROM EMP E Join DEPT D On E.DEPTNO=D.DEPTNO
Join SALGRADE S On E.SAL Between S.LOSAL And S.HISAL
11.外连接:
与内连接的区别:
内连接========查询条件相等的记录(能够匹配的)
外连接========条件相等的+没匹配的
Select * From EMP E Left Outer Join DEPT D On E.DEPTNO=D.DEPTNO Select * From EMP E Right Outer Join DEPT D On E.DEPTNO=D.DEPTNO Select * From EMP E Full Outer Join DEPT D On E.DEPTNO=D.DEPTNO 十五、子查询
子查询:
语句内部的子句,
Select * From EMP Where SAL>(
Select SAL From EMP Where ENAME='ALLEN'
)
1.注意:
A.子查询总是先于主语句的运行
B.必须有(),表示是一个整体
C.习惯上,把子查询放在条件的右边
D.单行操作符只能接受一个值
单行:> < >= <=等
2子查询的分类:
A.单行
B.多行
3.单行的语法
select 字段 from 表 where 字段 >[单行] (子查询)
4.多行
in ,all,any
in:表示在一个区间内
select * from emp where ename in (
select ename from emp where sal>2000
)
any:
> any:比子查询中最小的大
< any:比子查询中最大的小
all
>all :比子查询中最大的那个还要大
<all:比子查询中最小的那个还要小
十六、视图
视图:逻辑上的数据集合
逻辑上:区别于物理上
物理上:表示真实的,现实存在
逻辑上:虚的数据,来源于真实的表
比如,我们可以为emp创建一个视图:
CREATE OR REPLACE VIEW EMP_VIEW AS SELECT EMPNO,ENAME,JOB,HIREDATE FROM EMP;
以后如果想要EMPNO,ENAME,JOB,HIREDATE这些数据,就可以不必访问emp了,直接从视图中来查找。
作用:
控制数据访问
简化查询
数据独立性
避免重复访问相同的数据
1.创建格式:
create or replace view 视图名词 as 数据集合(通常是一个查询语句)
2.在创建视图的时候,可以使用别名
CREATE OR REPLACE VIEW EMP_VIEW AS
SELECT empno employee_number,ename employee_name,job type,hiredate birthday FROM EMP
3.修改视图:
replace
create or replace view myview as select...
4.视图创建的规则
视图的内容可以是任意的集合
CREATE OR REPLACE VIEW EMP_VIEW AS
SELECT JOB,MAX(SAL) AS MAXSAL,MIN(SAL) AS MINSAL,
(MAX(SAL)-MIN(SAL)) AS SAL,COUNT(*) NUM,AVG(SAL) AVGSAL
FROM EMP GROUP BY JOB
HAVING JOB IS NOT NULL
5.区别:
A语句:
CREATE OR REPLACE VIEW JOB_VIEW AS
SELECT DISTINCT(JOB) FROM EMP WHERE JOB IS NOT NULL
B语句:
CREATE TABLE JOB_TEMP AS SELECT DISTINCT(JOB) FROM EMP WHERE JOB IS NOT NULL
主要区别:
共同点:都做到了:数据被独立出来
最大不同:JOB_TEMP是一个物理的表,是要占用很多的数据库空间的,
相当于硬盘上的资料被拷贝了一份
JOB_VIEW:数据还是同一份,不会多占空间,JOB_VIEW相当于是一个"快捷方式"
视图数据的来源===基础表
对基础表的数据的改变将会影响到视图,视图本身并不保存数据,只是对相关数据集合的一个引用而已
简单视图操作的数据和基础表中的数据是"同一份"
简单视图可以使用DML,但是不提倡使用这个功能。
复杂视图不能使用DML:
原因:数据已经被整合了,如果被改变,无法和基础表的数据对应了
6.删除视图:
drop view 视图名称
删除视图是对基础表不会产生任何的影响
7.TOP-N分析(分页查询):
使用到一个关键的列名:rownum
rownum:行编号
伪列:虚拟的列,你并没有在表中人为的添加这个列,
但是当你使用rownum关键词,oracle服务器能够解析
使用的方式
rownum<或<=
因为它总是从第一行开始
例外:
ROWNUM=1不会为null
分页查询的变通方式
SELECT * FROM (
SELECT T.*,ROWNUM AS RN FROM EMP T
) WHERE RN BETWEEN 3 AND 8
分页查询范例:
select * from(select table_name,rownum rn from user_tables) where rn<=10;
十七、约束(主要用来限定内容)
1.分类:A.非空
B.唯一
C.主键:非空+唯一
D.外键:值是外来的
E.检查:值是符合条件
2.注意事项
A.可以给约束起个名字,也可以是使用默认的名字
B.创建的两种时机
创建表的同时/修改表的定义的时候
C.约束的定义位置
表级/列级
D.在字典表中可以查看到这些约束信息
表的定义:user_tables
约束的定义:user_constraints
使用SELECT * FROM USER_CONSTRAINTS语句可以查看到所有的约束信息
3.not null约束
用来修饰字段的
表示该列的值不能为null
定义位置:not null只能在列级
列级:区别于表级
表级:定义的时候,与字段用逗号分开,和字段是同一语句级别
列级:定义的时候,紧跟在字段的后面
CREATE TABLE employees(
employee_id NUMBER(6),
first_name VARCHAR2(20),
...
job_id VARCHAR2(10) NOT NULL,
CONSTRAINT emp_emp_id_pk
PRIMARY KEY (EMPLOYEE_ID));
上面的例子中
not null=======列级
CONSTRAINT emp_emp_id_pk
PRIMARY KEY (EMPLOYEE_ID)代表一个表级的定义
4.unique唯一约束
是用来修饰一个字段的,内容的
unique要求字段内容不能有重复
unique定义位置
A.表级(自定义名称)
B.列级(使用系统默认名称)
基本语法:
列级:字段名 unique
表级:,constraints uni_名称 unique(字段名)
例子:
CREATE TABLE T4(
ID NUMBER(4) UNIQUE,--column
NAME VARCHAR2(20),
AGE NUMBER(3),
CONSTRAINTS UNI_NAME UNIQUE(NAME)--table
)
5.主键约束
也是用来约束字段的,要求其内容必须不能为null,也不能重复
PRIMARY KEY:既不能为null,也不能重复
定义位置:
A.表级
B.列级
定义方式
列级:字段名 primary key
表级:,constraints pk_id primary key(id)
主键==not null+unique
一般情况下,我们在创建表的同时,都会为表指定一个主键,用来唯一标识一条记录,以便在程序中实现修改,删除等业务逻辑操作时,根据该主键标识来准确定位到要操作的记录
联合主键:
把多个字段合起来作为一个主键
要求多个字段每一项都不能为null,
并且合起来的值不能重复
6.外键约束
外来的键值
EMP表的deptno字段引用了dept表中的deptno字段
我们认为:
emp表中的deptno是一个外键,emp.deptno不能任意指定,只能从dept.deptno的值中任意选一个
外键约束定义的位置:
A.表级
B.列级
语法定义格式:
constraints 自定义名称 FOREIGN KEY (字段名)
references 表名(字段名)
使用外键约束的条件
如果A表引用B表中的字段id
条件有两个
B表中的id必须有主键约束
或
唯一性约束
删除表的方式:
两种:A.drop table
B.工具中drop
列级外键定义:
直接在列名的后面
references dept(deptno)
7.关于外键的删除级联设置
联动的效果
我们可以在父项进行删除的时候,让子项联动
两种方式
A.on delete cascade:级联删除
B.on delete set null(不引用)
外键引用时的值的选择
A.要么为null
B.要么从父表中取一个值
8.CHECK约束
check:对某个字段的值的约束,要求该字段的每一行都必须满足的条件 它以一种很直观的方式,来限定你的行值
CREATE TABLE STAFF(
STAFFID NUMBER(5),
NAME VARCHAR2(20) CHECK(NAME IN ('A','B','C'))
)
定义位置:
可以表级
也可以是列级
9,约束的添加
语法:
alter table 表名 add primary key (字段名称)
实例:
ALTER TABLE STAFF ADD PRIMARY KEY (NAME)
10.删除已存在的约束
ALTER TABLE 表名 drop constraints 约束名
比如:
ALTER TABLE STAFF DROP CONSTRAINTS SYS_C003042
11.级联删除约束
在删除约束的同时,也删除跟该字段有关系的约束设置
ALTER TABLE DEPT DROP CONSTRAINT PK_DEPT CASCADE 该代码执行后:
emp表中的外键引用就不存在了
12.有效化和无效化约束
使用disable和enable关键词
ALTER TABLE EMP DISABLE CONSTRAINT PK_EMPNO
ALTER TABLE EMP ENABLE CONSTRAINT PK_EMPNO
13.从数据字典中查询
select * from user_constraint:查询对应的表
SELECT * FROM USER_CONS_COLUMNS:查询对应的列
Oracle常见的练习
1.查出emp表中薪水在3000以上(包括3000)的所有员工的员工号、姓名、薪水。 select empno,ename,sal from emp where sal >= 3000;
2.查询出emp表中所有员工一年的薪水,显示形式如下:
编号为XX的员工,姓名为XX,年薪XX。(提示:使用||将多个列合并)
select '编号为'||empno||'的员工,姓名为'||ename||',年薪为'||(sal*12)||'。' from emp;
3.查询出emp表中部门编号为20,薪水在2000以上(不包括2000)的所有员工,显示他们的员工号,姓名以及薪水,以如下列名显示:员工编号 员工名字 薪水
select empno as "员工编号",ename as "员工名字",sal as "薪水" from emp where deptno = 20 and sal > 2000;
4.查询出emp表中所有的工作种类(无重复)
select distinct(job) from emp;
5.查询出所有奖金(comm)字段不为空的人员的所有信息。
select * from emp where comm is not null;
6.查询出薪水在800到2500之间(闭区间)所有员工的信息。(注:使用两种方式实现and以及between and)
select * from emp where sal >= 800 and sal <= 2500;
select * from emp where sal between 800 and 2500;
7.查询出员工号为7521,7900,7782的所有员工的信息。(注:使用两种方式实现,or以及in)
select * from emp where empno = 7521 or empno = 7900 or empno = 7782;
select * from emp where empno in (7521,7900,7782);
8.查询出名字中有“A”字符,并且薪水在1000以上(不包括1000)的所有员工信息。 select * from emp where ename like '%A%' and sal > 1000;
9.查询出名字第三个字母是“M”的所有员工信息。
select * from emp where ename like '__M%';
10.将所有员工按薪水升序排序,薪水相同的按照入职时间降序排序。
select * from emp order by sal asc,hiredate desc;
11.将所有员工按照名字首字母升序排序,首字母相同的按照薪水降序排序。
select * from emp order by ename asc,sal desc;
12.显示所有员工名字的小写形式、薪水及部门编号。
select lower(ename),sal,deptno from emp;
13.查询出所有在30号部门的员工的员工名字、薪水和所在部门编号,其中名字按照首字母大写,其余小写的形式显示。
select initcap(ename),sal,deptno from emp where deptno = 30;
14.将所有人的名字截掉首字母后显示。
select substr(ename,2) from emp;
15.查询出emp表中所有名字长度在5以上(不包括5)人的名字、员工编号、薪水以及名字的长度。
select ename,empno,sal,length(ename) from emp where length(ename) > 5;
16.查询出emp表中不在10号部门所有人的名字、薪水和部门编号,将名字中所有的字符?E?替换成?%?显示。
select replace(ename,'E','%') as ename,sal,deptno from emp where deptno != 10;
17.查询出所有薪水在1500以上(不包括1500)的所有人的名字、薪水、入职时间,使用四舍五入的方式将所有薪水保留一位小数。
select ename,round(sal,1),hiredate from emp where sal > 1500;
18.查询出所有薪水在1800以下(包括1800)的所有人的名字、薪水、入职时间,使截取的方式将所有薪水小数截掉。
select ename,trunc(sal),hiredate from emp where sal <= 1800;
19.查询出最早工作的那个人的名字、入职时间和薪水。
select ename,hiredate,sal from emp where hiredate = (select min(hiredate) from emp);
20.查询出最晚工作的那个人的名字、入职时间。
select ename,hiredate from emp where hiredate = (select max(hiredate) from emp);
21.计算出最早入职的员工和最晚入职的员工的入职年份之差。
select max(TO_CHAR(hiredate,'yyyy'))-min(TO_CHAR(hiredate,'yyyy')) from emp;
22.显示所有员工的名字、薪水、奖金,如果没有奖金,暂时显示100.
select ename,sal,NVL(comm,100) from emp;
23.使用nullif函数求出所有名字长度为6的员工的名字和部门编号。
select ename,deptno from emp where nullif(length(ename),6) is null;
24.显示出薪水最高人的职位。
select job from emp where sal = (select max(sal) from emp);
25.查出emp表中所有部门的最高薪水和最低薪水,部门编号为10的部门不显示。 select max(sal),min(sal),deptno from emp where deptno != 10 group by deptno;
26.查询出所有薪水在'ALLEN'之上的所有人员信息。
select * from emp where sal > (select sal from emp where ename = 'ALLEN');
27.查询出员工名字、薪水、入职年份、部门编号和部门名称。
select e.ename,e.sal,e.hiredate,e.deptno,d.dname from emp e,dept d where e.deptno = d.deptno;
28.查询出所有员工的名字以及其上司的名字。
select e1.ename,e2.ename from emp e1,emp e2 where e1.mgr = e2.empno;
29.查出所有员工的个人信息和部门信息(多表连接),暂时没有部门的也要查出来。 select * from emp e,dept d where e.deptno = d.deptno;
30.查询所有员工的信息和其薪水对应的级别。(salgrade:薪水分级表)
select e.*,s.grade from emp e,salgrade s where e.sal between s.losal and s.hisal;
31.在emp表中新添加一个员工:ename:ZHANGSAN empno:1234 job:manager
hiredate:2009-01-23
Insert Into emp(empno,ename,hiredate) Values(1234,'ZHANGSAN',to_date('2009-01-23','yyyy-mm-dd'));
32.将新添加的员工工作改为:ANALYST,薪水改为3000,入职时间加一年。
33.将新添加的员工的奖金改为和编号为7499一样高。(7499若没有奖金先为7499添加奖金100)
34.更新表中数据如下:Update emp Set deptno=55 Where empno=7499
能否更新成功,为什么?
35.将新添加的员工删除。
36.删除10号部门薪水最高的员工。
delete from emp where empno in (select empno from emp where sal =(select max(sal) from emp where deptno = 10));
37.将薪水最高的员工的薪水降30%。
update emp set sal = 0.7 * sal where sal = (select max(sal) from emp);
38.创建一个测试表,表名:test,其中有如下字段:id:Number类型4位,name:varchar2类型20位,birthday:Date类型,默认值为20xx年08月08号。
39.删除测试表中的birthday字段。
Alter Table test Drop Column birthday。
40.什么是数据库中的事务?
41.char和varchar2的区别?
char---定长字符串
varchar2----变长字符串
char(20) abcd---------20
varchar(20) abcd--------4
42.NUMBER(N)和number(m,n)的区别?
NUMBER(N):表示整数位不能大于n个,小数位可以任意
number(m,n):表示总长度为m位,其中小数位为n,整数为为m-n
43.delete和truncate的作用以及区别?
两种方式
A.delete删除
B.truncate清空表的内容
区别:
delete:从数据库的缓存区清除该数据
truncate:把数据删除了,然后清空所占用的空间
delete可以撤销
truncate不能撤销
truncate===delete+commit
TRUNCATE 语法
TRUNCATE TABLE EMP;
44.TRUNCATE和drop 区别?
drop:删除表的定义,整个对象删掉,删除的是对象的本身,全部
truncate:删除表的内容,只是删除数据,表的结果会保留
45.什么是主键,主键的作用是什么?可以举例阐述
一般情况下,我们在创建表的同时,都会为表指定一个主键,用来唯一标识一条记录,以便在程序中实现修改,删除等业务逻辑操作时,根据该主键标识来准确定位到要操作的记录
46.什么是外键,外键的作用是什么?可以举例阐述
外来的键值,如EMP表的deptno字段引用了dept表中的deptno字段
我们认为:emp表中的deptno是一个外键,emp.deptno不能任意指定,只能从dept.deptno的值中任意选一个
47.什么是联合主键?
把多个字段合起来作为一个主键,要求多个字段每一项都不能为null,并且合起来的值不能重复.
学习心得:通过这门课程的学习,我首先充分认识到了excel在我们以后工作中的重要性,能够熟练的掌握excel软件是我以后从事财务工…
实验报告课程名称计算机应用基础实验项目名称Excel综合实验班级与班级代码实验室名称或课室专业任课教师学号姓名实验日期广东商学院教…
XX大学实验报告课程名称计算机导论项目名称电子表格处理学院专业指导教师报告人学号实验时间提交时间一实验目的与要求1掌握Excel的…
实验报告课程名称计算机应用基础实验项目名称Excel综合实验班级与班级代码12新闻学1班实验室名称(或课室)SS1-202专业新闻…
大型数据库Oracle实验指导实验一Oracle安装与维护一实验目的1了解并掌握Oracle10的安装方法2了解并掌握测试安装好的…
大型数据库Oracle实验指导指导老师彭虎适用班级信B0851527120xx年2月27日制定实验一Oracle安装与维护一实验目…
实验一Oracle数据库创建及SqlPlus的启动与退出一实验目的1掌握使用DBCA建立删除和管理数据库模板2掌握sqlplus工…
Oracle实训总结系别:信管院班级:姓名:浦江峰学号:1132304112日期:20xx年x月x日实训总结:由于感到oracle…