1. 程式人生 > >Oracle資料庫的常用語句

Oracle資料庫的常用語句

/*CREATE TABLE STUDENT (SNO VARCHAR(3) NOT NULL, SNAME VARCHAR(4) NOT NULL, SSEX VARCHAR(2) NOT NULL, SBIRTHDAY DATE, CLASS NUMBER NOT NULL);

CREATE TABLE COURSE (CNO VARCHAR(5) NOT NULL, CNAME VARCHAR(10) NOT NULL, TNO VARCHAR(10) NOT NULL);

CREATE TABLE SCORE (SNO VARCHAR(3) NOT NULL, CNO VARCHAR(5) NOT NULL, DEGREE NUMBER NOT NULL);

CREATE TABLE TEACHER (TNO VARCHAR(3) NOT NULL, TNAME VARCHAR(4) NOT NULL, TSEX VARCHAR(2) NOT NULL, TBIRTHDAY DATE NOT NULL, PROF VARCHAR(6), DEPART VARCHAR(10) NOT NULL);*/

/INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (108 ,‘曾華’ ,‘男’ ,to_date(‘1977-09-01’,‘yyyy-mm-dd’),95033); INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (105 ,‘匡明’ ,‘男’ ,to_date(‘1975-10-02’,‘yyyy-mm-dd’),95031); INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (107 ,‘王麗’ ,‘女’ ,to_date(‘1976-01-23’,‘yyyy-mm-dd’),95033); INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (101 ,‘李軍’ ,‘男’ ,to_date(‘1976-02-20’,‘yyyy-mm-dd’),95033); INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (109 ,‘王芳’ ,‘女’ ,to_date(‘1975-02-10’,‘yyyy-mm-dd’),95031); INSERT INTO STUDENT (SNO,SNAME,SSEX,SBIRTHDAY,CLASS) VALUES (103 ,‘陸君’ ,‘男’ ,to_date(‘1974-06-03’,‘yyyy-mm-dd’),95031); commit;

/

/INSERT INTO COURSE(CNO,CNAME,TNO)VALUES (‘3-105’ ,‘計算機導論’,825); INSERT INTO COURSE(CNO,CNAME,TNO)VALUES (‘3-245’ ,‘作業系統’ ,804); INSERT INTO COURSE(CNO,CNAME,TNO)VALUES (‘6-166’ ,‘資料電路’ ,856); INSERT INTO COURSE(CNO,CNAME,TNO)VALUES (‘9-888’ ,‘高等數學’ ,100); commit;/

/INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (103,‘3-245’,86); INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (105,‘3-245’,75); INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (109,‘3-245’,68); INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (103,‘3-105’,92); INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (105,‘3-105’,88); INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (109,‘3-105’,76); INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (101,‘3-105’,64); INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (107,‘3-105’,91); INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (108,‘3-105’,78); INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (101,‘6-166’,85); INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (107,‘6-106’,79); INSERT INTO SCORE(SNO,CNO,DEGREE)VALUES (108,‘6-166’,81); commit;

/

/INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) VALUES (804,‘李誠’,‘男’,to_date(‘1958-12-02’,‘yyyy-mm-dd’),‘副教授’,‘計算機系’); INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) VALUES (856,‘張旭’,‘男’,to_date(‘1969-03-12’,‘yyyy-mm-dd’),‘講師’,‘電子工程系’); INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) VALUES (825,‘王萍’,‘女’,to_date(‘1972-05-05’,‘yyyy-mm-dd’),‘助教’,‘計算機系’); INSERT INTO TEACHER(TNO,TNAME,TSEX,TBIRTHDAY,PROF,DEPART) VALUES (831,‘劉冰’,‘女’,to_date(‘1977-08-14’,‘yyyy-mm-dd’),‘助教’,‘電子工程系’); commit;/

–1、查詢Student表中的所有記錄的Sname、Ssex和Class列。 /select s.sname,s.ssex,s.class from student s;/ –2、查詢教師所有的單位即不重複的Depart列。 /select t.depart from teacher t group by t.depart;/ –3、查詢Student表的所有記錄。 /select * from student;/ –4、查詢Score表中成績在60到80之間的所有記錄。 /select * from score s where s.degree between 60 and 80; select * from score s where s.degree >=60 and s.degree <=80;/ –5、查詢Score表中成績為85,86或88的記錄。 /select * from score s where s.degree in (‘85’,‘86’,‘88’);/ –6、查詢Student表中“95031”班或性別為“女”的同學記錄。 /select * from student s where s.class=95031 or s.ssex=‘女’;/ –7、以Class降序查詢Student表的所有記錄。 /select * from student s order by s.class desc;/ –8、以Cno升序、Degree降序查詢Score表的所有記錄。 /select * from score s order by s.sno,s.cno,s.degree;/ /select from score s order by s.sno desc,s.cno desc,s.degree desc;/ –9、查詢“95031”班的學生人數。 /select count(s.sname) 學生總人數 from student s where s.class=‘95031’;/ –10、查詢Score表中的最高分的學生學號和課程號。 /select s.sno, s.cno from score s where s.degree = all(select max(degree) from score);/ –11、查詢‘3-105’號課程的平均分。 /select s.cno,avg(s.degree) from score s where s.cno=‘3-105’ group by s.cno;/ –12、查詢Score表中至少有5名學生選修的並以3開頭的課程的平均分數。 /select s.cno,avg(s.degree) from score s where s.cno like’3_%’ group by s.cno having count(s.cno)>=5;/ –13、查詢最低分大於70,最高分小於90的Sno列。 /select s.sno,s.degree from score s where s.degree between 70 and 90 ;/ –14、查詢所有學生的Sname、Cno和Degree列。 /select s.sname,e.cno,e.degree from student s,score e where s.sno=e.sno;/ –15、查詢所有學生的Sno、Cname和Degree列。 /select s.sno,c.cname,e.degree from student s,course c,score e where s.sno=e.sno and c.cno=e.cno;/ –16、查詢所有學生的Sname、Cname和Degree列。 /select s.sname,c.cname,e.degree from student s,course c,score e where s.sno=e.sno and c.cno=e.cno;/ –17、查詢“95033”班所選課程的平均分。 ----------/select round(avg(e.degree),2) from score e left join student s on e.sno=s.sno where s.class=‘95033’;/ –18、假設使用如下命令建立了一個grade表: /create table grade (low number,upp number,rank char(1)); insert into grade values(90,100,‘A’); insert into grade values(80,89,‘B’); insert into grade values(70,79,‘C’); insert into grade values(60,69,‘D’); insert into grade values(0,59,‘E’); commit;/ –現查詢所有同學的Sno、Cno和rank列。 /select e.sno,e.cno,g.rank from score e,grade g where e.degree between g.low and g.upp ;/ –19、查詢選修“3-105”課程的成績高於“109”號同學成績的所有同學的記錄。 --------/select e. from score e where e.cno=‘3-105’ and e.degree>= ------all(select e.degree from score e where e.cno=‘3-105’ and e.sno>109);/ –20、查詢score中選學一門以上課程的同學中分數為非最高分成績的記錄。 -------select score from score e where degree < (select max(e.degree) from score e) group by score having count(e.sno)>1 order by degree; –21、查詢成績高於學號為“109”、課程號為“3-105”的成績的所有記錄。 /select * from score e where e.cno=‘3-105’ and e.degree= all (select e.degree from score e where e.cno =‘3-105’ and e.sno=109);/ –22、查詢和學號為108的同學同年出生的所有學生的Sno、Sname和Sbirthday列。 /select s.,s.sno,s.sname,s.sbirthday from student s where s.sbirthday= (select s.sbirthday from student s where s.sno=108);/ –23、查詢“張旭“教師任課的學生成績。 /select t.,s.degree 學生成績 from teacher t,course e,score s where t.tno=e.tno and e.cno=s.cno and t.tname=‘張旭’;/ –24、查詢選修某課程的同學人數多於5人的教師姓名 ---------select t.*,t.tname 老師名字 from teacher t,course c where t.tno=c.tno having (select ) –25、查詢95033班和95031班全體學生的記錄。 /select * from student s where s.class in (95033,95031) order by s.class/ –26、查詢存在有85分以上成績的課程Cno. /select s.cno,s.degree from score s where s.degree>85/ –27、查詢出“計算機系“教師所教課程的成績表。 /select t.tname,c.cname,s.degree from teacher t left join course c on c.tno=t.tno left join score s on c.cno=s.cno where t.depart=‘計算機系’;/ –28、查詢“計算機系”與“電子工程系“不同職稱的教師的Tname和Prof。 /select t.depart,t.tname,t.prof from teacher t group by t.depart,t.tname,t.prof order by t.depart;/ –29、查詢選修編號為“3-105“且成績至少高於選修編號為“3-245”的同學的Cno、Sno和Degree,並按Degree從高到低次序排序。 /select * from score s where s.cno=‘3-105’ and s.degree> all(select s.degree from score s where s.cno=‘3-245’) order by s.degree desc;/ –30、查詢選修編號為“3-105”且成績高於選修編號為“3-245”的同學的Cno、Sno和Degree. /select * from score s where s.cno=‘3-105’ and s.degree> all(select s.degree from score s where s.cno=‘3-245’);/ –31、查詢所有教師和同學的name、sex和birthday.

–32、查詢所有“女”教師和“女”同學的name、sex和birthday. –33、查詢成績比該課程平均成績低的同學的成績表。 –34、查詢所有任課教師的Tname和Depart. –35、查詢所有未講課的教師的Tname和Depart. –36、查詢至少有2名男生的班號。 –37、查詢Student表中不姓“王”的同學記錄。 –38、查詢Student表中每個學生的姓名和年齡。 –39、查詢Student表中最大和最小的Sbirthday日期值。 –40、以班號和年齡從大到小的順序查詢Student表中的全部記錄。 –41、查詢“男”教師及其所上的課程。 –42、查詢最高分同學的Sno、Cno和Degree列。 –43、查詢和“李軍”同性別的所有同學的Sname. –44、查詢和“李軍”同性別並同班的同學Sname. –45、查詢所有選修“計算機導論”課程的“男”同學的成績表

答案: –1、查詢Student表中的所有記錄的Sname、Ssex和Class列。 SELECT s.sname, s.ssex, s.class FROM student s –2、查詢教師所有的單位即不重複的Depart列。 SELECT DISTINCT depart FROM teacher –3、查詢Student表的所有記錄。 SELECT * FROM student –4、查詢Score表中成績在60到80之間的所有記錄。 SELECT * FROM score sc WHERE sc.degree BETWEEN 60 AND 80 –5、查詢Score表中成績為85,86或88的記錄。 SELECT * FROM score sc WHERE sc.degree IN (85, 86, 88) –6、查詢Student表中“95031”班或性別為“女”的同學記錄。 SELECT * FROM student s WHERE s.ssex=‘女’ OR s.class=‘95031’ –7、以Class降序查詢Student表的所有記錄。 SELECT * FROM student s ORDER BY s.class DESC –8、以Cno升序、Degree降序查詢Score表的所有記錄。 SELECT * FROM score sc ORDER BY sc.cno, DEGREE DESC –9、查詢“95031”班的學生人數。 SELECT COUNT(*) FROM student s WHERE s.class=‘95031’ –10、查詢Score表中的最高分的學生學號和課程號。 SELECT * FROM score sc WHERE sc.degree=(SELECT MAX(DEGREE) FROM score) –ALL –11、查詢‘3-105’號課程的平均分。 SELECT sc.cno, AVG(sc.degree) FROM score sc WHERE sc.cno=‘3-105’ GROUP BY sc.cno –12、查詢Score表中至少有5名學生選修的並以3開頭的課程的平均分數。 SELECT sc.cno, AVG(sc.degree) FROM score sc WHERE sc.cno LIKE ‘3%’ GROUP BY sc.cno HAVING COUNT(sc.cno) >= 5 –13、查詢最低分大於70,最高分小於90的Sno列。 SELECT * FROM score sc WHERE sc.degree BETWEEN 70 AND 90 –14、查詢所有學生的Sname、Cno和Degree列。 SELECT s.sname, sc.cno, sc.degree FROM student s LEFT JOIN score sc ON s.sno=sc.sno

SELECT s.sname, sc.cno, sc.degree FROM student s, score sc WHERE s.sno=sc.sno –15、查詢所有學生的Sno、Cname和Degree列。 SELECT s.sno, (SELECT c.cname FROM course c WHERE c.cno=sc.cno) cname, sc.degree FROM student s LEFT JOIN score sc ON s.sno=sc.sno –16、查詢所有學生的Sname、Cname和Degree列。 SELECT s.sname, (SELECT c.cname FROM course c WHERE c.cno=sc.cno) cname, sc.degree FROM student s LEFT JOIN score sc ON s.sno=sc.sno –17、查詢“95033”班所選課程的平均分。 SELECT SC.CNO, AVG(SC.DEGREE) FROM SCORE SC WHERE SC.SNO IN (SELECT SNO FROM STUDENT S WHERE S.CLASS = ‘95033’) GROUP BY SC.CNO –18、現查詢所有同學的Sno、Cno和rank列。 SELECT SC.SNO, SC.CNO, G.RANK FROM SCORE SC LEFT JOIN GRADE G ON SC.DEGREE BETWEEN G.LOW AND G.UPP –19、查詢選修“3-105”課程的成績高於“109”號同學成績的所有同學的記錄。 SELECT * FROM STUDENT S WHERE S.SNO IN (SELECT SC.SNO FROM SCORE SC WHERE SC.CNO = ‘3-105’ AND SC.DEGREE > ALL (SELECT DEGREE FROM SCORE SC1 WHERE SC1.SNO = 109)) –20、查詢score中選學一門以上課程的同學中分數為非最高分成績的記錄。 –第一種寫法 SELECT * FROM (SELECT SC1., ROW_NUMBER() OVER(PARTITION BY SC1.CNO ORDER BY SC1.DEGREE DESC) ORD FROM SCORE SC1 WHERE SC1.CNO IN (SELECT SC.CNO FROM SCORE SC GROUP BY SC.CNO HAVING COUNT() > 1)) R WHERE R.ORD != 1 –第二種寫法 WITH RE1 AS (SELECT SC1.* FROM SCORE SC1 WHERE SC1.CNO IN (SELECT SC.CNO FROM SCORE SC GROUP BY SC.CNO HAVING COUNT() > 1)) SELECT * FROM RE1 WHERE RE1.DEGREE NOT IN (SELECT MAX(DEGREE) FROM RE1 GROUP BY RE1.CNO) –21、查詢成績高於學號為“109”、課程號為“3-105”的成績的所有記錄。 SELECT * FROM SCORE SC1 WHERE SC1.DEGREE > ANY (SELECT SC.DEGREE FROM SCORE SC WHERE SC.SNO = 109 AND SC.CNO = ‘3-105’) ORDER BY sc1.sno / any,all,some的區別 / –22、查詢和學號為108的同學同年出生的所有學生的Sno、Sname和Sbirthday列。 SELECT * FROM STUDENT S WHERE TO_CHAR(S.SBIRTHDAY, ‘yyyy’) = (SELECT TO_CHAR(S1.SBIRTHDAY, ‘yyyy’) FROM STUDENT S1 WHERE S1.SNO = ‘108’) AND S.SNO != ‘108’ –23、查詢“張旭“教師任課的學生成績。 SELECT SC. FROM COURSE C LEFT JOIN TEACHER T ON C.TNO = T.TNO LEFT JOIN SCORE SC ON SC.CNO = C.CNO AND T.TNAME = ‘張旭’ –24、查詢選修某課程的同學人數多於5人的教師姓名。 SELECT T.TNAME FROM COURSE C LEFT JOIN TEACHER T ON C.TNO = T.TNO LEFT JOIN SCORE SC ON SC.CNO = C.CNO GROUP BY T.TNAME HAVING COUNT() > 5 –25、查詢95033班和95031班全體學生的記錄。 SELECT * FROM student s WHERE s.class IN (95033, 95031) –26、查詢存在有85分以上成績的課程Cno. SELECT * FROM score sc WHERE sc.degree > 85 –27、查詢出“計算機系“教師所教課程的成績表。 SELECT * FROM SCORE SC WHERE SC.CNO IN (SELECT C.CNO FROM COURSE C, TEACHER T WHERE C.TNO = T.TNO AND T.DEPART = ‘計算機系’) –28、查詢“計算機系”與“電子工程系“不同職稱的教師的Tname和Prof。 SELECT T.TNAME, T.PROF FROM TEACHER T WHERE DEPART = ‘計算機系’ AND PROF NOT IN (SELECT PROF FROM TEACHER WHERE DEPART = ‘電子工程系’); –29、查詢選修編號為“3-105“且成績至少高於選修編號為“3-245”的同學的Cno,Sno和Degree並按Degree從高到低次序排序。 SELECT * FROM SCORE WHERE DEGREE > ANY (SELECT DEGREE FROM SCORE WHERE CNO = ‘3-245’) ORDER BY DEGREE DESC; –30、查詢選修編號為“3-105”且成績高於選修編號為“3-245”的同學的Cno、Sno和Degree. SELECT * FROM SCORE WHERE DEGREE > ALL(SELECT DEGREE FROM SCORE WHERE CNO=‘3-245’) ORDER BY DEGREE DESC; –31、查詢所有教師和同學的name、sex和birthday. SELECT T.TNAME, T.TSEX, T.TBIRTHDAY FROM TEACHER T UNION ALL SELECT S.SNAME, S.SSEX, S.SBIRTHDAY FROM STUDENT S –32、查詢所有“女”教師和“女”同學的name、sex和birthday. SELECT * FROM (SELECT T.TNAME, T.TSEX, T.TBIRTHDAY FROM TEACHER T UNION ALL SELECT S.SNAME, S.SSEX, S.SBIRTHDAY FROM STUDENT S) R WHERE R.TSEX = ‘女’ –33、查詢成績比該課程平均成績低的同學的成績表。 SELECT * FROM SCORE SC1, (SELECT SC.CNO, AVG(SC.DEGREE) AVD FROM SCORE SC GROUP BY SC.CNO) R WHERE SC1.CNO = R.CNO AND SC1.DEGREE < R.AVD –34、查詢所有任課教師的Tname和Depart. SELECT t.tname, t.depart FROM teacher t –35、查詢所有未講課的教師的Tname和Depart. SELECT * FROM TEACHER T WHERE T.TNO NOT IN (SELECT C.TNO FROM COURSE C WHERE C.CNO IN (SELECT SC.CNO FROM SCORE SC)) –36、查詢至少有2名男生的班號。 SELECT s.class FROM student s GROUP BY s.class HAVING COUNT() >= 2 –37、查詢Student表中不姓“王”的同學記錄。 SELECT * FROM student s WHERE s.sname NOT LIKE ‘王%’ –38、查詢Student表中每個學生的姓名和年齡。 SELECT s.sname, ROUND((SYSDATE-s.sbirthday)/365) 年齡 FROM student s SELECT s.sname, to_char(SYSDATE, ‘yyyy’) - to_char(s.sbirthday,‘yyyy’) FROM student s –39、查詢Student表中最大和最小的Sbirthday日期值。 SELECT MAX(s.sbirthday), MIN(s.sbirthday) FROM student s –40、以班號和年齡從大到小的順序查詢Student表中的全部記錄。 SELECT * FROM student s ORDER BY s.class DESC, s.sbirthday –41、查詢“男”教師及其所上的課程。 SELECT * FROM course c, teacher t WHERE c.tno=t.tno AND t.tsex=‘男’ –42、查詢最高分同學的Sno、Cno和Degree列。 SELECT S.SNO, SC.CNO, SC.DEGREE FROM STUDENT S, SCORE SC WHERE S.SNO = SC.SNO AND SC.DEGREE = (SELECT MAX(DEGREE) FROM SCORE) –43、查詢和“李軍”同性別的所有同學的Sname. SELECT * FROM STUDENT S WHERE S.SNAME != ‘李軍’ AND S.SSEX = (SELECT DISTINCT SSEX FROM STUDENT WHERE SNAME = ‘李軍’) –44、查詢和“李軍”同性別並同班的同學Sname. SELECT * FROM STUDENT S WHERE S.SNAME != ‘李軍’ AND S.SSEX = (SELECT DISTINCT SSEX FROM STUDENT WHERE SNAME = ‘李軍’) AND S.CLASS = (SELECT DISTINCT CLASS FROM STUDENT WHERE SNAME = ‘李軍’) –45、查詢所有選修“計算機導論”課程的“男”同學的成績表 SELECT S.SNAME, S.SSEX, SC.* FROM SCORE SC, COURSE C, STUDENT S WHERE SC.CNO = C.CNO AND S.SNO = SC.SNO AND C.CNAME = ‘計算機導論’ AND S.SSEX = ‘男’