黄刚创意工作室·IT技术部
录如C:\\test进入该目录后执行del *.*删除所有,然后键入命令exp后提示输入用户名和口令,就是你要备份哪个就输哪个,接下来提示输入数组提取缓冲区大小,这个没关系(内存里的一个小区域填满了再统一拿到硬盘上来)一路回车就行,等着它导完就可以了;3.创建新用户create user huanggang identified by haha0832 default tablespace users quota 10M on users;用户名huanggang口令haha0832在users表空间里分配10M的默认表空间给该用户;4.给予相应权限grant create session,create table,create view to huanggang,如果没有session它登录都是问题;5.导入文件imp后回车几个后提示是否导入整个导出文件选否后输入想导入的那个用户数据的用户名。只有2和5是在命令行中完成,其余是超级用户登录后在数据库里完成。 insert into+表名+values(各字段值),在对这些数据进行操作时最好有一个备份,方法很简单rollback回退操作,create table 表名 as select * from +欲备份表名;insert语句还有一种插入方法,insert into dept2(deptno,loc) values(50,'beijing');只是插入部分字段的值,其他字段的值为null,还有一种方法是insert into dept2 select * from dept;将select子句选出的记录挨个插入前提是选出的记录与该表的记录格式相同。 在Oracle中取完相应字段后,会在末尾附加一个伪字段,你看不到,叫做rownum,它是记录下每条记录在第几行了,用它的时候有个限制条件只能与<或<=在一起使用,在其他数据库里没这种限制,且用起来也比较简单,与其他数据库不兼容的地方,实在要用的话非得加上一个子查询得出rownum字段。比如要取出工资最高的第六个到第十个人: select ename,sal,r from
( select ename, sal,rownum r from
( select ename,sal from emp order by sal desc) )
where r>=6 and r<=10 ;
这个在Oracle里面是效率最高的,如果通过连接数据库用Java编程来做,但效率相当低。这个重点掌握,比如说显示论坛里的帖子是分页显示的,如果想显示第4页的内容一定是从某一个帖子到某一个帖子显示出来,帖子这个记录是按照发帖时间倒序排列的。三层嵌套就是Oracle对这种问题的解决方案,当然每一种数据库有自己的解决方式。 SQL面试题: 有3个表S,C,SC。S(SNO,SNAME)代表(学号,姓名);C(CNO,CNAME,CTEACHER)代表(课号,课名,教师);SC(SNO,CNO,SCGRADE)代表(学号,课程成绩)。 问题:
1. 找出没选过“黎明”老师课程的所有学生姓名;
2. 列出2门以上(含2门)不及格学生姓名及平均成绩; 3. 既学过1号课程又学过2号课程所有学生姓名。
请用标准SQL语言写出答案,方言也行(请说明使用什么方言)。
(1) select sname from s join sc on (s.sno=sc.sno) join c on (c.cno=sc.no) where c.cteacher <>
‘liming’;
(2) select sname from s where sno in (select sno from sc where scgrade <60 group by sno
having count(*) >=2);
(3) select sname from s where sno in (select sno from sc where cno=1 and sno = (select sno
from sc where cno=2));
update 的作用相对于对记录进行修改。用法是update+表名+set+字段列表及更新值过滤条件;delete+from+表名+过滤条件,删除某些字段。
6
黄刚创意工作室·IT技术部
五. 接下来讲数据定义语言ddl语言。它实现了数据表,视图等的建立。事务transaction就是一系列的操作,要么同时完成要么不完成,比如转账操作要对两个账户update,不会出现数据不一致。对于Oracle来说,一个transcation起始于一条dml语句,然后一系列的操作rollback回退事务会结束;或commit结束事务,再rollback也没用;当遇到一条dcl语句或ddl语句提交结束事务;当正常退出exit时提交结束事务,不正常退出时(如断电)自动回滚结束事务。 数据库常用对象是指它经常使用的一些资源,比方说表、视图或其他资源。下面讲如何创建一张表,create table +表名+字段及字段的数据类型。Oracle常用的数据类型有变长字符串varchar2(最长字符数即上界4k)、定长字符串char(所占大小)。有了变长字符串后为什么还要有定长字符串呢?主要还是效率问题,跟数组很像,但是站空间,很多结构、算法都存在拿空间换时间问题,如HashTable。数字型number(m,n)m指总共多少为,n是小数点后的位数;日期date,包含年月日时分秒;变长字符串long可达2G,主要是有些时候一篇文本相当长;存图片可以把硬盘上图像的名字存到数据库里,也可以把整张图片存到数据库里。 创建一张表存放学生数据如: create table stu (
id number(8), name varchar(20), sex number(10), age number(3), sdate date,
grade number(2) default 1, class number(2), email varchar2(50) );
sex取数字来表示更节省空间,入学时日期加个s避免和关键字冲突,可以为某些字段指定默认值当插入记录时没有对该字段赋新值就以该默认值,其他没有默认值为null。 五个约束条件第一个叫非空,第二个叫唯一,第三个叫主键,第四个叫外键第五个叫check。当我们创建这张表的时候,有一个最简单的条件字段非空not null。在Oracle里面约束条件也可以看成一个对象,能为之取一个名字,加一个关键字constraint+约束名,如name varchar(2) constraint stu_name_nn not null,不起时系统自动起名字我们不用管了。唯一约束的意思是在这个字段里面所有的记录不能重复,如id number(8) unique,这属于字段级的约束;字段级的约束有些限制,比如要某些字段组合不能重复,还有就是两个空值它不认为是重复的。要达到表级约束方法是在最后一个字段写完后加一句如:constraint stu_name_email_uni unique(email,name)。 主键(primary key)是可以唯一标示整条记录的东西,它代表的意思是既不能为空又不能重复,比如学生学号。E-mail做主键不好因为它可以为null,同时索引的时候数字比字符串效率高。如id number(8) primary key ,也可以加在表级,如constraint stu_id_pk primary key(id),主键也可以是多个字段组合。 外键约束建立在一张表的两个字段上或者是两张表的两个字段上,是比较麻烦的一种约束。在emp和dept就有外键约束,往emp里加记录的时候不允许再dept里没有的部门编号。class number(2) references class(id),参考class这张表的id字段,当然也可以加在表级
7
黄刚创意工作室·IT技术部
上:constraint foreign key (class) references class(id),。注意在写外键约束的时候,stu里的class叫参考字段,class里的id叫被参考字段,加外键的前提是被参考字段必须是主键。删一条记录的时候首先看有没有其他字段参考它,有的话是无法删除的,违反了完整约束条件。 Check约束用得比较少,在写mis系统时数据在Java程序里就已经校验过了。修改表结构是在现有表上修改。在任何项目开发时候建表的SQL语句是要保存下来的,所以可以将表整个删掉再建。添加字段alter table +表名+add(字段名+数据类型)如alter table dept2 add(dphone varchar2(11));删除某个字段如alter table dept2 drop(dphone);还可以修改字段的数据类型,如果里面已经有数据修改的后果应不影响原来存的记录值。 在Oracle里面看当前用户下有哪些表,哪些约束,哪些视图等等这些信息被单独地装在一张表里面,称作数据字典表。user_tables里面装的是当前用户共有多少张表,里面字段可多了,我们关心的是table_name。查询当前用户下有哪些视图:select view_name from user_views;查询当前用户下有哪些表:select table_name from user_tables;查询当前用户下有哪些约束:select constraint_name,[table_name] from user_constraints;。user_tables、user_constraints、user_views这些都是数据字典表,那么一共有多少个数据字典表呢?Oracle专门有另外一张表存放数据字典表的表叫做dictionary,它总共两个字段一个叫table_name数据字典表的名字、还有一个叫comments对于这张数据字典表的描述。总共有600多个数据字典表,这就是Oracle的DBA总是背着个小本本的原因,你要背是不可能的。 索引就相当于字典里的索引一样,它在Oracle里相当于一种新的数据库对象,建立索引的方法create index idx_stu_emil on stu (email);也可以在字段组合上建立索引,以后在查询组合时效率就高,删除索引同删除表方法类似。忘了自己有哪些索引可以采用select index_name from user_indexse;当你给某张表的字段加主键或唯一性约束的时候。建立索引的用处是当你建立了索引后取访问相应数据的时候效率会很高。注意说的是读的效率高了,但存的效率反而低了,因为你得同时往索引表里加索引值,会占用大量的空间。记住一点不要轻易建立索引,除非觉得访问量特别大时。 视图前面也提过,它是一张虚表,严格来讲就是一个子查询。利用它可以简化我们的查询复杂度,同时它也有不好的地方,就是表结构改了它也得跟着改动,增加了维护的难度。视图有些其他功能,比如说我有一个数据库,它里面存了所有的产品信息,而有一个供应商他想看我产品的信息,如果我把整张表都给他看那么关键信息他就全部都看走了,我的销量有多少等等。我可以建立一个视图里面只包含我想要给他看的内容。 序列是Oracle数据库独有的东西,它产生一个唯一、不间断的序列,作用是一般做主键。如下我们要存储BBS里的帖子建立一张表: create table article (
id number,
title varchar2(1024), cont long );
如果要加入一篇文章,采用这种做法select max(id) from article;然后知道了id往里插,但若有另外一个客户端在做数据插入同时也在执行完上面一条语句插入了一条记录就会导致数据不一致的现象。为此我们可以创建一个sequence,每次插的时候访问它的一个属性nextval就会得到不重复的id,实际上它是在内部做了同步的。 六. 范式就是数据库设计的一些规则,而它又是由一个姓‘范’的提出的。讲到设计其实是
8
黄刚创意工作室·IT技术部
很复杂的事情,不能指望用几条规则把所有的都总结出来(你在造永动机,追求银弹silver bullet),所以有时要具体问题具体分析,该打破三范式的时候还是要敢于打破。 三范式追求的是这样的目标:不存在冗余数据,换句话说就是同样的数据不存第二遍。当然除了冗余性外还有一些边缘性的要求,不是很重要,讲到的时候再说。 第一范式的第一个要求-要有主键;第二个要求-列不可分,不能说姓名我还要分成姓和名。 第二范式当一张表里有多个字段作为组合主键的时候,非主键的字段不能够依赖于部分主键,多对多关系的表应分割成三张表,如前一个面试题。 第三范式是不能存在传递依赖,即除了主键之外的其他字段必须直接依赖于主键。比如emp表里的deptno依赖于empno,而loc依赖于empno所以不能放一张表里。 七. PL_SQL是Oracle里面的一个编程语言,比较有用,在Oracle内部写一些存储过程,触发器,函数。基本上每一种数据库都有这么一个语言,SQL-Server叫做T_SQL,如果每个都学比较累,但是可以取学一种然后其他实在要用时再查上手要快很多。可能以后我们接触的写存储过程机会很少,实际上我们用SQL和Java程序就可以解决大部分问题了,这只是让大家有个了解知道有这么回事。 PL语言用来补充SQL语言的,因为后者不带有分支和循环,对于有些问题求解不便,而过程语言可以解决。PL_SQL写程序非常固定,分为四块,第一块叫declare,声明各种变量和游标的地方,可选;第二个叫begin,就是说程序从这开始执行了;exception是catch到任何异常时要执行的;end是结束,后面得有一个分号。 set serveroutput on; begin
dbms_output.put_line('hi,pl_sql!'); end; /
第一句是将内部环境变量打开,默认的是关掉的,不然看不到任何输出结果。dbms_output相当于system.out而put_line相当于println。 declare
v_name varchar2(20); begin
v_name := 'huanggang';
dbms_output.put_line(v_name); end; /
变量名的写法是v_+名字,声明的时候是变量名在前,类型在后;赋值语句有点像pascal冒号等号; declare
v_name number := 0; begin
v_name := 2/v_name;
dbms_output.put_line(v_name); exception
when others then
9
黄刚创意工作室·IT技术部
dbms_output.put_line('Error!'); end; /
当检测到异常时才执行exception,when others then 这样做就相当于一张大网子,肯定能把异常捕获到。 PL_SQL变量声明规则:变量名不能够使用保留字(Oracle里保留字很多所以推荐使用v_+名字,这样不易冲突),如select、from等;第一个字符必须是字母;变量名最多包含30个字符;不要与数据库的表或者列同名;每一行只能声明一个变量。常用变量类型7种:binary_integer整数主要是计数而不是用来表示字段类型(用来for循环,数组下标,效率比较高,Oracle追求的目标);number数字类型;char定长字符串;date日期;long长字符串可达2GB;boolean布尔可取true、false或null值,建议大家布尔类型在用的时候一定要给一个初值,否则是null。 declare
v_temp number(1);
v_count binary_integer :=0; v_sal number(7,2) := 4000.00; v_date date := sysdate;
v_pi constant number := 3.14; v_valid boolean := false;
v_name varchar2(20) not null :='myName'; begin
dbms_output.put_line('v_temp value:'||v_date); end; /
dbms_output.put_line不能打印处布尔类型的值。Constant相当于Java的final ,not null对变量进行限制。 Oracle里面的变量经常用来存储某一张表的某个字段的值,使用%type属性为了解决表里字段的变动与声明变量类型一致。在PL_SQL里面可以使用 两个短横线注释掉一行,注释掉多行的时候用/* */。 declare
v_empno number(4);
v_empno2 emp.empno%type; v_empno3 v_empno2%type; begin
dbms_output.put_line(‘Test’); end;
%type可以看做变量的一个属性,指示其类型;引用某张表某个字段方法如v_empno2 emp.empno%type;。 下面接着讲PL_SQL里面复杂的变量,可以定义复合变量,有两种:Table相当于Java里的数组;Record相当于Java里的类,暂且这样理解。要指定table的数据类型,比较复杂是这样来做—type type_table_emp_empno is table of emp.empno%type index by binary_integer;type定义了一种新的数据类型名字叫type_table_emp_empno,然后可以用它定义新变量如 v_empnos type_table_emp_empno;。比较有意思的是下标可以取负值如v_empnos(-1)。
10