Oracle實戰練習(續二)

#rownum的使用
 select empno, ename, rownum from emp where rownum<=5;
 select empno, ename from emp where rownum>10; #未選定行, 因爲rownum只能與小於或小於等於號一起使用
  select rownum r ,ename from emp;
  select rownum, ename from emp;
  select ename from (select rownum r, ename from emp) where r>10;
# 求薪水最高的前5名 
 select ename, sal from emp order by sal desc;
 select ename, sal from emp where rownum<=5 order by sal desc; #這個是錯誤的,因爲選出來的是前5條記錄,然後再排序.
 #應該是先排序後再選擇前5名
 select ename, sal from (select ename, sal from emp order by sal desc) where
  rownum <=5;
 #求薪水最高的第6位與第10位之間
 #1.先排序
   select ename, sal from emp order by sal desc;
 #2. 顯示rownum, 如果是在上面顯示的話就錯誤.
   select ename, sal, rownum from (select ename, sal from emp order by sal desc);
 #3.薪水最高的第6位與第10位之間
   select ename, sal, rownum r  from
   (select ename, sal, rownum r from
    (select ename, sal from
 emp order by sal desc ) ) where r between 6 and 10;
 # 或者
 select ename, sal, rownum r  from
   (select ename, sal, rownum r from
    (select ename, sal from
 emp order by sal desc ) ) where r >= 6 and r <= 10;
 
 #SQL面試題
 /*有三個表S,C,SC
 S(sno, sname) 代表(學號, 姓名)
 C(cno,cname,cteacher) 代表(課號,課名, 教師)
 SC(sno, cno, scgrade) 代表(學號, 課號成績)
 問題:
 1.找出沒選過"黎明"老師的所有學生姓名
 2.列出2門以上(含2門)不及格學生姓名及平均成績
 3.求學過1號課程又學過2號課程所有學生的姓名
 */
 # 建表,並插入實驗數據
 create table S(sno number(10), sname varchar2(10));
 create table C(cno number(10), cname varchar2(10), cteacher varchar2(20));
 create table SC(sno number(10), cno number(10), scgrade number(3));
 
 insert into S values(20090701, '鄧永勝');
 insert into S values(20090702, '鄧永壽');
 insert into S values(20090703, '鄧永紅');
 insert into S values(20090704, '鄧雄展');
 insert into S values(20090705, '鄧偉新');
 insert into S values(20090706, '鄧嘉誼');
 insert into S values(20090707, '鄧嘉健');
 
 insert into C values('1001', '英語', '張三');
 insert into C values('1002', '語文', '李四');
 insert into C values('1003', '數學', '王五');
 insert into C values('1004', '化學', '劉六');
 insert into C values('1005', '物理', '黎明');
 
 insert into SC values(20090701,'1001', 85);
 insert into SC values(20090702,'1002', 95);
 insert into SC values(20090703,'1003', 86);
 insert into SC values(20090704,'1004', 89);
 insert into SC values(20090704,'1005', 89);
 insert into SC values(20090705,'1004', 55);
 insert into SC values(20090705,'1005', 55);
  insert into SC values(20090705,'1006', 53);
 insert into SC values(20090706,'1005', 58);
 insert into SC values(20090707,'1005', 51);
 
 #1.找出沒選過"黎明"老師的所有學生的姓名
 select sname from s join sc on(s.sno = sc.sno) join c  on(c.cno = sc.cno) where c.cteacher <>'黎明';
 #2.列出2門以上(含2門)不及格學生姓名的平均成績
 select  avg(scgrade) from s join sc on (s.sno = sc.sno) where sname in (select sname from s where sno in(select sno from sc where scgrade <60 group
 by sno having count(*)>=2));
 #3.求學過1號課程又學過2號課程的所有學生的姓名
 select sname from s where sno in (select sno from sc where cno = '1' and sno in(select sno from sc where cno = '5'));
 
update emp2 set sal = sal*2;  #update 語句
delete from dept2;
insert into salgrade values(6,10000,20000);
  rollback; # 事務回滾, 先前的SQL語句無效
  select * from salgrade; #可以看到rollback後,上面的SQL語句無效
  select sal from emp2;   #可以看到rollback後,上面的SQL語句無效
   update emp2 set sal = sal*2;
   select * from emp2;
   select sal from emp2 where ename = 'KING';  #此時的KING的sal是10000
    commit; # 提交事務
    rollback;   #提交事務後再回滾,不起作用
   #查詢一下
    select sal from emp2 where ename = 'KING'; # 此時的KING的sal還是10000, 因爲已經提交了事務
   
 #當在事務提交前插入DDL語句或者DCL語句, 那麼事務回滾無效
  #如下所示:
 update dept2 set deptno = deptno +3;
 select * from dept2;
 create table tt(aa varchar2(10));
 rollback;
 select * from dept2;           # 此時的deptno 是加上了3 的, 事務回滾無效
 #當用戶正常斷開的時候,事務自動提交
 #斷電(非正常)
    
    

發佈了61 篇原創文章 · 獲贊 9 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章