`
shine1200
  • 浏览: 40199 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

oracle

阅读更多
1.第一课:客户端  
2.        1. Sql Plus(客户端),命令行直接输入:sqlplus,然后按提示输入用户名,密码。  
3.        2. 从开始程序运行:sqlplus,是图形版的sqlplus.  
4.        3. http://localhost:5560/isqlplus  
5.         
6.        Toad:管理, PlSql Developer:  
7. 
8.第二课:更改用户  
9.        1. sqlplus sys/bjsxt as sysdba  
10.        2. alter user scott account unlock;(解锁)  
11.第三课:table structure         
12.        1. 描述某一张表:desc 表名  
13.        2. select * from 表名  
14.第四课:select 语句:  
15.       1.计算数据可以用空表:比如:.select 2*3 from dual  
16.       2.select ename,sal*12 annual_sal from emp;与select ename,sal*12 "annual sal" from emp;区别,加双引号保持原大小写。不加全变大写。  
17.        
18.       3. select ename || "abcd" 如果连接字符串中含有单引号,用两个单引号代替一个单引号。  
19.第五课:distinct 
20.        select deptno from emp;  
21.        select distinct deptno from emp;  
22.        select distinct deptno from emp;  
23.        select distinct deptno ,job from emp  
24.        去掉deptno,job两者组合的重复。更多的项,就是这么多项的组合的不重复组合。  
25.第六课:Where 
26.        select * from emp where deptno =10;  
27.        select * from emp where deptno <>10;不等于10         
28.        select * from emp where ename ='bike';  
29.        select ename,sal from emp where sal between 800 and 1500 (>=800 and <=1500)  
30.        空值处理:  
31.        select ename,sal,comm from emp where comm is (not) null;  
32.        select ename,sal,comm from emp where ename ( not)in ('smith','king','abc');  
33.        select ename from emp where ename like '_A%';_代表一个字母,%代表0个或多个字母. 如果查询%  
34.        可用转义字符.\%. 还可以用escape '$'比如:select ename from emp where ename like '%$a%' escape '$';  
35.第七课: orderby  
36.         
37.         select * from dept;  
38.         select * from dept order by dept desc;(默认:asc)  
39.         select ename,sal,deptno from emp order by deptno asc,ename desc;  
40.第八课: sql function1:     
41.        select ename,sal*12 annual_sal from emp  
42.        where ename not like '_A%' and sal>800  
43.        order by sal desc;  
44.        select lower(ename) from emp;  
45.        select ename from emp  
46.        where lower(ename) like '_a%';等同于  
47.        select ename from emp where ename like '_a%' or ename like '_A%';  
48.        select substr(ename,2,3) from emp;从第二字符截,一共截三个字符.  
49.        select chr(65) from dual 结果为:A  
50.        select ascii('a') from dual 结果为:65  
51.        select round(23.652,1) from dual; 结果为: 23.7  
52.        select round(23.652,-1) from dual; 20  
53.   
54.        select to_char(sal,'$99_999_999') from emp;  
55.        select to_char(sal,'L99_999_999') from emp;人民币符号,L:代表本地符号  
56.        这个需要掌握牢:  
57.        select birthdate from emp;  
58.        显示为:  
59.        BIRTHDATE  
60.        ----------------  
61.        17-12月-80  
62.        ----------------  
63.        改为:  
64.        select to_char(birthdate,'YYYY-MM-DD HH:MI:SS') from emp;  
65.         
66.        显示:  
67.          
68.        BIRTHDATE  
69.        -------------------  
70.        1980-12-17 12:00:00  
71.        -------------------  
72.         
73.        select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual; //也可以改为:HH12  
74.        TO_CHAR(SYSDATE,'YY  
75.        -------------------  
76.        2007-02-25 14:46:14  
77.         
78.        to_date函数:  
79.        select ename,birthdate from emp where birthdate > to_date('1981-2-20 12:34:56','YYYY-MM-DD HH24:MI:SS');  
80.        如果直接写 birthdate>'1981-2-20 12:34:56'会出现格式不匹配,因为表中的格式为: DD-MM月-YY.  
81.   
82.         
83.        select sal from emp where sal>888.88 无错.但  
84.        select sal from emp where sal>$1,250,00;  
85.        会出现无效字符错误.  
86.        改为:  
87.        select sal from emp where sal>to_number('$1.250.00','$9,999,99');  
88.         
89.        把空值改为0  
90.        select ename,sal*12+nvl(comm,0) from emp;  
91.        这样可以防止comm为空时,sal*12相加也为空的情况.  
92. 
93.第九课: Group function 组函数  
94.        max,min,avg ,count,sum函数  
95.         
96.        select to_char(avg(sal),'99999999,99') from emp;  
97.         
98.         
99.        select round(avg(sal),2) from emp;  
100.        结果:2073.21  
101.           
102.        select count(*) from emp where deptno=10;  
103.        select count(ename) from emp where deptno=10; count某个字段,如果这个字段不为空就算一个.  
104.        select count(distinct deptno) from emp;  
105.        select sum(sal) from emp;  
106.第十课: Group by语句  
107.         
108.        需求:现在想求,求每个部门的平均薪水.  
109.        select avg(sal) from emp group by deptno;  
110.        select deptno avg(sal) from emp group by deptno;  
111.         
112.        select deptno,job,max(sal) from emp group by deptno,job;  
113.         
114.       求薪水值最高的人的名字.  
115.       select ename,max(sal) from emp;出错,因为max只有一个值,但等于max值的人可能好几个,不能匹配.  
116.       应如下求:  
117.       select ename from emp where sal=(select max(sal) from emp);  
118.       Group by语句应注意,  
119.       出现在select中的字段,如果没出现在组函数中,必须出现在Group by语句中.  
120.         
121.     
122.  第十一课: Having 对分组结果筛选  
123.        
124.       Where是对单条纪录进行筛选,Having是对分组结果进行筛选.  
125.       
126.       select avg(sal),deptno from emp  
127.       group by deptno  
128.       having avg(sal)>2000;  
129.        
130.       查询工资大于1200雇员,按部门编号进行分组,分组后平均薪水大于1500,按工薪倒充排列.  
131.       select * from emp  
132.       where sal>1200  
133.       group by deptno  
134.       having avg(sal)>1500  
135.       order by avg(sal) desc;  
136.         
137.   第十二课:字查询  
138.        
139.       谁挣的钱最多(谁:这个人的名字,  钱最多)  
140.        
141.       select 语句中嵌套select 语句,可以在where,from后.  
142.        
143.              
144.       问那些人工资,在平均工资之上.  
145.        
146.       select ename,sal from emp where sal>(select avg(sal) from emp);  
147. 
148.       查找每个部门挣钱最多的那个人的名字.  
149.       select ename ,deptno from emp where sal in(select max(sal) from ename group by deptno) 查询会多值.  
150.       应该如下:  
151.        
152.       select  max(sal),deptno from emp group by deptno;当成一个表.语句如下:  
153.       select ename, sal from emp join(select  max(sal) max_sal,deptno from emp group 
154.       by deptno) t on(emp.sal=t.max_sal and emp.deptno=t.deptno);  
155.        
156.       每个部门的平均薪水的等级.  
157.       分析:首先求平均薪水(当成表),把平均薪水和另外一张表连接.  
158.        
159.        
160.第十四课:self_table_connection  
161.        
162.       把某个人的名字以及他的经理人的名字求出来(经理人及这个人在表中同处一行)  
163.        
164.       分析:首先求出这个人的名字,取他的编号,然后从另一张表与其相对应编号,然后找到经理的名字.  
165.        
166.       select e1.ename ,e2.ename from emp e1,emp e2 where e1.mgr= e2.empno.  
167.        
168.       empno编号和MGR都是编号.  
169. 
170.第十15课: SQL1999_table_connections     
171.          
172.      select ename,dname,grade from emp e,dept d, sqlgrade s  
173.      where e.deptno = d.deptno and e.sql between s.losal and s.hisal and 
174.      job<>'CLERK';  
175.       
176.      有没有办法把过滤条件和连接条件分开来? 出于这样考虑,Sql1999标准推出来了.有许多人用的还是  
177.      旧的语法,所以得看懂这种语句.  
178.       
179.       
180.       
181.      select ename,dname from emp,dept;(旧标准).  
182.      select ename,dname from emp cross join dept;(1999标准)  
183.        
184.      select ename,dname from emp,dept where emp.deptno=dept.deptno (旧)  
185.      select ename,dname from emp join dept on(emp.deptno = dept.deptno); 1999标准.没有Where语句.  
186.      select ename,dname from emp join dept using(deptno);等同上句,但不推荐使用.  
187.       
188.      select ename,grade from emp e join salgrade s on(e.sal between s.losal and s.hisal);  
189.      join 连接语句, on过滤条件。连接,条件一眼分开。如果用Where语句较长时,连接语句和过滤语句混在一起。  
190.       
191.      三张表连接:  
192.      slect ename,dname, grade from 
193.      emp e join dept d on(e.deptno=d.deptno)  
194.      join salgrade s on(e.sal between s.losal and s.hisal)  
195.      where ename not like '_A%';  
196.      把每张表连接 条件不混在一起,然后数据过滤条件全部区分开来。读起来更清晰,更容易懂一点。  
197.       
198.      select e1.ename,e2.ename from emp e1 join emp e2 on(e1.mgr = e2.emptno);  
199.      左外连接:会把左边这张表多余数据显示出来。  
200.      select e1.ename,e2,ename from emp e1 left join emp e2 on(e1.mgr =e2.empno);left 后可加outer 
201.      右外连接:  
202.    select ename,dname from emp e right outer join dept d on(e.deptno =d.deptno); outer可以取掉。  
203.         
204.      即把左边多余数据,也把右边多余数据拿出来,全外连接。  
205.      select ename,dname from emp e full join dept d on(e.deptno =d.deptno);  
206. 
207.16-23 课:求部门平均薪水的等级  
208.       A.求部门平均薪水的等级。  
209.       select deptno,avg_sal,grade from 
210.       (select deptno,avg(sal) avg_sal from emp group by deptno)t  
211.       join salgrade s on(t.avg_sal between s.losal and s.hisal)  
212.        
213.       B.求部门平均的薪水等级  
214.       select deptno,avg(grade) from 
215.       (select deptno,ename, grade from emp join salgrade s on(emp.sal between s.losal and 
216.       s.hisal)) t  
217.       group by deptno  
218.       C.那些人是经理  
219.       select ename from emp where empno in(select mgr from emp);  
220.       select ename from emp where empno in(select distinct mgr from emp);  
221.        
222.       D.不准用组函数,求薪水的最高值(面试题)  
223.        
224.       select distinct sal from emp where sal not in(  
225.       select distinct e1.sal from emp e1 join emp e2 on (e1.sal<e2.sal));  
226.        
227.       E.平均薪水最高的部门编号  
228.        
229.       select deptno,avg_sal from 
230.       (select avg(sal)avg_sal,deptno from emp group by deptno)  
231.       where avg_sal=  
232.       (select max(avg_sal)from 
233.       (select avg(sal) avg_sal,deptno from emp group by deptno)  
234.       )  
235.       
236.       F.平均薪水最高的部门名称  
237.       select dname from dept where deptno=  
238.      (  
239.        select deptno from 
240.        (select avg(sal)avg_sal,deptno from emp group by deptno)  
241.        where avg_sal=  
242.        (select max(avg_sal)from 
243.        (select avg(sal) avg_sal,deptno from emp group by deptno)  
244.        )  
245.       )  
246.       
247.      G.求平均薪水的等级最低的部门的部门名称  
248.         
249.        组函数嵌套  
250.        如:平均薪水最高的部门编号,可以E.更简单的方法如下:  
251.        select deptno,avg_sal from 
252.        (select avg(sal) avg_sal,deptno from emp group by deptno)  
253.        where avg_sal =  
254.        (select max(avg(sal)) from emp group by deptno)  
255.         
256.        组函数最多嵌套两层  
257.         
258.        分析:  
259.        首先求  
260.        1.平均薪水: select avg(sal) from group by deptno;  
261.        2.平均薪水等级:  把平均薪水当做一张表,需要和另外一张表连接salgrade  
262.        select  deptno,grade avg_sal from 
263.          ( select deptno,avg(sal) avg_sal from emp group by deptno) t  
264.        join salgrade s on(t.avg_sal between s.losal and s.hisal)  
265.         
266.        上面结果又可当成一张表。  
267.         
268.        DEPTNO    GRADE    AVG_SAL  
269.      --------  -------  ----------  
270.        30           3   1566.66667  
271.        20           4   2175  
272.        10           4   2916.66667  
273.        3.求上表平均等级最低值  
274.         
275.        select min(grade) from 
276.        (  
277.          select deptno,grade,avg_sal from 
278.           (select deptno,avg(sal) avg_sal from emp group by deptno)t  
279.          join salgrade s on(t.avg_sal between s.losal and s.hisa)  
280.         )  
281.        4.把最低值对应的2结果的那张表的对应那张表的deptno, 然后把2对应的表和另外一张表做连接。  
282.           
283.          select dname ,deptno,grade,avg_sal from 
284.            (  
285.         select deptno,grade,avg_sal from 
286.              (select deptno,avg(sal) avg_sal from emp group by deptno)t  
287.             join salgrade s on(t.avg_sal between s.losal and s.hisal)  
288.             ) t1  
289.            join dept on (t1.deptno = dept.deptno)  
290.            where t1.grade =  
291.            (  
292.              select deptno,grade,avg_sal from 
293.               (select deptno,avg(sal) avg_sal from emp group by deptno) t  
294.                join salgrade s on(t.avg_sal between s.losal and s.hisal)  
295.               )  
296.            )  
297.         结果如下:  
298.          
299.        DNAME    DEPTNO     GRADE    AVG_SAL  
300.      --------  -------  --------   --------  
301.        SALES        30        3    1566.6667  
302.      
303.          
304.       H: 视图(视图就是一张表,一个字查询)  
305.         
306.       G中语句有重复,可以用视图来简化。  
307.       conn sys/bjsxt as sysdba;  
308.       grant create table,create view to scott;  
309.       conn scott/tiger  
310.       创建视图:  
311.       create view v$_dept_avg-sal_info as 
312.       select deptno,grade,avg_sal from 
313.        ( select deptno,avg(sal) avg_sal from emp group by deptno)t  
314.       join salgrade s on 9t.avg_sal between s.losal and s.hisal)  
315.       
316.       然后  
317.       select * from v$_dept_avg-sal_info  
318.        
319.       结果如下:  
320.       DEPTNO      GRADE    AVG_SAL  
321.      --------  -------  ----------  
322.        30           3   1566.66667  
323.        20           4   2175  
324.        10           4   2916.66667  
325.       然后G中查询可以简化成:  
326.       select  dname,t1.deptno,grade,avg_sal from 
327.       v$_dept_avg-sal_info t1  
328.       join dept on9t1.deptno =dept.deptno)  
329.       where t1.grade=  
330.       (  
331. select min(grade) from v$_dept_avg-sal_info t1  
332.       )  
333. 
334.求比普通员工最高薪水还要高的经理人的名称   
335.    先求普通员工的最高薪水   
336.    select max(sal) from emp where empno not in   
337.     (select distinct mgr from emp where mgr is not null);   
338.      
339.    select ename from emp where empno in   
340.     (select distinct mgr from emp where mgr is not null)   
341.    and sal >   
342.     (   
343.     select max(sal) from emp where empno not in   
344.       (select distinct mgr from emp where mgr is not null);      
345.     )   
346.   
347.第二十四课   
348.    备份与恢复   
349.    DOS环境下:exp导出,imp导入   
350.    --drop user yugang cascade;   
351.    --cd \   
352.    --cd temp   
353.    =-delete *.*   
354.    --exp   
355.    --create user yugang indentified by yugang default tablespace users quota 10M on         users   
356.    --grant create session,create table,create view to yugang   
357.    --imp the data   
358.    第一次输入的用户名密码为:yugang/yugang   
359.    第二次输入的用户名密码为:导出数据的用户的用户名和密码   
360.    --rollback   
361.    create table emp2 as select * from emp;   
362. 
363.第二十五课:rownum   
364.    rownum是在Oracle中在表的后面加的一个尾字段,并且只能使用诸如rownum<n或rownum<=n这样的        形式,不能与>或>=相连接   
365. 
366.    1.求薪水值最高的前5条记录.   
367.    select ename,sal from emp order by sal desc where sal <= 5;   
368.    2.求薪水值最高的第6~10条记录.   
369.    select ename,sal from   
370.     (   
371.       select ename,sal,rownum r from   
372.         (select ename,sal from emp order by sal desc)   
373.     )   
374.    where r >=6 and r <= 10;   
375. 
376. 
377.第二十六课:homework_dml_transaction   
378.    SQL面试题   
379.    有三张表S、C、SC   
380.    S(SNO、SNAME)代表(学号、姓名)   
381.    C(CNO、CNAME、CTEACHER)代表(课号、课名、老师)   
382.    SC(SNO、CNO、SCGRADE)代表(学号、课号、成绩)   
383.    1.求出没选过郭富城老师的所有学生姓名   
384.    2.列出2门以上(含2门)不及格的学生姓名及平均成绩   
385.    3.既学过1号课程又学过2号课程的所有学生姓名   
386.    1.select sname from s join sc on (s.sno = sc.sno) join c on (c.cno = sc.cno)   
387.    where c.cteacher <> '郭富城';   
388.    2.select sname from s where sno in   
389.     (   
390.       select sno from sc where scgrade < 60 group by sno having count(*) >= 2   
391.     )   
392.    3.select sname from s where sno in   
393.     (   
394.       select sno from sc where cno=1 and sno in   
395.         (select distinct sno from sc where cno=2)   
396.     )   
397. 
398.    事务transaction代表一组不可分割的操作,要么全部执行,要么全部不执行,   
399.    transaction起始于一条DML语句,结束于commit;语句,或者是DCL、DDL语句,在事务未提交前      
400.    可以通过rollback回滚事务,正常退出事务会自动提交,非正常退出事务会自动回滚。   
401. 
402.第二十七课:create table   
403.    create table student   
404.    (   
405.    id number(6),   
406.    name varchar2(20),   
407.    sex number(1),   
408.    age number(3),   
409.    sdate date,   
410.    grade number(2) default 1,   
411.    class number(4),   
412.    email varchar2(50)   
413.    );   
414.      
415.第二十八~三十课 constraint   
416.    not null,unique(当某字段有unique约束时,可以插入空值,空值之间不重复)、主键、外键、        check约束   
417.    create table student   
418.    (   
419.    id number(6),   
420.    name varchar2(20) constraint stu_name_nn not null,   
421.    sex number(1),   
422.    age number(3),   
423.    sdate date,   
424.    grade number(2) default 1,   
425.    class number(4),   
426.    email varchar2(50) unique   
427.    )   
428.    /   
429.    行级约束(放在字段后面)与表级约束(加在表后面):   
430.    create table student   
431.    (   
432.    id number(6),   
433.    name varchar2(20) constraint stu_name_nn not null,   
434.    sex number(1),   
435.    age number(3),   
436.    sdate date,   
437.    grade number(2) default 1,   
438.    class number(4),   
439.    email varchar2(50),   
440.    constraint stu_email_name_uni unique(name,email)   
441.    )   
442.    /   
443.    主键约束   
444.    create table student   
445.    (   
446.    id number(6) primary key,   
447.    name varchar2(20) constraint stu_name_nn not null,   
448.    sex number(1),   
449.    age number(3),   
450.    sdate date,   
451.    grade number(2) default 1,   
452.    class number(4),   
453.    email varchar2(50),   
454.    constraint stu_email_name_uni unique(name,email)   
455.    )   
456.    /   
457.    create table student   
458.    (   
459.    id number(6),   
460.    name varchar2(20) constraint stu_name_nn not null,   
461.    sex number(1),   
462.    age number(3),   
463.    sdate date,   
464.    grade number(2) default 1,   
465.    class number(4),   
466.    email varchar2(50),   
467.    constraint stu_id_pk primary key(id),   
468.    constraint stu_email_name_uni unique(name,email)   
469.    )   
470.    /   
471.    外键约束   
472.    外键约束被参考的字段必须是主键。   
473.    create table class   
474.    (   
475.    id number(4) primary key,   
476.    name varchar2(20) not null   
477.    )   
478.    /   
479.    create table student   
480.    (   
481.    id number(6),   
482.    name varchar2(20) constraint stu_name_nn not null,   
483.    sex number(1),   
484.    age number(3),   
485.    sdate date,   
486.    grade number(2) default 1,   
487.    class number(4) references class(id),   
488.    email varchar2(50),   
489.    constraint stu_id_pk primary key(id),   
490.    constraint stu_email_name_uni unique(name,email)   
491.    )   
492.    /   
493. 
494.    create table student   
495.    (   
496.    id number(6),   
497.    name varchar2(20) constraint stu_name_nn not null,   
498.    sex number(1),   
499.    age number(3),   
500.    sdate date,   
501.    grade number(2) default 1,   
502.    class number(4),   
503.    email varchar2(50),   
504.    constraint stu_id_pk primary key(id),   
505.    constraint stu_class_fk foreign key (class) references class(id),   
506.    constraint stu_email_name_uni unique(name,email)   
507.    )   
508.    /   
509. 
510.第三十一课:alter table drop table   
511.    alter table student add(addr varchar2(100));   
512.    alter table student drop(addr);   
513.    alter table student modify(addr varchar2(50));   
514.    若addr字段中有的记录长度大于50,则修改不成功。   
515.    alter table student drop constraint stu_class_fk;   
516.    alter table student add constraint stu_class_fk foreign key (class)   
517.    references class (id);   
518.    drop table class;   
519.第32课:Oracle dictionaries   
520.    desc user_tables;   
521.    select table_name from user_tables;   
522.    select view_name from user_views;   
523.    select constraint_name from user_constraints;   
524.    select constraint_name,table_name from user_constraints;   
525.    desc dictionary;   
526. 
527.第33课:indexes_and_views   
528.    索引可以提高读数据的效率,但会降低修改、写数据的效率,索引还会占用一定的存储空间   
529.    create index idx_stu_email on student(email);   
530.    drop index idx_stu_email;   
531.    视图会带来一些维护的代价,比如表结构改了,那么视图也得跟着改变。视图还可以用来保   
532.    护私有数据。   
533.    select index_name from user_indexes;   
534.    select view_name from user_views;   
535.      
536.第34课:sequences and review   
537.    序列可以自动增长,在sql server中有identity,mysql中有auto_increment   
538.    create table article   
539.    (   
540.    id number,   
541.    title varchar2(1024),   
542.    cont long   
543.    )   
544.    /   
545.    如何保证插入数据时id不重复?   
546.    select max(id) from article;这样做也不行,如果有多个线程同时访问数据,则可能会出现   
547.    数据不一致的现象,比方说第一个用户查询出最大id值是100,第二个用户也查询出最大id是   
548.    100,然后第二个用户新插入一条记录:id是101,然后第一个用户也插入了一条记录:id也是   
549.    101   
550.    可以用Oracle的sequence   
551.    create sequence seq_article_id;   
552.    多个表之问可以共用一个序列,但是一般情况下为每个字段分别建立一个序列   
553.    sequence有两个属性CurrVal、NextVal   
554.    select seq.nextvalue from dual;   
555.    insert into article values(seq.nextval,'y','yy');   
556.    insert into article values(seq.nextval,'x','xx');   
557.    insert into article values(seq.nextval,'z','zz');   
558.    insert into article values(seq.nextval,'q','qq');   
559. 
560.第35课:三范式   
561.    第一范式:   
562.    1.每个表都要有主键   
563.    2.列不可分,比如:   
564.    create table stu   
565.    (   
566.    id number,   
567.    name varchar2(20),   
568.    age number   
569.    )   
570.    /      
571.    insert into stu values(1,'yu',21);   
572.    create table stu2   
573.    (   
574.    inf long   
575.    )   
576.    /   
577.    insert into stu2 values('1_yu_21');   
578.    虽然表stu2可以字符串解析后可以达到和表stu一样的效果,但是显然第一种方法更好,查询数      
579.    据更加方便,而表stu2违反了第一范式的列不可分原则。   
580.    第二范式:   
581.    当有两个以上字段作主键时,非主键字段不能部分依赖于主键字段,如有一个需求,一门老师教        多名学生,一名学生可以选多个老师的课。然后设计了一张表,有以下字段(老师编号、学生编        号、老师姓名、学生姓名等),其中以老师编号和学生编号作联合主键,则些表就存在部分依赖        ,老师姓名部分依赖于老师编号,不满足第二范式,有数据冗余。要解决这个问题可以设计三张        表。   
582.    第三范式:   
583.    不能存在传递依赖,如有一张表有以下字段:(学号、姓名、班级号、班级名称、班级位置),        其中学号为主键,则班级号依赖于学号,每个学生都有相应的班级号,但是班级名称、班级位置        是依赖于班级号,即它们通过班级号传递依赖于学号,不满足第三范式。   
584. 
585.第38课:PL_SQL   
586.    set serveroutput on;   
587.    begin   
588.        dbms_output.put_line('Hello World!!');   
589.    end;   
590.      
591.    declare   
592.        v_name varchar2(20);   
593.    begin   
594.        v_name:='xiaoyu';   
595.        dbms_output.put_line(v_name);   
596.    end;   
597. 
598.    declare   
599.        v_num number:=0;   
600.    begin   
601.        v_num:=2/v_num;   
602.        dbms_output.put_line(v_num);   
603.    exception   
604.        when others then   
605.         dbms_output.put_line('error');   
606.    end;   
607.    --变量声明的规则   
608.    1.变量名不能使用保留字   
609.    2.第一个字符必须是字母   
610.    3.变量名最多包含30个字母   
611.    4.不要与数据库或表名同名   
612.    5.每一行只能声明一个变量   
613.    /*   
614.    这是多行注释   
615.    */   
616.    --常用变量类型   
617.        1.binary_integer:整数,主要用来计数而不是用来表示字段类型   
618.    2.number数字类型   
619.    3.char定长字符串   
620.    4.date日期   
621.    5.long长字符串,最长2GG   
622.    6.boolean类型:可以取值true、false、null,默认为null,另外boolean类型值不可直接打印   
623.    --变量声明   
624.    declare   
625.        v_temp number(1);   
626.        v_count binary_integer:=0;   
627.        v_sal number(7,2):=8888.88;   
628.        v_date date:=sysdate;   
629.        v_pi constant number(3,2):=3.14;   
630.        v_valid boolean:=false;   
631.        v_name varchar2(20) not null:='geniusxiaoyu';   
632.    begin   
633.        dbms_output.put_line('v_temp value:' || v_temp);   
634.    end;   
635.    --变量声明:使用%type属性   
636.    declare   
637.        v_empno number(4);   
638.        v_empno2 emp.empno%type;   
639.        v_empno3 v_empno2%type;   
640.    begin   
641.        dbms_output.put_line('test for type');   
642.    end;   
643.    --Table变量类型,相当于数组类型   
644.    declare   
645.        type type_table_emp_empno is table of emp.empno%type index by                     binary_integer;   
646.        v_empnos typa_table_emp_empno;   
647.    begin   
648.        v_empnos(0):=7777;   
649.        v_empnos(1):=7778;   
650.        v_empnos(-1):=6666;   
651.        dbms_output.put_line(v_empnos(-1));   
652.    end;   
653.    --Record变量类型,相当于类   
654.    declare   
655.        type type_record_dept is record   
656.        (   
657.         deptno dept.deptno%type,   
658.         dname dept.dname%type,   
659.         loc dept.loc%type   
660.        );   
661.        v_temp type_record_dept;   
662.    begin   
663.        v_temp.deptno:=50;   
664.        v_temp.dname:='yugang';   
665.        v_temp.loc:='beijing';   
666.        dbms_output.put_line(v_temp.deptno || ' ' || v_temp.dname || ' ' ||                 v_temp.loc);   
667.    end;   
668.    --使用%rowtype声明record变量   
669.    declare   
670.        v_temp dept%rowtype;   
671.    begin   
672.        v_temp.deptno:=50;   
673.        v_temp.dname:='yugang';   
674.        v_temp.loc:='beijing';   
675.        dbms_output.put_line(v_temp.deptno || ' ' || v_temp.dname || ' ' ||                 v_temp.loc);   
676.    end;   
677. 
678.    --SQL语句的运用   
679.    --select语句必须和into语句一块使用并且只能返回一条记录   
680.    --sql%rowcount   
681.    declare   
682.        v_name emp.ename%type;   
683.        v_sal emp.sal%type;   
684.    begin   
685.        select ename,sal into v_name,v_sal from emp where empno=7369;   
686.        dbms_output.put_line(v_name || ' ' || v_sal);   
687.    end;   
688. 
689.    declare   
690.        v_temp emp%rowtype;   
691.    begin   
692.        select * into v_temp from emp where empno=7369;   
693.        dbms_output.put_line(v_temp.ename || ' ' || v_temp.eno);   
694.    end;   
695. 
696.    declare   
697.        v_deptno dept.deptno%type:=50;   
698.        v_dname dept.dname%type:='mm';   
699.        v_loc dept.loc%type:='bj';   
700.    begin   
701.        insert into dept values(v_deptno,v_dname,v_loc);   
702.        commit;   
703.    end;   
704. 
705.    declare   
706.        v_deptno dept.deptno%type:=50;   
707.        v_count number;   
708.    begin      
709.        --update emp set sal:=sal/2 where deptno=v_deptno;   
710.        --select deptno into v_deptno from emp where deptno=7369;   
711.        select count(*) into v_count from emp;   
712.        dbms_output.put_line(sql%rowcount || '条记录被影响!');   
713.        commit;   
714.    end;   
715.    --DDL语句,在PLSQL中使用DDL语句要加上execute immediate,两个单引号代表一个单引号   
716.    begin   
717.        execute immediate 'create table tt(name varchar2(20) default ''Army'')';   
718.    end;   
719. 
720.    declare   
721.        v_sal emp.sal%type;   
722.    begin   
723.        select sal into v_sal from emp where empno=7369;   
724.        if(v_sal<1200) then   
725.            dbms_output.put_line('low');   
726.        elsif(v_sal<2000) then   
727.            dbms_output.put_line('middle');   
728.        else   
729.            dbms_output.put_line('high');   
730.        end if;   
731.    end;   
732.      
733.    --循环   
734.    declare   
735.     i binary_integer:=1;   
736.    begin   
737.     loop   
738.     dbms_output.put_line(i);   
739.     i:=i+1;   
740.     exit when (i >= 11);   
741.     end loop;   
742.    end;   
743. 
744.    declare   
745.     j binary_integer:=1;   
746.    begin   
747.     while j<11 loop   
748.       dbms_output.put_line(j);   
749.       j:=j+1;   
750.     end loop;   
751.    end;   
752. 
753.    begin   
754.     for k in 1..10 loop   
755.       dbms_output.put_line(k);   
756.     end loop;   
757.     for k in reverce 1..10 loop   
758.       dbms_output.put_line(k);   
759.     end loop;   
760.    end;   
761. 
762.    --错误处理   
763.    declare   
764.     v_temp number;   
765.    begin   
766.     select empno into v_temp where deptno=10;   
767.    exception   
768.     when too_many_rows then   
769.       dbms_output.put_line('太多记录了');   
770.     when others then   
771.       dbms_output.put_line('error');   
772.    end;   
773. 
774.    declare   
775.     v_temp number;   
776.    begin   
777.     select deptno into v_temp from emp where empno=2222;   
778.    exception   
779.     when no_data_found then   
780.       dbms_output.put_line('没数据');   
781.    end;   
782. 
783.    create table errorlog   
784.    (   
785.    id number primary key,   
786.    errcode number,   
787.    errmsg varchar2(1024),   
788.    errdate date   
789.    );   
790.      
791.    create sequence seq_errorlog_id start with 1 increment by 1;   
792. 
793.    declare   
794.     v_deptno dept.deptno%type:=10;   
795.     v_errcode number;   
796.     v_errmsg varchar2(1024);   
797.    begin   
798.     delete from dept where deptno=v_deptno;   
799.     commit;   
800.    exception   
801.     when others then   
802.       rollback;   
803.       v_errcode:=SQLCODE;   
804.       v_errmsg:=SQLERRM;   
805.       insert into errlog values(seq_errorlog_id.nextVal,v_errcode,v_errmsg,sysdate);   
806.       commit;   
807.    end;   
808. 
809.第47~48课:cursor(重点)   
810.    declare   
811.     cursor c is   
812.       select * from emp;   
813.     v_emp c%rowtype;   
814.    begin   
815.     open c;   
816.     fetch c into v_emp;   
817.     dbms_output.put_line(v_emp.ename);   
818.     close c;   
819.    end;   
820.    --简单循环   
821.    declare   
822.     cursor c is   
823.       select * from emp;   
824.     v_emp c%rowtype;   
825.    begin   
826.     open c;   
827.     loop   
828.       fetch c into v_emp;   
829.       exit when(c%notfound);   
830.       dbms_output.put_line(v_emp.ename);   
831.     end loop;   
832.    end;    
833. 
834.    declare   
835.     cursor c is   
836.       select * from emp;   
837.     v_emp c%rowtype;   
838.    begin   
839.     open c;   
840.     loop   
841.       fetch c into v_emp;   
842.       --下面两行顺序改变后,将会把最后一条记录打印两遍   
843.       dbms_output.put_line(v_emp.ename);   
844.       exit when(c%notfound);   
845.         
846.     end loop;   
847.    end;    
848.    --while循环   
849.    declare   
850.     cursor c is   
851.       select * from emp;   
852.     v_emp emp%rowtype;   
853.    begin   
854.     open c;   
855.     fetch c into v_emp;   
856.     while(c%found) loop   
857.       dbms_output.put_line(v_emp.ename);   
858.       fetch c into v_emp;   
859.     end loop;   
860.     close c;   
861.    end;   
862. 
863.    --for循环   
864.    declare   
865.     cursor c is   
866.       select * from emp;   
867.    begin   
868.     open c;   
869.     for v_emp in c loop   
870.       dbms_output.put_line(v_emp.ename);   
871.     end loop;   
872.     close c;   
873.    end;   
874. 
875.    --带参数的游标   
876.    declare   
877.     cursor c(v_deptno emp.deptno%type,v_job emp.job%type) is   
878.       select ename,sal from emp where deptno=v_deptno and job=v_job;   
879.     --v_emp emp%rowtype;   
880.    begin   
881.     for v_emp in c(30,'JAY') loop   
882.       dbms_output.put_line(v_emp.ename);   
883.     end loop;   
884.    end;   
885. 
886.    --可更新的游标   
887.    declare   
888.     cursor c is   
889.       select * from emp for update;   
890.     --v_temp c%rowtype;   
891.    begin   
892.     for v_temp in c loop   
893.       if(v_temp.sal < 2000) then   
894.         update emp set sal=sal*2 where current of c;   
895.       elsif(v_temp.sal=5000) then   
896.         delete from emp where current of c;   
897.       end if;   
898.     end loop;   
899.     commit;   
900.    end;   
901. 
902.第49~50课:procedure   
903.    create or replace procedure p   
904.    is   
905.     cursor c is   
906.       select * from emp for update;   
907.    begin   
908.     for v_temp in c loop   
909.       if(v_temp.deptno=10) then   
910.         update emp set sal=sal+10 where current of c;   
911.       elsif(v_temp.deptno=20) then   
912.         update emp set sal=sal+20 where current of c;   
913.       else   
914.         update emp set sal=sal+50 where current of c;   
915.       end if;   
916.     end loop;   
917.     commit;   
918.    end;   
919. 
920.    --带参数的存储过程   
921.    create or replace procedure p   
922.     (v_a in number,v_b number,v_ret out number,v_temp in out number)   
923.    is   
924.    begin   
925.     if(v_a<v_b) then   
926.       v_ret:=v_b;   
927.     else   
928.       v_ret:=v_a;   
929.     end if;   
930.     v_temp:=v_temp+1;   
931.    end;   
932. 
933.    declare   
934.     v_a number:=10;   
935.     v_b number:=20;   
936.     v_ret number;   
937.     v_temp number:=99;   
938.    begin   
939.     p(v_a,v_b,v_ret,v_temp);   
940.     dbms_output.put_line(v_ret);   
941.     dbms_output.put_line(v_temp);   
942.    end;   
943. 
944.    /*   
945.    存储过程在创建过程中如果出现错误,仍然会创建,并且不会提示错误在哪儿,可以使用   
946.    show error来查看错误出现在哪儿。   
947.    */   
948. 
949.    create or replace function tax_sal   
950.     (v_sal number)   
951.     return number   
952.    is   
953.    begin   
954.     if(v_sal<2000) then   
955.       return 0.10;   
956.     elsif(v_sal<3000) then   
957.       return 0.20;   
958.     else   
959.       return 0.30;   
960.     end if;   
961.    end;   
962.       
963.    --触发器   
964.    create table emp_log   
965.    (   
966.    uname varchar2(20);   
967.    action varchar2(10);   
968.    atime date   
969.    );   
970.    create or replace trigger trig   
971.     after/before insert or update or delete on emp2 for each row   
972.    begin   
973.     if inserting then   
974.       insert into emp_log values(USER,'insert',sysdate);   
975.     elsif updating then   
976.       insert into emp_log values(USER,'update',sysdate);   
977.     else   
978.       insert into emp_log values(USER,'delete',sysdate);   
979.     end if;   
980.    end;   
981. 
982.    update dept set deptno=99 where deptno=10;   
983.    --违反约束条件   
984.    create or replace trigger trig   
985.     after update on dept for each row   
986.    begin   
987.     update emp set deptno=:NEW.deptno where deptno=:OLD.deptno;   
988.    end;
分享到:
评论

相关推荐

    Oracle 9i Client (Oracle 9i 客户端) 简化版 (不安装Oracle客户端,也可以使用PLSQL Developer)

    Oracle 9i Client (Oracle 9i 客户端) 简化版 (不安装Oracle客户端,也可以使用PLSQL Developer 不用安装Oracle客户端也可以使用PLSQL Developer 绿色! 安全! 轻便! 可靠! 1、本软件可作为简单的Oracle9i客户端...

    Mysql转Oracle软件 DBMover for Mysql to Oracle

    Dbmover for Mysql to Oracle 是高效的将Mysql导入到Oracle数据库的工具。 使用DBMover可以灵活定义Mysql和Oracle之间表和字段的对照关系,也可以在DBMover创建一个查询,把查询结果当作源表转入到Oracle中。 ...

    《Oracle 12c数据库基础教程》教学课件—03Oracle数据库管理工具.pdf

    《Oracle 12c数据库基础教程》教学课件—03Oracle数据库管理工具.pdf《Oracle 12c数据库基础教程》教学课件—03Oracle数据库管理工具.pdf《Oracle 12c数据库基础教程》教学课件—03Oracle数据库管理工具.pdf《Oracle...

    利用python-oracledb库连接Oracledb数据库,使用示例

    python-oracledb的源码和使用示例代码, python-oracledb 1.0,适用于Python versions 3.6 through 3.10. Oracle Database; This directory contains samples for python-oracledb. 1. The schemas and SQL ...

    Oracle Instant Client 11.2.0.1.0 轻量级Oracle客户端

    Oracle Instant Client 11.2.0.1.0是轻量级Oracle客户端,用于连接访问Oracle 9i、10g、11g 11.2.0.1.0版本的Oracle数据库。 Oracle Instant Client11.2.0.1.0 安装程序包含OCI/ OCCI、JDBC-OCI SDK(软件开发工具...

    TiDB&MySql&Oracle介绍及区别

    5. MySQL与ORACLE区别 19 6. 可视化工具 38 三、 ORACLE介绍 38 1. ORACLE是什么? 38 2. ORACLE核心特点是什么? 38 3. ORACLE数据库类型有哪些? 39 4. ORACLE整体架构及工作原理? 39 5. 可视化工具 40

    oracle 9i 全部下载链接

    oracle 9i所有版本最新下载链接 直接迅雷下载 Oracle9i Database Release 2 Enterprise/Standard/Personal Edition for Windows NT/2000/XP ...

    oracle 使用命令创建oracle数据库

    ORACLE_HOME=$ORACLE_BASE/oracle ORACLE_SID=hsj PATH=$ORACLE_HOEM/bin:$PATH; LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH export ORACLE_BASE ORACLE_HOME ORACLE_SID PATH LD_LIBRARY_PATH  3...

    ODP.NET 方式链接oracle数据库的Oracle.ManagedDataAccess.dll文件取代Oracle.DataAccess.dll

    使用了,ODP.NET 方式链接数据库,只要把Oracle.ManagedDataAccess.dll引入取代以前的Oracle.DataAccess.dll即可。 这种方式也是oracle公司提供的,稳定性要比之前那种更好,而且也是免安装客户端的,目前还没测试...

    Oracle11g中文文档.zip

    oracle11g官方中文帮助 Oracle 11g:ORACLE ACTIVE DATA GUARD.pdf Oracle Database 11g 高可用性.pdf Oracle 数据库 11g 中的分区.pdf Oracle 数据库 11g :真正应用测试与可管理性概述.pdf Oracle 数据库 11g...

    oracle11g官方中文文档完整版

    Oracle 11g 官方中文文档 包括一下部分文档: Oracle 11g:ORACLE ACTIVE DATA GUARD.pdf Oracle Database 11g 高可用性.pdf Oracle 数据库 11g :真正应用测试与可管理性概述.pdf Oracle 数据库 11g 中的分区....

    Oracle.ManagedDataAccess 最新版(4.122.21.1)

    oracle.ManagedDataAccess.dll(oracle.ManagedDataAccess.Client)全托管驱动。 此驱动对32位和64位oracle数据库具有很好的连接兼容性。 可采用无客户端远程连接oracle,或在本机使用连接。 使用此驱动可以完全替换...

    Oracle Data Provider for .NET (ODP.NET)

    Oracle 10g 第 2 版 ODAC 和 Oracle Developer Tools for Visual Studio .NET 下载文件 ODTwithODAC1020221.exe 235 MB(247,296,458 字节) ODAC 安装说明 Oracle Developer Tools For Visual ...

    Oracle 19C+13.4EMCC-oem部署和配置(含脚本)

    Oracle 19C+13.4EMCC部署和配置 1 一、安装oracle19C数据库 1 1、 安装oracle19C软件 1 2、 创建PDB 1 3、 设置随机启动 1 4、 修改logfile大小 2 二、利用EM模板创建pdb 3 1. 上传dbca模板并设置解压 3 2. DBCA建库...

    C# winform连接Oracle数据库(直接引用Oracle.ManagedDataAccess.dll使用)

    项目中有个功能需要从一台Oracle数据库获取数据,本以为是很简单的事情,直接将原来的SqlClient换成OracleClient调用,结果远没自己想的简单。有很多需要安装Oracle客户端,网上这方面搜索后,太多的文章,还要不停...

    MySql转换成Oracle工具

    Convert Mysql to Oracle 最新版本:4.0 Convert Mysql to Oracle是一个免费的数据库转换工具,实现快速安全地将Mysql数据库导入为ORACLE数据库。 Convert Mysql to Oracle 功能特点 可以转换所有的Mysql字段类型 ...

    sql expert for oracle 3.2 破解版

    解决的办法其实很简单,在注册表HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE这个位置新建一个字符串值ORACLE_HOME,把oracle的HOME值写进去就可以了!在10g以上的版本中一般ORACLE_HOME都存在HKEY_LOCAL_MACHINE\SOFTWARE\...

    Oracle Instant Client 11g 绿色版(32位)

    自己制作的这个小巧的客户端(文件全部源自Oracle官方网站),原理其实很简单,就是向注册表写几个键值,非常绿色和环保。  下载后,只需要将Oracle压缩文件解压,建议放在D:\Oracle目录下,运行OracleSetup32.exe...

    Oracle 11g 安装包 Windows Linux 系统 32位 64位安装包 客户端 服务器端 都有 百度网盘资源

    Oracle 11g 安装包 Windows Linux 系统 32位 64位安装包。资源由本人辛苦整理而来,因在Oracle官网很难找到下载链接,所以特地拿出来分享,如需其他版本请私信,必回复。 资源包含以下版本: Oracle Database 11.2....

    oracle-instantclient11.2 rpm包

    oracle 11.2.0.4.0-1.x86_64 rpm客户端安装包 文件列表: oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm oracle-instantclient11.2-basiclite-11.2.0.4.0-1.x86_64.rpm oracle-instantclient11.2-devel-...

Global site tag (gtag.js) - Google Analytics