一、建立基本表 創建學生表(student)、學生選課表(SC)、課程表(course) 1)·學生表:Student_學號後四位 (Sno, Sname, Ssex, Sdept)其中學號Sno主碼,其中sno為number,sname為varchar2(10),ssex為char(2),sdept為varchar2(10) create table Student_3985( sno number(4) constraint p1 primary key, sname varchar2(10), ssex char(2), sdept varchar2(10)); 2)·課程表:Course_學號後四位(Cno, Cname, Cpno, Ccredit)其中課程號Cno主碼;先行課為外碼參照Course表中Cno字段。其中cno為number,cname為varchar2(10),cpno為number,ccredit為number(2)。 create table Course_3985( cno number(4) constraint p2 primary key, cname varchar2(10), cpno number(4), ccredit number(2), constraint q2 foreign key(cpno) references Course_3985(cno)); 3)·學生選課表:SC_學號後四位(Sno, Cno, Grade)其中(Sno、Cno)為主碼;Sno為外碼參照Student表中sno字段;Cno為外碼參照Course表中cno字段。 create table SC_3985( sno number(4), cno number(4), grade number(4), constraint p3 primary key(sno,cno), constraint q3 foreign key(sno) references Student_3985(sno), constraint q4 foreign key(cno) references Course_3985(cno)); 二.修改基本表 1)在Student表中加入屬性Sage(number型)。 SQL> alter table Student_3985 add sage number(4); 2)修改某個表的屬性的數據類型。 SQL> alter table Student_3985 modify sage varchar2(4); 3)給表student的sex列添加一個自定義約束sex只能取’男’,’女’兩個值。 SQL> alter table Student_3985 add constraint p4 check(ssex in('男','女')); 三、索引操作 1.建立索引 1)在Student表上建立關於Sname的唯一索引stusnam+學號後四位 SQL> create unique index stusnam_3985 on Student_3985(sname); 2)在SC表上建立關於Sno升序、Cno降序的唯一索引i_sc+學號後四位 SQL> create unique index i_sc_3985 on SC_3985(sno asc,cno desc); 2.刪除索引 1)刪除Student表上的索引stusnam+學號後四位 SQL> drop index stusnam_3985; 2)刪除Course表上的索引i_sc+學號後四位 SQL> drop index i_sc_3985; 四.刪除基本表 1) 刪除基本表Student 2)刪除基本表SC 結果如何,先執行2),在執行1)結果如何。 (1)先刪除Student再刪除SC SQL> drop table Student_3985; drop table Student_3985 ORA-02449: 表中的唯一/主鍵被外鍵引用 SQL> drop table SC_3985; Table dropped 結果如上,會提示唯一主鍵被外鍵引用,在重新建立相同的表時,會提示如下,必須先刪掉主鍵約束。 ORA-00955: 名稱已由現有對象使用 SQL> alter table Student_3985 drop constraint p1; (2)先刪除SC再刪除Student SQL> drop table SC_3985; Table dropped SQL> drop table Student_3985; Table dropped 結果如上,不會有提示產生。 五、單表查詢 運行如下sql代碼: Create table student as select * from scott.student; Create table course as select * from scott.course; Create table sc as select * from scott.sc; 再執行如下的查詢: 1. 求數學系學生的學號和姓名。 SQL> select sno,sname from student where sdept='MA'; 2. 求選修了課程的學生學號。 SQL> select distinct sno from sc where cno is not null; 3. 求選修課程號為‘2’的學生號和成績,並要求對查詢結果按成績的降序排列,如果成績相同按學號的升序排列。 SQL> select sno,grade from sc where cno=2 order by grade desc,sno asc; 4. 求選修課程號為’2’且成績在80~90之間的學生學號和成績,並將成績乘以0.8輸出。 SQL> select sno,grade,grade*0.8 avg_grade from sc where cno=2 and grade>=80 and grade<=90; 5. 求數學系或計算機系姓張的學生的信息。 SQL> select * from student where (sdept='MA' or sdept='CS')and sname like '張%'; 6. 求缺少了成績的學生的學號和課程號。 SQL> select sno,cno from sc where grade is null; 7. 查詢各個課程號與相應的選課人數。 SQL> select cno,count(*) choose_num from sc group by cno;
實驗分析與討論:
在本次實驗過程中,我完成了實驗要求。本次實驗是關於表的創建與修改及單表查詢,在課堂上老師講授了理論知識,有些地方不是太理解,在本次實驗課上動手實驗,讓我對學的知識更加理解,進一步掌握課上所學。在試驗中遇到了一些問題,如下:
1、在寫完整性約束時,我會寫主鍵的列級完整性約束,但是不明白多個屬性的完整性約束。我查閱書發現列級完整性約束只針對單個屬性,多個屬性完整性約束只能定義在表級如:constraint p3 primary key(sno,cno);
2、在添加完整性約束時,一般的都能操作,但是不知道如何添加check 約束,我覺得應該是用alter table 表名constraint 約束名 check(ssex in(‘男’,’女’))
運行果然是這樣。
3、在第四題刪除表時,會有紅色的字提示,然後再建表(和之前刪除同名的表)時,會提示名稱已由現有對象使用,然後我使用SQL> alter table Student_3985 drop constraint p1; 將p1約束刪掉後就可以建表了。