#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 的, 事務回滾無效
#當用戶正常斷開的時候,事務自動提交
#斷電(非正常)
Oracle實戰練習(續二)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.