1.查资料,回答下面问题:
a.Oracle公司的诞生和发展
(1)1977年程序员埃里森和另外两名程序员创建了软件开发实验室(Software Development Laboratories)。
(2)1970年IBM的一名研究人员写了一篇名为《大型共享数据库的关系数据模型》的论文,埃里森3人受到这篇文章的启发,决定构建一种新型数据库,称为关系数据库系统(relational database system).
(3)他们的第一个项目是为美国政府做的,他们给它取名为”Oracle”,因为他们认为“Oracle”有“智慧之源”的意思,作为这个项目的名字很恰当。
(4)1978年,此软件开发试验室迁至硅谷。为了扩大影响力,让人们更加了解公司的业务范围,他们将公司的名字从“软件开发实验室”更名为“关系软件公司(Relation Software Inc,简称RSI)”。
(5)1979年RSI开发出第一款商用SQL数据库。
1982年从RSI更名为Oracle系统公司(Oracle System Coroperion)。
1983年Oracle开发出便携式的RDBMS(关系型数据库管理系统),这是第一款能在PC机,小型机和大型机上运行的便携式数据库。
1984年,年收入突破千万,业务扩张至奥地利、德国、日本、瑞典、瑞士。
1986年,公司上市,年收入达5,500美元。同年推出第一个客户端/服务器数据库。业务继续向全球扩张。
1987年,年收入过亿元。Oracle正式成为世界上最大的DBMS软件公司。它组建了由七个员工和两个产品组成的应用产品部,这标志着它开始进入企业应用产品市场。开始开展咨询和支持业务,旨在帮助客户更好地使用他们的软件。
现在,Oracle咨询部是世界上最大的咨询部之一。
1989年,年收入突破5亿元。建起了6座摩天大楼,试图营造自己的园区。
同年,Oracle在IBM大型机,DEC和Unix小型机以及OS/2 PC机上,创下了事物处理业绩的最佳纪录。
1991 年,年收入达到 10.28 亿美元。
Oracle中国公司正式在中国注册为“北京甲骨文软件系统有限公司”.
1992年,Oracle7数据库发布。
1993 年,年收入达到 15.03 亿美元。
1997年6月,ORACLE第八版发布。ORACLE8支持面向对象的开发及新的多媒体应用,这个版本也为支持Internet、网络计算等奠定了基础。同时这一版本开始具有同时处理大量用户和海量数据的特性。
1998年9月,ORACLE公司正式发布ORACLE 8i。“i”代表Internet,这一版本中添加了大量为支持Internet而设计的特性。这一版本为数据库用户提供了全方位的Java支持。ORACLE 8i成为第一个完全整合了本地Java运行时环境的数据库,用Java就可以编写ORACLE的存储过程。
在2001年6月的ORACLE OpenWorld大会中,ORACLE发布了ORACLE 9i。
2003年9月8日,旧金山举办的ORACLE World大会上,Ellison宣布下一代数据库产品为“ORACLE 10g”。ORACLE应用服务器10g(ORACLE Application Server 10g)也将作为甲骨文公司下一代应用基础架构软件集成套件。“g”代表“grid ,网格”。这一版的最大的特性就是加入了网格计算的功能。
2007年11月,Oracle 11g正式发布,功能上大大加强。11g是甲骨文公司30年来发布的最重要的数据库版本,根据用户的需求实现了信息生命周期管理(Information Lifecycle Management)等多项创新。
2009年,收购了SUN公司。
b.Oracle数据库安装后启动的几个服务都代表什么含义.我们一般启动哪几个服
务即可?
共7个服务:
(1)Oracle ORCL VSS Writer Service;手动启动;
描述:Oracle卷映射拷贝写入服务,VSS(Volume Shadow Copy Service)能够让存储基础设备(如磁盘,阵列等)创建高保真的时间点映像,即映射拷贝。它可以在多卷或者单个卷上创建映射拷贝,同时不会影响到系统性能。
(2)OracleDBConsoleorcl;默认自动启动;
描述:数据库控制台服务,orcl是Oracle的实例标识,默认是orcl。在运行Enterprise Manager(企业管理器OEM)时,需要启动这个服务。
(3)OracleJobSchedulerORCL;默认自动禁止;
描述:Oracle作业调度(定时器)服务,ORCL是Oracle的实例标识,默认是ORCL,可以自定义。
(4)OracleMTSRecoveryService;默认自动启动;
描述:服务器端设置。该服务允许数据库充当一个微软事务服务器MTS。
(5)OracleOraDb11g_home1ClrAgent;手动启动;
描述:数据库.Net扩展服务的一部分。
(6)OracleOraDb11g_home1TNSListener;默认自动启动;
描述:监听器是Oracle基于服务器端的一种网络服务,用于监听客户端向数据库服务器端发出的连接请求。只存在于服务器端,监听器的设置也是在服务器端设置的。
服务只有在数据库需要远程访问时才需要启动(无论是从另一台主机远程访问还是从本机通过SQL*Net网络协议进行访问都属于远程访问)。如果不开启这个服务就只能访问本地数据库。
(7)OracleServiceORCL;默认自动启动;
描述:数据库(实例)服务,是Oracle的核心服务,是数据库启动的基础。只有该服务启动,数据库才能正常启动。
438.【上机】安装Oracle 数据库,并使用sqlplus和浏览器分别测试。
(1)在DOS系统中(用cmd进入):键入命令sqlplus,实际调用的是Oracle的sqlplus工具。调用成功按要求输入数据库用户名和密码即可。
(2)在浏览器中连接数据库:
http://localhost:1158/em
如果你只有一个Oracle实例,用1158端口是可以登录的。
如果有多个Oracle实例,登录不同的数据库需要对应不同的端口号。端口号查询:
查询地址为:你本地oracle服务器安装地址下:如D:\database_oracle_11g_install\product\11.2.0\dbhome_1\install\portlist.ini文件中。
(3)使用Oracle自带的可视化工具sql developer;使用时需要配置使用的jdk的安装路径。
(4)使用pl/sql可视化客户端工具访问Oracle数据库。
2.【上机】安装MySQL以及客户端软件navicat或者SQLyog,并建立连接测试。
3.Oracle中,查看某个表的结构使用哪个语句?
(1)select table_name from user_tables: 获取当前用户的表(结构)
(2)select table_name from all_tables:获取所有用户的表(结构)
(3)select table_name from dba_tables:获取所有表包括系统表的表(结构)
4.Oracle中,select * from emp;表示什么含义?
查询表emp的所有行。
5.【上机】表是数据库中存储数据的基本单元。
ORM(Object relationship mapping对象关系映射)基本思想:
表定义了数据结构,类似于Java中的类。
字段定义了表的详细结构,类似于Java中类的属性。
记录(行)定义了某个数据,类似于Java中某个类的对象。
使用上面思路,将实验用表:emp和dept之间的关系,使用两个Java类表示。
(1)emp表:
public class Emp{
private int empNo; //员工编号;
private String eName;//员工姓名;
private String job;//员工岗位;
private int mgr;//员工上级编号;
private String hireDate;//员工入职时间;
private double salary;//员工基本工资;
private double commit;//员工绩效;
private int depNo;//员工部门编号;
//构造方法,略;
//getter,setter方法,略;
}
(2)dept表:
public class Dept{
private int deptNo; //部门编号;
private String dName; //部门名称;
private String loc;//部门地址;
//构造方法,略;
//getter,setter方法,略;
}
6.【上机】完成下面的sql语句,并截图表示出结果。
i.每个员工的所有信息
分析:把员工表的所有内容都列出来;
select * from emp;
ii.每个人的部门编号,姓名,薪水
分析:这3项在一个表里吗?在,简单了。
同上题一样,也是14条纪录。把“*”换成指定的列名。
select deptno,ename,sal from emp;
iii.每个人的年薪
分析:还是查员工信息。没有“年薪”字段,但有”sal(月薪)”,可以通过计算得到年薪信息。
select ename,sal*12 from emp;
iv.计算2*3的值(利用虚拟表:dual)
select 2*3 from dual;
v.得到当前时间
select sysdate from dual;
vi.求每个人的年薪,列的别名:“年薪”;
分析:怎么给列起别名呢?“as”关键字;
select ename,sal*12 as 年薪 from emp;--“年薪”可以加或不加双引号,但单引号不行。
vii.计算每个人的全年的收入包括月薪和年终津贴(使用:nvl函数处理null值)
分析:
(1)年薪 是 (月薪+绩效)*12;
(2)但绩效(comm)有null值,当comm是null值时,月薪+绩效的结果也是null值;
(3)所以,当comm为null值时,需要把它当作0来处理。哪个函数能胜此重任呢?nvl();
(4)nvl()相当于一条if…else语句:如果字段值不为空,取原值;否则,空值当作0来处理。
select ename, sal*12+nvl(comm,0)as 年薪 from emp;
viii.求姓名和薪水和津贴,格式为smith-sal-123(利用拼接字符串)
分析:拼接字符串不同于java中用“+”,这里用”||“。这里拼接的字符串是作为数据出现在字段内容中的。
select ename||'-'||sal||'-'||nvl(comm,0) 收入信息 from emp;
7.Oracle中,||表示什么含义?
字符串拼接。见上题“分析”部分。
8.Oracle中,双引号一般用于什么地方?单引号用于什么地方?
(1)双引号:在给字段起别名时,双引号可以加在别名上(也可以不加);
如下例中的“年薪“:
select ename,sal*12 as “年薪” from emp;
(2)单引号:
i.字段数据中需要拼接字符串时,字符串常量要加单引号。如下例中的连字符“-“:
select ename||'-'||sal||'-'||nvl(comm,0)from emp;
ii.通过某varchar类型的字段数据值来查询记录时,这个用来查询的字段值要用单引号,如下例中的“KING“:
select * from emp where ename='KING';
9.【上机】完成下面的sql语句,并截图表示出结果。
i.求10这个部门的所有员工
分析:查员工信息;但只是查部分员工而不是全部员工的信息。那是哪部分员工呢?条件是:部门编号为10的员工。用where子句。员工表包含部门信息,所以还是单表查询。
select * from emp where deptno=10;
ii.求名字是KING的这个人的信息
select * from emp where ename=’KING’;
iii.求薪水大于2000的员工信息
select * from emp where sal>2000;
iv.求部门不是10的员工信息
(1)select * from emp where deptno<>10;
(2)select * from emp where deptno!=10;
v.求薪水在800和1500之间的员工信息(包含800和1500)
select * from emp where sal between 800 and 1500;
vi.列出deptno为10或者30,并且工资>2000的所有人
select * from emp where deptno in(10,30) and sal>2000;
vii.利用in操作符,列出部门10和20的人员
select * from emp where deptno in (10,20);
viii.利用like操作符,查询名字中含有"H"的人员
select * from emp where ename like '%H%';
ix.分别利用like操作符和正则表达式,查询名字中含有"S"或者"M"的人员
select * from emp where ename like ‘%H%’or ename like‘%S%’;
10.下面两句话是否结果相同:相同。
select * from Emp where not ( deptno in(10,20));
select * from Emp where deptno not in(10,20);
11.数据库查询时,哪些内容区分大小写?哪些不区分?
sql语句关键字,如:select,from等不区分大小写;
表名和字段名:不区分大小写;
字段中的内容:区分大小写。
12.【上机】完成下面的sql语句,并截图表示出结果。
--把所有姓名变成小写
select lower(ename) from emp;
--把所有姓名变成大写
select upper(ename) from emp;
--求所有人名中包含'a'的员工信息不区分大小写
select ename from emp where lower(ename) like '%a%';
--截取子字符串,比如求Hello的一部分
select substr('Hello', 2) from dual;
--求Hello的一部分,并指明长度
select substr('Hello', 2, 3) from dual;
--求ascii码对应的字符
select chr(65) from dual;
--求字符对应的ascii码
select ascii('中') from dual;
--四舍五入
select round(23.652) from dual;
--四舍五入小数点后面多少位
select round(23.652, 1) from dual;
--四舍五入小数点前面多少位
select round(23.652, -1) from dual;
--------------------------------------------------------
--important!日期转换函数
--------------------------------------------------------
--将当前日期转换成1981-03-12 12:00:00这种形式的字符串
select to_char(sysdate, 'YYYY-MM-DD HH24:MI:SS') from dual;
--将1981-03-12 12:00:00字符串转换成日期
select to_date('1981-03-12 12:00:00', 'YYYY-MM-DD HH24:MI:SS') from dual;
--将每个人的薪水转换成固定格式的字符串
select to_char(sal, 'L00,000.9999') from emp;
--将固定格式的字符串转换成数值
select to_number('$1,250.00', '$9,999.99') from dual;
--null当null参与计算时候,需要要nvl这个函数
select ename, sal*12+comm from emp;
select ename, sal*12+ nvl(comm, 0) from emp;
13.【上机】完成下面的sql语句,练习分组函数的使用,并截图表示出结果。
计算emp表中的所有人员的平均薪水
select avg(sal) from as 平均薪水 emp;
计算emp表中最高薪水
select max(sal) from emp;
计算emp表中最低薪水
select min(sal) from emp;
计算emp表中薪水大于1000的人员的个数
select count(*) from emp where sal>1000;
计算emp表中薪水的总和
select sum(sal) as 薪水总和 from emp;
计算emp表中薪水和津贴的总和
(1)select sum(sal+nvl(comm,0)) from emp;
(2)select sum(sal)+sum(nvl(comm,0)) from emp;
14.【上机】完成下面的sql语句,练习分组查询,groupby和having子句,并截图表示出结果。
1.求各部门最高薪水
分析:“各部门“,就是按部门分组;
select max(sal) from emp group by deptno;
select deptno,max(sal) from emp group by deptno;
2.按照部门和职位分组,分别求最高薪水,该组人员个数
(1)按部门分组:select deptno,max(sal),count(*) from emp group by deptno;
(2)按职位分组:select job,max(sal),count(*) from emp group by job;
3.求薪水最高的员工姓名
select ename from emp where sal=(select max(sal) from emp);
4.求平均薪水是2000以上的部门
select deptno from emp group by deptno having avg(sal)>2000;
5.求每个部门的平均薪水,并按照薪水降序排列
select deptno,avg(sal) 平均薪水 from emp group by deptno order by 平均薪水;
6.求每个部门薪水在1200以上的雇员的平均薪水、最高薪水,并且分组结果中只包含平均薪水大于1500的部门,排序按照部门平均薪水倒序排列
select deptno,avg(sal),max(sal) from emp where sal>1200 group bydeptno having avg(sal)>2500 order by avg(sal) desc;
7.把雇员按部门分组, 求最高薪水, 部门号, 过滤掉名字中第二个字母是'A'的, 要求分组后的平均薪水>1500, 按照部门编号倒序排列
select deptno,avg(sal),max(sal),count(*) from emp where ename not like '_A%'group by deptno having avg(sal)>1500 order by deptno desc;
15.下面的sql语句为什么不行?说出你的理由。
select ename,deptno,avg(sal) from emp group by deptno;
要查询的字段必须是单组分组函数和被分组的字段。此题中的”ename”既不是单组分组函数,也不是被分组的字段,所以报错。
16.说出:where、groupby、having、order by的执行顺序
执行顺序:where>group by>having>order by。
17.【上机】完成下面的sql语句,练习子查询,并截图表示出结果。
1.求平均薪水最高的部门的部门编号
select max(平均薪水) from (select deptno,avg(sal) 平均薪水 from emp group by deptno);
2.求出emp表中哪些人是经理人,打印出名字和编号
select ename, empnofrom emp where job='MANAGER';
3.求比普通员工的最高薪水还要高的经理人名称
select ename, sal from emp where job in ('MANAGER','PRESIDENT') and sal> (select max(sal) from emp where job not in('MANAGER','PRESIDENT'));
4.每个部门平均薪水的等级(需要用到表的连接)
select deptno,部门平均薪水,grade from (select deptno,avg(sal) 部门平均薪水 from emp group by deptno),salgrade where 部门平均薪水 between losal and hisal ;
18.为什么需要对查询出的数据做分页处理?
在列表查询时由于数据量非常多,一次性查出来会非常慢;就算一次性查出来了,也不能一次性显示给客户端。所以要把数据分批查询出来,每页显示一定量的数据,这就是数据分页。
我们经常会碰到要取某次查询结果的n到m条纪录,这里也用到了分页思想。
19.说明Oracle数据库如何实现分页。
20.Oracle中的分页处理依赖于哪个字段? mysql中分页处理使用什么来实现?
Oracle : rownum;
Mysql : limit;
21.【上机】完成下面的sql语句,并截图表示出结果。
1.查询薪水最高的前5个人
select * from (select ename,sal from emp order by sal desc) where rownum<=5;
2.查询薪水排名(从高到低)在5-10之间的员工
select ename,sal,rn,rownum from (select t.*,rownum as rn from (select rownum, ename,sal from emp order by sal desc) t) ab where rn>5 and rn<=10;
22.为什么需要表连接? 常用的表连接查询有哪几种?分别适用于哪种情况?
数据库是由多张表组成的存储结构,并通过多张表之间的关系建立起完整有效的数据存储形式。为了获得多张表之间的完整有效的数据联系,数据库查询语言SQL提供了强大的表连接查询功能。表连接就是将多个表中的数据连接到一起的查询,即连接操作可以在一个select语句中完成从多个表中查询和处理数据的功能。
23.为什么需要笛卡尔积?笛卡尔积的作用是?
所谓笛卡尔积,通俗点说就是指两个集合中任意取出两个元素所构成的组合的集合。假设R中有元组M个,S中有元组N个,则R和S的笛卡尔积中包含的元组数量就是M*N.这个规则可以向多个关系扩展。
所有表连接方式都会先生成临时笛卡尔积表,表示两个表中的每一行数据任意组合。在实际应用中,笛卡尔积本身大多没有实际用处,只有在两个表连接时加上限制条件,才会有实际意义。
24.【上机】完成下面的sql语句,练习表连接,并截图表示出结果。
1.求部门平均薪水的等级
select deptno,部门平均薪水,grade from (select deptno,avg(sal) 部门平均薪水 from emp group by deptno),salgradewhere 部门平均薪水 between losal and hisal;
2.求平均薪水的等级最低的部门名称
select * from (select deptno,部门平均薪水,grade from (select deptno,avg(sal) 部门平均薪水 from emp group by deptno),salgrade
where 部门平均薪水 between losal and hisal) t where grade=(select min(grade) from (select deptno,部门平均薪水,grade from (select deptno,avg(sal) 部门平均薪水 from emp group by deptno),salgrade
where 部门平均薪水 between losal and hisal) );
3.求部门经理人中平均薪水最低的部门名称
select t.* from (select t.*,grade from (select deptno,avg(sal) 经理人平均薪水 from emp where job='MANAGER' group by deptno) t,salgrade where 经理人平均薪水 between losal and hisal) t where grade=(select min(grade) from (select deptno,avg(sal) 经理人平均薪水 from emp where job='MANAGER' group by deptno));
4.求薪水最高的前5名雇员
select t.*,rownum from (select rownum, ename,sal from emp order by sal desc) t where rownum<=5;
5.求薪水最高的第6到第10名雇员
select ename,sal,rn,rownum from (select t.*,rownum as rn from (select rownum, ename,sal from emp order by sal desc) t) ab where rn>5 and rn<=10;
25.Oracle中, union和minus的作用。
Union: 是将两个或者两个以上的结果集合并在一起;
Minus: 是从一个结果集中减去一部分结果集。
26.Oracle中, union、 minus和intersect 的作用。
27.【上机】Oracle中,用minus的办法求薪水最高的第6到第10名雇员。
select * from ((select ename,sal,rownum from (select ename,sal,rownum as rn from emp order by sal desc) t where rownum<=10)
minus
(select ename,sal,rownum from (select ename,sal,rownum as rn2 fromemp order by sal desc) d where rownum<=5))
order by sal desc;
28.【上机】使用create table empCopy as Select * from emp;复制一张新表出来。
29.【上机】为新表增加记录,测试一下。
insert into empCopy values (7787,'amenda','secretary',7788,to_date('1988/04/08','YYYY/MM/DD'),3000,1500,10);
30.【上机】将新表中所有人的薪水翻番。
update empCopy set sal=sal*2;
31.【上机】将表中薪水大于5000的人全部删掉。
delete empCopy where sal>5000;
32.truncate和delete有什么区别?
TRUNCATE TABLE 在功能上与不带 WHERE 子句的 DELETE 语句相同:
二者均删除表中的全部行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。
TRUNCATE TABLE:删除内容不删除定义 , 释放空间。
DELETE TABLE:删除内容不删除定义,不释放空间。
33.【上机】练习使用DML语句,完成如下一系列操作:
a)创建班级表:
id为主键
班级名称
班级成立时间
班级毕业时间
班级所在教室
create table sclass(
classid number not null primary key,
classname varchar(50) not null,
classstarttime date not null,
classgraduatetime date not null,
classroom varchar(50)not null
)
b)创建学生表:
建立一张用来存储学生信息的表,表中的字段包含了学生的学号、姓名、年龄、入学日期、年级、班级、email等信息,并且为grade指定了默认值为1,如果在插入数据时不指定grade得值,就代表是一年级的学生.
姓名不能为空。
email必须唯一,不能重复。
id为主键
classId作为外键关联到班级表的主键上。
create table STUDENT
(
STUID NUMBER not null,
SNAME VARCHAR2(20) not null,
AGE NUMBER,
SEX VARCHAR2(2),
ENTERDATE DATE,
CLASSID NUMBER,
GRADE VARCHAR2(50) default 1,
EMAIL VARCHAR2(50)
)
alter table STUDENT
add constraint PK_STUID primary key (STUID)
alter table STUDENT
add constraint UNIQUE_EMAIL unique (EMAIL)
alter table STUDENT
add constraint FK_CLASSID foreign key (CLASSID)
references CLASSGROUP (CLASSID);
c)增加2个班级
insert into sclass values(1,'百合班',to_date('2009/08/08','YYYY/MM/DD'),to_date('2012/08/08','YYYY/MM/DD'),'101');
insert into sclass values(2,'牵牛花班',to_date('2010/08/08','YYYY/MM/DD'),to_date('2013/08/08','YYYY/MM/DD'),'202');
d)增加4个学生,并且每个学生都放到相应班级里面
举例:
insert into student values(9,'赵照',22,'男',to_date('2010/08/09','YYYY/MM/DD'),2,1,'5679@qq.com');
insert into student values(10,'孙黎',22,'男',to_date('2010/08/09','YYYY/MM/DD'),2,1,'5680@qq.com');
e)如何删除其中某个班级
(1)先要解除学生表中对班级的外键约束:
alter table STUDENT1
drop constraint FK_CLASSID1
(2)删除某个班级,如:
delete sclass where classid=1;
f)为班级表增加新的字段:教室地址
alter table sclass
add address varchar(50)
g)删除学生表
drop table student
34.什么是事务?为什么需要事务?(查资料说明)
事务是指作为单个逻辑工作单元执行的一组相关操作,这些操作要求全部完成或者全部不完成。事务使使数据库从一种状态变换成为另一种状态,是数据库所特有的。
使用事务的原因:保证数据的安全有效。
35.说出事务的特点?
事务的特性有四个:简称ACID即
1、原子性(Atomic):事务中所有数据的修改,要么全部执行,要么全部不执行。
2、一致性(Consistence):事务完成时,要使所有的数据都保持一致的状态,换言之:通过事务进行的所有数据修改,必须在所有相关的表中得到反映。
3、隔离性(Isolation):事务应该在另一个事务对数据的修改前或者修改后进行访问。
4、持久性(Durability):保证事务对数据库的修改是持久有效的,即使发生系统故障, 也不应该丢失。
36.一个事务,什么时候开启?什么时候结束?
Oracle的事务开始于一个DML(数据库管理语句,如:create、drop、rename、alter)语句。
当以下情况发生时,事务结束:
1、COMMIT/ROLLBACK
2、执行了DDL(数据库定义语句)/DCL(数据库控制语句)语句
3、客户端主动断开数据库的连接(DISCONNECT)
4、数据库关闭(宕机)
另外,一个DDL/DCL语句实际上就是一个事务,其中隐含了COMMIT。
Oracle不需要特别的去指定事务的开始和结束。一个事务的结束就是下一个事务的开始。
37.回退后,是不是指回退到事务执行前数据库的状态?
如果设置了savepoint,则回滚到上一个savepoint;如没设置savepoint,则回滚到事务执行前的状态。
38.简述事务提交和事务回退之后,数据库的状态。
39.事务没有提交。其他用户会不会看到事务的执行结果?
不会。
40.【上机】模仿老师课堂代码,做实验测试事务。
41.索引有什么作用?
索引是一种供服务器在表中快速查找一个行的数据库结构。合理使用索引能够大大提高数据库的运行效率,具体如下:
(1)快速存取数据。
(2)既可以改善数据库性能,又可以保证列值的唯一性。
(3)实现表与表之间的参照完整性
(4)在使用orderby、groupby子句进行数据检索时,利用索引可以减少排序和分组的时间。
42.数据库的索引是什么?为什么使用索引之后查询数据会很快?
43.什么字段适合做索引?什么字段不适合做索引?
应该建索引列的特点:
1) 在经常需要搜索的列上,可以加快搜索的速度;
2) 在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;
3) 在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;
4) 在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;
5) 在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;
6) 在经常使用在WHERE 子句中的列上面创建索引,加快条件的判断速度。
不应该建索引列的特点:
1)对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
2)对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。
3)对于那些定义为blob数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。
4)当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。
44.选取索引的字段有什么技巧,什么字段适合做索引?
45.【上机】针对emp表的ename创建索引。然后删除。
创建:create index index_on_emp on emp(ename);
删除:drop index index_on_emp;
46.序列也是一种数据库对象,不只Oracle有,其他数据库也有。
是oacle提供的用于产生一系列唯一数字的数据库对象。
47.简述序列的作用,并说明哪些数据库包含序列?
48.【上机】创建一个序列(初始值从1000开始,按照10递增). 然后,使用这个序列维护emp表的empno字段的值。
create sequence seq_emp
increment by 10
start with 1000
cache 20;
49.【上机】删除5题中创建的序列
drop sequence seq_emp;
50.列出视图的几个作用?
1.视图是什么?
(1)视图只是一条select语句,并不会存储表对应数据。
(2)查询视图就是查询表,添加视图就是向数据库表中添加数据。
2.视图作用
(1)安全,只读,只操作部分行部分列。
(2)简化操作。
51.解释说明什么叫做视图并说明视图的作用。
见上题。
52.【上机】使用视图重构下面的代码,以前的作业(求平均薪水的等级最低的部门)
select dname, grade from
(select deptno, avg_sal, grade from
(select deptno, avg(sal) avg_sal from emp group by deptno) t,
salgrade s
where
t.avg_sal between s.losal and s.hisal )
t1,
dept
where t1.deptno = dept.deptno
and
t1.grade =
(select min(grade) from
(select deptno, avg_sal, grade from
(select deptno, avg(sal) avg_sal from emp group by deptno) t,
salgrade s
where
t.avg_sal between s.losal and s.hisal )
);
添加创建视图的语句即可:
create view dname_with_lowest_sal_grade
as
select语句……(略)
53.Power Designer软件是用来做什么的?上网查询资料,说明这个软件的历史。
Power Designer的历史:
PowerDesigner最初由Xiao-Yun Wang(王晓昀)在SDP Technologies公司开发完成。在法国称为AMC*Designor,在国际市场上称为S-Designor。在这两个产品名字中都包含“or”,它实际上特指“Oracle”,因为在产品开发的最开始是为Oracle数据库设计的,但是很快就发展并支持市场上所有主流的数据库系统。SDP Technologies是一个建于1983年的法国公司,1995年,Powersoft公司购买了该公司,而在1994年早期,Sybase已经买下了Powersoft公司。在这些并购之后,为了保持Powersoft的产品商标的一致,改名叫做“PowerDesigner”。 目前Sybase拥有PowerDesigner及其法文版PowerAMC的所有权利。
Power Designer的功能:
Power Designer 是Sybase公司的CASE工具集,使用它可以方便地对管理信息系统进行分析设计,他几乎包括了数据库模型设计的全过程。利用Power Designer可以制作数据流程图、概念数据模型、物理数据模型,还可以为数据仓库制作结构模型,也能对团队设计模型进行控制。他可以与许多流行的软件开发工具,例如PowerBuilder、Delphi、VB等相配合使开发时间缩短和使系统设计更优化。
power designer是能进行数据库设计的强大的软件,是一款开发人员常用的数据库建模工具。使用它可以分别从概念数据模型(Conceptual Data Model)和物理数据模型(Physical Data Model)两个层次对数据库进行设计。在这里,概念数据模型描述的是独立于数据库管理系统(DBMS)的实体定义和实体关系定义;物理数据模型是在概念数据模型的基础上针对目标数据库管理系统的具体化。
54.是否使用过Power Designer软件,在数据库设计阶段是如何使用的?
55.【上机】完成如下有关Power Designer的操作:
1. power deisgner的安装步骤
2. power deisgner建立实体图模型步骤
3. power deisgner建立表的步骤
4. power deisgner建立主键步骤(Oracle下跟序列相关联)
5. power deisgner建立外键步骤
6. 建立Oracle中的测试表Emp和Dept类似的结构,并将它生成sql语句,执行这些sql语句在数据库中生成相应的表。
56.【上机】在navicat或SQLyog中建数据库:bjsxt,在这个数据库下建表:
_class:id,班级名称,地址
_stu:id,name,classId(外键关联到_class表)
57.【上机】将上题中表的数据导出成sql文件,然后使用power designer的逆向
生成PDM图。
58.【上机】power designer中,使用mysql数据库时,主键自动递增怎么实现?
59.简述数据库的三大范式,并说明为什么在进行数据库设计的时候要遵循三范式?
范式的定义:是指导数据库设计的规范化理论,可以保证数据库设计质量
第一范式:
(1)最基本的范式
(2)数据库表每一列都是不可分割的基本数据项,同一列中不能有多个值
(3)简单说就是要确保每列保持原子性(字段不能再分)
第二范式:
(1)需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。
(2)即在一个数据库表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。
(3)简单说就是不存在局部依赖。
第三范式:
(1)确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
(2)属性不依赖于其他非主属性。
(3)简单说就是不存在传递依赖(间接依赖) 。
范式的优缺点:
优点
a)结构合理
b)冗余较小
c)避免插入删除修改异常
缺点
d)性能降低:多表查询比单表查询速度慢
范式的应用特例:特定表的的设计可以违反第三范式,增加冗余提高性能
60.数据库设计中,一对多如何处理?
数据库外键关系表示的其实是一种一对多关系,所以处理一对多时可以使用外键。
61.数据库设计中,多对多一般如何处理?
引入中间表,把一个多对多表示为两个一对多。