第一篇:數(shù)據(jù)庫(kù)上機(jī)實(shí)驗(yàn)一思考
思考四個(gè)問(wèn)題:你創(chuàng)建的數(shù)據(jù)庫(kù)文件在哪里,找到它,copy到自己U盤(pán)上關(guān)于主碼,你可以在實(shí)驗(yàn)中輸入兩個(gè)相同的學(xué)號(hào),看可不可以,為什么 3 打開(kāi)某張表,看看屬性和元組的區(qū)別創(chuàng)建的這些表是邏輯模型的表現(xiàn)還是概念模型的表現(xiàn)
第二篇:數(shù)據(jù)庫(kù)上機(jī)實(shí)驗(yàn)
創(chuàng)建數(shù)據(jù)表與數(shù)據(jù)輸入
Part I.使用SQL Server Management Studio創(chuàng)建數(shù)據(jù)表和輸入數(shù)據(jù) 1.在SQL Server Management Studio中創(chuàng)建數(shù)據(jù)表 P69 1.(1)-(6)
2.為數(shù)據(jù)表輸入數(shù)據(jù) P76 4.(1)-(4)
3.數(shù)據(jù)瀏覽
P77
1.(1)-(2)
2.(1)-(3)
Part II.使用SQL語(yǔ)句創(chuàng)建數(shù)據(jù)表和輸入數(shù)據(jù) 1.使用SQL語(yǔ)句創(chuàng)建數(shù)據(jù)表 P72.例3-2
2.使用SQL語(yǔ)句輸入數(shù)據(jù) P82.例3.8
習(xí)題:P.105(1)(2)insert 數(shù)據(jù)操作Insert、Update、Delete
P105 3.上機(jī)練習(xí)題(2)(4)
Insert(100001, 1000, 2002-12-18 0:00:00)(100002, 2000, 2010-3-20 0:00:00)
Update(100001, 1500, 2002-12-18 0:00:00)(100002, 2000, 2012-9-25 0:00:00)
Delete Transact-SQL語(yǔ)句基礎(chǔ)1 1.將teaching數(shù)據(jù)庫(kù)中score表的studentno列設(shè)置為引用表student的外鍵。ALTER TABLE Score ADD CONSTRAINT FK_score_student FOREIGN KEY(studentno)REFERENCES student(studentno)2.將teaching數(shù)據(jù)庫(kù)中class表的classname創(chuàng)建UNIQUE約束。ALTER TABLE class ADD CONSTRAINT UQ_class UNIQUE(classname)執(zhí)行如下插入語(yǔ)句,查看提示信息
INSERT INTO class VALUES(‘090602’, ’計(jì)算機(jī)0902’, ’計(jì)算機(jī)學(xué)院’, ’馬文斐’)3.為teaching數(shù)據(jù)庫(kù)中student表的birthday列創(chuàng)建CHECK約束,規(guī)定學(xué)生的年齡在17-25歲之間。
ALTER TABLE student ADD CONSTRAINT CK_birthday CHECK(YEAR(GETDATE())-YEAR(birthday))BETWEEN 17 AND 25 執(zhí)行如下插入語(yǔ)句,查看提示信息
INSERT INTO student(studentno, sname, sex, birthday, classno)VALUES(‘0922221328’, ’張?jiān)础? ’男’, ’1983-04-05’, ’090501’)提示:表達(dá)式Y(jié)EAR(GETDATE())-YEAR(birthday)4.為teaching數(shù)據(jù)庫(kù)創(chuàng)建規(guī)則prof_rule,規(guī)定教師職稱取值只能為’助教’,’講師’,’副教授’,’教授’,并將其綁定到teacher表的prof列上。
CREATE RULE prof_rule AS @prof IN(’助教’,’講師’,’副教授’,’教授’)EXEC sp_bindrule ‘prof_rule’, ‘teacher.prof’
執(zhí)行如下插入語(yǔ)句,查看提示信息
INSERT INTO teacher VALUES(‘t05002’, ’張?jiān)础? ’軟件工程’, ’工程師’, ’計(jì)算機(jī)學(xué)院’)提示:表達(dá)式IN(職稱列表)5.編寫(xiě)程序,輸出在1-3000之間能被17整除的最大數(shù)值
提示:可使循環(huán)控制變量從最大值開(kāi)始,逐步減少,第一個(gè)滿足被17整除的數(shù)值即為所求解的結(jié)果,可通過(guò)BREAK語(yǔ)句跳出循環(huán)。(如果使循環(huán)控制變量從小到大逐步增加,則循環(huán)次數(shù)將大大增加,程序執(zhí)行效率將下降。)
PRINT ‘1-3000之間能被17整除的最大數(shù)值為:’ +CAST(@i AS CHAR(4))DECLARE @s INT, @i INT SELECT @s=0, @i=3000 WHILE @i>=1 BEGIN
IF @i%17=0
BEGIN
PRINT ‘1-3000之間能被17整除的最大數(shù)值為:’ + CAST(@i AS CHAR(4))
BREAK
END @i = @i-1 END Transact-SQL語(yǔ)句基礎(chǔ)2 1.利用Transact-SQL語(yǔ)句聲明一個(gè)長(zhǎng)度為16的nchar型變量bookname,并賦初值為“SQL Server數(shù)據(jù)庫(kù)編程”,打印該變量。
2.編程求50-100之間的所有能被3整除的奇數(shù)之和。
3.編寫(xiě)程序,聲明CHAR型變量@ch,并賦初值。判斷字符變量@ch中存放的是字母、數(shù)字字符還是其他字符,并輸出相關(guān)信息。(提示:UPPER函數(shù)可以將小寫(xiě)字母轉(zhuǎn)換為大寫(xiě)字母)
4.編寫(xiě)程序,求解如下分?jǐn)?shù)序列的前20項(xiàng)之和并打印輸出結(jié)果。
S=2/1+3/2+5/3+8/5+13/8+21/13+…
分析數(shù)列的規(guī)律:后一項(xiàng)的分子為前一項(xiàng)的分子和分母之和,后一項(xiàng)的分母則為前一項(xiàng)的分子,通過(guò)循環(huán)即可實(shí)現(xiàn)累加。注意:聲明分子和分母為浮點(diǎn)型數(shù)據(jù)NUMERIC(20,7).5.查詢編號(hào)為c06108, c08106, c05109課程的學(xué)生總評(píng)成績(jī)等級(jí),平時(shí)成績(jī)usually*0.2+期末成績(jī)final*0.8>=90的為優(yōu)秀,80-90為良好,70-80為中等,60-70為及格,<60為不及格。(提示:使用CASE …END語(yǔ)句)數(shù)據(jù)檢索1 1.查詢course表中所有的記錄。2.查詢student表中女生的人數(shù)。
3.查詢teacher表中每一位教授的教師號(hào)、姓名和專業(yè)名稱。
4.利用現(xiàn)有的表生成新表,新表中包括學(xué)號(hào)、學(xué)生姓名、課程號(hào)和總評(píng)成績(jī)。其中:總評(píng)成績(jī)=final*0.8+usually*0.2 5.查詢student表中所有年齡大于20歲的男生的姓名和年齡。6.查詢計(jì)算機(jī)學(xué)院教師的專業(yè)名稱。
7.查詢Email使用126郵箱的所有學(xué)生的學(xué)號(hào)、姓名和電子郵箱地址。8.查詢score表中選修’c05109’或’c05103’課程,并且課程期末成績(jī)?cè)?0~100分之間的學(xué)生姓名和期末成績(jī)。
9.查詢student表中所有學(xué)生的基本信息,查詢結(jié)果按班級(jí)號(hào)classno升序排列,同一班級(jí)中的學(xué)生按入學(xué)成績(jī)point降序排列。10.查詢選修’c05109’課程,并且期末成績(jī)?cè)谇?名的學(xué)生學(xué)號(hào)、課程號(hào)和期末成績(jī)。(提示:TOP 5)數(shù)據(jù)檢索2
1.按性別分組,求出student表中每組學(xué)生的平均年齡。2.統(tǒng)計(jì)每個(gè)學(xué)生期末成績(jī)的平均分。
3.輸出student表中沒(méi)有職稱的職工的教師號(hào)、姓名、專業(yè)和部門。4.查詢選修課程且期末成績(jī)不為空的學(xué)生人數(shù)。
5.查詢每名學(xué)生的學(xué)號(hào)、選修課程數(shù)目、總成績(jī),并將查詢結(jié)果存放到生成的“學(xué)生選課統(tǒng)計(jì)表”中。6.查詢各班學(xué)生的人數(shù)。
7.查詢各課程期末成績(jī)的最高分和最低分。
8.查詢教兩門及以上課程的教師編號(hào)、任課班級(jí)數(shù)。
9.查詢課程編號(hào)以’c05’開(kāi)頭、被3名及以上學(xué)生選修且期末成績(jī)的平均分高于75分的課程號(hào)、選修人數(shù)和期末成績(jī)平均分,并按平均分降序排序。10.查詢所有08級(jí)學(xué)生的期末成績(jī)平均分,要求利用COMPUTE BY方法顯示每一名學(xué)生的學(xué)生編號(hào)、課程號(hào)、期末成績(jī)的明細(xì)表,以及期末成績(jī)平均分的匯總表。
11.查詢所有女生入學(xué)成績(jī)的最高分,要求利用COMPUTE BY方法既顯示明細(xì)又顯示匯總結(jié)果。SQL語(yǔ)句的高級(jí)應(yīng)用1
1.查詢每一位教授的教師號(hào)、姓名和講授的課程名稱。表:teacher,course,teach_class 2.分別統(tǒng)計(jì)每個(gè)學(xué)生期末成績(jī)高于75分的課程門數(shù)。表:student,score 3.計(jì)算每個(gè)學(xué)生獲得的學(xué)分。表:student,score,course 4.獲取入學(xué)時(shí)間在2008年到2009年之間的所有學(xué)生中入學(xué)年齡小于19歲的學(xué)生的學(xué)號(hào)、姓名及所修課程的課程名稱。表:student, stu_course 5.查詢09級(jí)學(xué)生的學(xué)號(hào)、姓名、課程及學(xué)分。表:student,stu_course 6.查詢所有班級(jí)的期末成績(jī)平均分,并按照平均分降序排列。表:score,student 7.查詢教師基本信息和教授課程信息,其中包括未分配課程的教師信息。表:teacher,teach_class 8.查詢’090501’班級(jí)中選修了’韓晉升’老師講授的課程的學(xué)生的學(xué)號(hào)、姓名、課程名和期末成績(jī)。表:score,student,course,teach_class,teacher 9.查詢每門課程的課程號(hào)、課程名和選修該課程的學(xué)生人數(shù),并按所選人數(shù)升序排序。表:score,course 10.查詢兩門及以上課程的期末成績(jī)超過(guò)80分的學(xué)生的姓名及其平均成績(jī)。表:student,score SQL語(yǔ)句的高級(jí)應(yīng)用2 – 使用子查詢
1.輸出student表中年齡大于女生平均年齡的男生的所有信息。2.查詢?nèi)雽W(xué)考試成績(jī)最高的學(xué)生的學(xué)號(hào)、姓名和入學(xué)成績(jī)。3.查詢所有教授’c05127’號(hào)課程的教師信息。
4.查詢同時(shí)教授’c05127’和’c05109’號(hào)課程的教師信息。
5.查詢至少選修了姓名為’韓吟秋’的學(xué)生所選修課程中的一門課的學(xué)生的學(xué)號(hào)和姓名。
6.查詢沒(méi)有被任何學(xué)生選修的課程編號(hào)、課程名稱和學(xué)分。
7.查詢’C語(yǔ)言’課程期末成績(jī)比’電子技術(shù)’課程期末成績(jī)高的所有學(xué)生的學(xué)號(hào)和姓名。
8.查詢所有班級(jí)期末平均成績(jī)的最高分,并將其賦值給變量,通過(guò)PRINT語(yǔ)句輸出。視圖與索引
使用SQL語(yǔ)言
1.創(chuàng)建一個(gè)視圖v_teacher,查詢所有“計(jì)算機(jī)學(xué)院”的教師信息。
CREATE VIEW v_teacher AS SELECT * FROM teacher WHERE department='計(jì)算機(jī)學(xué)院' GO SELECT * FROM v_teacher
2.創(chuàng)建一個(gè)視圖v_avgstu,查詢每個(gè)學(xué)生的學(xué)號(hào)、姓名及平均分,并且按照平均分降序排列。
CREATE VIEW v_avgstu AS SELECT TOP 100 student.studentno,sname,avg(final)AS '平均分' FROM student JOIN score ON student.studentno=score.studentno GROUP BY student.studentno,sname ORDER BY avg(final)GO SELECT * FROM v_avgstu
3.修改v_teacher的視圖定義,添加WITH CHECK OPTION選項(xiàng)。
ALTER VIEW v_teacher AS SELECT * FROM teacher WHERE department='計(jì)算機(jī)學(xué)院' WITH CHECK OPTION
4.通過(guò)視圖v_teacher向基表teacher中分別插入數(shù)據(jù)(‘05039’, ‘張馨月’,’計(jì)算機(jī)應(yīng)用’,’講師’,’計(jì)算機(jī)學(xué)院’)和(‘06018’, ‘李誠(chéng)’,’機(jī)械制造’,’副教授’,’機(jī)械學(xué)院’),并查看插入數(shù)據(jù)情況。
INSERT INTO v_teacher VALUES('05039', '張馨月','計(jì)算機(jī)應(yīng)用','講師','計(jì)算機(jī)學(xué)院')GO SELECT * FROM teacher
消息550,級(jí)別16,狀態(tài)1,第1 行
試圖進(jìn)行的插入或更新已失敗,原因是目標(biāo)視圖或者目標(biāo)視圖所跨越的某一視圖指定了WITH CHECK OPTION,而該操作的一個(gè)或多個(gè)結(jié)果行又不符合CHECK OPTION 約束。語(yǔ)句已終止。
5.通過(guò)視圖v_teacher將基表teacher中教師編號(hào)為05039的教師職稱修改為”副教授”。
UPDATE v_teacher SET prof='副教授' WHERE teacherno='05039' GO SELECT * FROM teacher
6.在course表的cname列上創(chuàng)建非聚集索引IDX_name。
CREATE NONCLUSTERED INDEX IDX_name ON course(cname)
7.在student表的studentno和classno列上創(chuàng)建唯一索引UQ_stu,若該索引已經(jīng)存在,則刪除后重建,并輸出student表中的記錄,查看輸出結(jié)果的順序。CREATE UNIQUE INDEX UQ_stu ON student(studentno,classno)
8.教材P.200-204(節(jié)7.5.2)使用SQL Server Management Studio創(chuàng)建視圖,按照樣圖進(jìn)行操作。
第三篇:數(shù)據(jù)庫(kù)上機(jī)實(shí)驗(yàn)(二)
數(shù)據(jù)庫(kù)上機(jī)實(shí)驗(yàn)內(nèi)容及要求(第二部分)
1. 建立工廠管理數(shù)據(jù)庫(kù)
工廠(包括廠名和廠長(zhǎng)名)需要建立一個(gè)管理數(shù)據(jù)庫(kù)存儲(chǔ)以下信息:
(1)一個(gè)廠內(nèi)有多個(gè)車間,每個(gè)車間有車間號(hào)、車間主任姓名、地址和聯(lián)系電話;
(2)一個(gè)車間有多個(gè)工人,每個(gè)工人有職工號(hào)、姓名、年齡、性別和工種;
(3)一個(gè)車間生產(chǎn)多種產(chǎn)品,產(chǎn)品有產(chǎn)品號(hào)和價(jià)格;每種產(chǎn)品只能由一個(gè)車間生產(chǎn);
(4)一個(gè)車間制造多種零件,一種零件也可能為多個(gè)車間制造。零件有零件號(hào)、重
量和價(jià)格;
(5)一種產(chǎn)品可由多種零件組成,一種零件也可以裝配出多種產(chǎn)品;
(6)產(chǎn)品和零件均存入倉(cāng)庫(kù);
(7)廠內(nèi)有多個(gè)倉(cāng)庫(kù),倉(cāng)庫(kù)有倉(cāng)庫(kù)號(hào)、倉(cāng)庫(kù)主任姓名和電話。
根據(jù)以上需求分析結(jié)果,按照下述要求,設(shè)計(jì)并建立工廠管理數(shù)據(jù)庫(kù)。? 分析實(shí)體及聯(lián)系,設(shè)計(jì)E-R圖。
? 將E-R圖轉(zhuǎn)換成關(guān)系模式,并規(guī)范化到3NF。
? 在Microsoft SQL Server2000中基于“企業(yè)管理器”建立數(shù)據(jù)庫(kù)及相關(guān)對(duì)象(主
碼,外碼,索引,約束等)。
? 測(cè)試數(shù)據(jù)入庫(kù)
2. 基于“查詢分析器”,完成并保存下述題目的SQL腳本
(1)建立“工種”是“鉗工”的所有職工詳細(xì)信息的視圖;
(2)建立“車間號(hào)”是“CJ01”的鉗工詳細(xì)信息的視圖;
(3)建立使用了“零件號(hào)”是“LJ0002”的所有產(chǎn)品詳細(xì)信息的視圖;
(4)查詢使用了“零件號(hào)”是“LJ0002”的產(chǎn)品的生產(chǎn)車間號(hào);
(5)對(duì)零件表按照“零件號(hào)”建立唯一索引;
(6)對(duì)職工表按照“性別”建立聚簇索引;
(7)查詢“車間主任姓名”是“趙平”的“車間地址”和“聯(lián)系電話”;
(8)查詢“職工號(hào)”是“ZG0001”的職工所在車間的“車間主任姓名”和“聯(lián)系電
話”;(連接查詢實(shí)現(xiàn))
(9)查詢“產(chǎn)品號(hào)”是“CP0001”的產(chǎn)品的生產(chǎn)車間的“車間主任姓名”和“聯(lián)系
電話”;(嵌套查詢實(shí)現(xiàn))
(10)查詢使用了“零件號(hào)”是“LJ0002”的所有產(chǎn)品的“產(chǎn)品號(hào)”,且查詢結(jié)果按照
“零件數(shù)量”降序排列;
(11)查詢使用了“零件號(hào)”是“LJ0002”的所有產(chǎn)品的“產(chǎn)品號(hào)”和“產(chǎn)品價(jià)格”;
(12)查詢使用了“零件號(hào)”是“LJ0002”的所有產(chǎn)品的生產(chǎn)車間的“車間主任姓名”
和“聯(lián)系電話”;
(13)查詢使用了“零件號(hào)”是“LJ0002”的產(chǎn)品數(shù);
(14)查詢“LJ0002”號(hào)零件裝配產(chǎn)品的使用總量;
(15)查詢使用了3種以上零件的產(chǎn)品號(hào);
【注意】:下機(jī)時(shí)保存數(shù)據(jù)庫(kù)文件(.mdf和.ldf)及SQL腳本文件到U盤(pán)。
第四篇:數(shù)據(jù)庫(kù)上機(jī)實(shí)驗(yàn)總結(jié)(含代碼)
實(shí)驗(yàn)一
(1)無(wú)條件單表查詢
select sname NAME,'year of birth:' BIRTH,2004-sage BIRTHDAY,LOWER(sdept)DEPARTMENT FROM student;(2)有條件單表查詢
SELECT sname,sdept,sage FROM student WHERE sage NOT BETWEEN 20 AND 23;(3)單表嵌套(一層)查詢
SELECT sno,sname,sdept FROM student WHERE sdept IN(SELECT sdept FROM student WHERE sname='劉晨');(4)復(fù)合條件多表查詢
SELECT student.sno,sname,cname,grade FROM student ,sc,course WHERE student.sno=sc.sno AND sc.cno=course.cno;(5)使用COUNT()的單表查詢 SELECT COUNT(*)FROM student;(6)使用AVG()的單表查詢
SELECT AVG(grade)'平均成績(jī)' from SC where CNO='1';(7)查詢結(jié)果分組
SELECT cno,COUNT(sno)'人數(shù)' FROM sc GROUP BY cno;(8)查詢結(jié)果排序
SELECT * FROM student ORDER BY sdept,sage DESC;(9)使用通配符的查詢
SELECT sname,sno,ssex FROM student WHERE sname NOT LIKE'劉%';(10)使用換碼字符的單表查詢
SELECT cno,ccredit FROM course WHERE cname LIKE 'DB_Design'ESCAPE'';(11)插入單個(gè)元組 插入一個(gè)新學(xué)生元組
Insert into student(sno,sname,ssex,sdept,sage)values('200215128','陳冬','男','IS',18)(12)插入子查詢結(jié)果
對(duì)每一個(gè)系,求學(xué)生平均年齡,并把結(jié)果存入數(shù)據(jù)庫(kù) Create table dept_age(sdept char(15),avg_age int)Insert into dept_age(sdept,avg_age)select sdept,avg(sage)from student group by sdept(13)修改某個(gè)元組的值
將學(xué)生200215121的年齡改為22歲
Update student set sage=’22’ where sno=’200215121’(14)修改多個(gè)元組的值 將所有學(xué)生的年齡增加一歲 Update student set sage=sage+1(15)刪除一個(gè)元組的值 刪除學(xué)號(hào)為200215128的學(xué)生記錄
delete from student where sno='200215128'(16)建立視圖 建立信息系學(xué)生的視圖
create view is_student as select sno,sname,sage from student where sdept='IS' ×(17)查詢視圖
查詢選修了1號(hào)課程的信息系學(xué)生信息
Select is_student.sno,sname from is_student,sc where is_student.sno=sc.sno and sc.cno=’1’ ×(18)更新視圖
將信息系學(xué)生視圖is_student中學(xué)號(hào)為95001的學(xué)生姓名改為李楠 update is_student set sname='李楠' where sno='95002' 將下列問(wèn)題用SQL命令表示:
1.查詢‘IS’系學(xué)生的學(xué)號(hào)、姓名、性別。
SELECT sno,sname,ssex FROM student WHERE sdept='IS';2.查詢‘IS’系年齡在20歲以下的學(xué)生。
SELECT * FROM student WHERE sdept='IS'AND sage<20;3.查詢所有不姓‘劉’的學(xué)生的學(xué)號(hào)、姓名、性別。
SELECT sname,sno,ssex FROM student WHERE sname NOT LIKE'劉%';4.查詢student表中學(xué)生的總?cè)藬?shù)。
SELECT COUNT(*)'總?cè)藬?shù)' FROM student;5.查詢和‘李勇’同性別的所有同學(xué)的姓名。
SELECT sname from student where ssex in(select ssex from student where sname='李勇');6.查詢和‘李勇’同性別并同系的所有同學(xué)的姓名。
Select sname from student where ssex in(select ssex from student where sname='李勇')and sdept in(select sdept from student where sname='李勇')7.查詢選修2號(hào)課程的學(xué)生的學(xué)號(hào)。Select sno from sc where cno='2' 8.求3號(hào)課程的平均成績(jī)。
Select avg(grade)from sc where cno=’3’ 9.查詢選修2號(hào)課程的學(xué)生的最高分。Select max(grade)from sc where cno=’2’
10.按成績(jī)降序排列,輸出‘IS’系學(xué)生選修了2號(hào)課程的學(xué)生的姓名和成績(jī)。
Select sname,grade from student,sc where sdept='IS' and cno='2' and student.sno=sc.sno order by grade desc SQL查詢分析器下建數(shù)據(jù)庫(kù)的命令代碼: create database 霍雙雙200826352 on(name='霍雙雙200826352_data',filename='E:
霍霍
雙雙
雙雙
***5
霍霍
雙雙
雙雙200826352_data.mdf',size=10mb,maxsize=50mb,filegrowth=10%)log on(name='霍雙雙200826352_log',filename='E:200826352_log.ldf',size=10mb,maxsize=50mb,filegrowth=10%)在查詢分析器重建立各表的命令代碼: 建立student表:
create table student(sno char(5)primary key,sname char(20),ssex char(2),sage int,sdept char(15))建立course表:
create table course(cno char(2)primary key,cname char(15),cpno char(2),ccredit int)建立cs表:
use 霍雙雙200826352 create table sc(sno char(5),cno char(2),grade smallint,primary key(sno,cno),foreign key(sno)references student(sno),foreign key(cno)references course(cno))實(shí)驗(yàn)二
T-SQL查詢、存儲(chǔ)過(guò)程、觸發(fā)器、完整性上機(jī)作業(yè)題 第一部分 :T-SQL程序設(shè)計(jì)
(1).如果3號(hào)課程的平均成績(jī)?cè)?0分以上,則輸出“3號(hào)課程成績(jī)良好”,否則輸出“3號(hào)成績(jī)一般” declare @avg float set @avg=(select avg(grade)from sc where cno='3')if @avg>80print'3號(hào)課程成績(jī)良好'else print'3號(hào)成績(jī)一般'(2)計(jì)算并輸出95003號(hào)學(xué)生的平均成績(jī),若無(wú)該生信息,則顯示“該生未選課”,提示信息.declare @avg float if(select count(*)from sc where sno='95003')=0 print '該生未選課' else begin select @avg=avg(grade)from sc where sno='95003' print'95003號(hào)學(xué)生平均成績(jī)' print @avg end(3).如果有成績(jī)?cè)?0分以上的學(xué)生,則顯示他的學(xué)號(hào),課程和成績(jī),否則顯示“沒(méi)有學(xué)生的課程成績(jī)?cè)?0分以上”提示信息
declare @text char(10)if exists(select grade from SC where grade>90)select Sno,Cno,Grade from SC where Grade>90 else begin set @text='沒(méi)有學(xué)生的課程成績(jī)?cè)?0分以上' print @text end ×(4).利用游標(biāo)逐行顯示student表中的記錄。
declare stu cursor for select *from student open stu fetch next from stu while @@fetch_status=0 fetch next from stu close stu deallocate stu(5).用自定義函數(shù)計(jì)算全體男生的平均年齡
create function avg_age(@sex char(2))returns int as begin declare @aver int select @aver=(select avg(Sage)from Student where Ssex=@sex)return @aver end go declare @aver1 int,@sex char(2)set @sex='男' select @aver1=dbo.avg_age(@sex)select @aver1 as '全體男生的平均年齡' go(6).顯示course表中課程名的前2個(gè)字符。select substring(Cname,1,2)from Course(7).在一列中顯示student中各元組的學(xué)號(hào)中的年級(jí),列名顯示為“年級(jí)”;另一列中顯示學(xué)號(hào)中的學(xué)生序列號(hào),列名顯示為“序號(hào)”。
select substring(Sno,1,2)年級(jí),substring(Sno,3,len(Sno)-1)序號(hào) from Student order by Sno(8).在選課表中顯示學(xué)號(hào)、課程號(hào),并根據(jù)成績(jī):0-59顯示“不合格”;60-79顯示“合格”;80-89顯示“良好”;90-100顯示“優(yōu)秀?!?/p>
select Sno as '學(xué)號(hào)',Cno as '課程號(hào)', grade =case when Grade<=59 then '不合格' when Grade>=60 and Grade<=79 then '合格' when Grade>=80 and Grade<=89 then '良好' else '優(yōu)秀' end from SC 第二部分 :存儲(chǔ)過(guò)程
(1)創(chuàng)建一個(gè)為worker表添加職工記錄的存儲(chǔ)過(guò)程Addworker go
if exists(select name from sysobjects where name='Addworker' and type='P')drop procedure Addworker go create proc Addworker @職工號(hào) char(4),@姓名 char(8),@性別 char(2),@出生日期 datetime,@黨員否 char(2),@參加工作 datetime,@部門號(hào) char(4)as insert into worker(職工號(hào),姓名,性別,出生日期,黨員否,參加工作,部門號(hào))values(@職工號(hào),@姓名,@性別,@出生日期,@黨員否,@參加工作,@部門號(hào))go exec Addworker '16','王璐','女','1988-11-20','否','2010-08-21','11'(2)創(chuàng)建一個(gè)存儲(chǔ)過(guò)程Delworker刪除worker表中指定職工號(hào)的記錄 go
if exists(select name from sysobjects where name='Delworker' and type='P')drop procedure Delworker go create procedure Delworker @職工號(hào) char(4)as delete from worker where 職工號(hào)=@職工號(hào)
go exec Delworker '16'(3)顯示存儲(chǔ)過(guò)程Delworker的定義信息。Sp_helptext Delworker(4)刪除存儲(chǔ)過(guò)程Addworker和Delworker。drop procedure Addworker, Delworker(5)創(chuàng)建并執(zhí)行以下存儲(chǔ)過(guò)程:
a.從數(shù)據(jù)庫(kù)表中查詢,返回學(xué)生學(xué)號(hào)、姓名、課程名、成績(jī) use 霍雙雙200826351 go if exists(select name from sysobjects where name='select_stu' and type='P')drop procedure select_stu go create procedure select_stu as select SC.Sno,Sname,Cname,Grade from Student,SC,Course where SC.Sno=Student.Sno and SC.Cno=Course.Cno go exec select_stu b.從數(shù)據(jù)庫(kù)表中查詢指定學(xué)號(hào)的學(xué)生學(xué)號(hào),姓名,該存儲(chǔ)過(guò)程接受與傳遞參數(shù),精確匹配的值 use 霍雙雙200826351 go if exists(select name from sysobjects where name='select_sno' and type='P')drop procedure select_sno go create procedure select_sno @Sno char(5)as select Sno,Sname from Student where Sno=@Sno go exec select_sno '95002' ×第三部分:觸發(fā)器
(1)在表depart上創(chuàng)建一個(gè)觸發(fā)器 depart_update , 當(dāng)更改部門號(hào)時(shí)同步更改 worker表中對(duì)應(yīng)的部門號(hào)。Go If exists(select name from sysobjects where name='depart_update'and type='tr')drop trigger depart_update go Create trigger depart_update on depart for update as set worker.部門號(hào)=(select 部門號(hào) from inserted)where worker.部門號(hào)=(select 部門號(hào)from deleted)(2)在表worker上創(chuàng)建一個(gè)觸發(fā)器worker_delete,當(dāng)刪除職工記錄時(shí)同步刪除salary表中對(duì)應(yīng)的職工記錄。Go If exists(select name from sysobjects where name='worker_delete'and type='tr')drop trigger worker_delete go create trigger worker_delete on worker for delete as delete salary where salary.職工號(hào)=(select 職工號(hào) from deleted)(3)刪除觸發(fā)器depart_update(4)刪除觸發(fā)器worker_delete(5)在數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)觸發(fā)器,向選課表添加一條紀(jì)錄時(shí),檢查該紀(jì)錄的學(xué)號(hào)在學(xué)生表中是否存在,檢查該紀(jì)錄的課程號(hào)在課程表中是否存在,若其中有一項(xiàng)為否,則拒絕添加操作,并顯示“違反數(shù)據(jù)一致性”提示信息。Go If exists(select name from sysobjects where name='add_student'and type='tr')drop trigger add_student go
create trigger add_student on sc for insert as go 第四部分:數(shù)據(jù)庫(kù)完整性
1、實(shí)施worker表的“性別”字段默認(rèn)值為“男”的約束 create default default_sex as '男' go sp_bindefault'default_sex','worker.性別'
2、實(shí)施salary表的“工資”字段值在0~9999的約束、create rule salary_rule as @salary='[0~9999]' go sp_bindrule 'salary_rule','salary.工資'
3、實(shí)施depart表的“部門號(hào)”字段值唯一的非聚集索引的約束
4、為worker表建立外鍵“部門號(hào)”,參考表depart的“部門號(hào)”列。
5、建立一個(gè)規(guī)則 sex:@性別=’男’OR @性別=’女’,將其綁定到worker表的“性別”列上。Create rule sex as @性別='男'OR @性別='女' Go Sp_bindrule 'sex','worker.性別'
6、刪除1小題所建立的約束。
7、刪除2小題所建立的約束。
8、刪除3小題所建立的約束
9、刪除4小題所建立的約束
10.解除5小題所建立的綁定并刪除規(guī)則sex
第五篇:數(shù)據(jù)庫(kù)上機(jī)實(shí)驗(yàn)8實(shí)驗(yàn)報(bào)告
上機(jī)實(shí)驗(yàn)八——完整性約束的實(shí)現(xiàn)
一、實(shí)習(xí)目的:
掌握SQL中實(shí)現(xiàn)數(shù)據(jù)完整性的方法,加深理解關(guān)系數(shù)據(jù)模型的三類完整性約束。
二、實(shí)習(xí)準(zhǔn)備:
1.復(fù)習(xí)“完整性約束SQL定義”
2.完成習(xí)題四第10題中的各項(xiàng)操作的SQL語(yǔ)句。
3.了解SQL Server 中實(shí)體完整性、參照完整性和用戶自定義完整性的實(shí)現(xiàn)手段
三、實(shí)習(xí)內(nèi)容:
1.驗(yàn)證習(xí)題四第10題四個(gè)表結(jié)構(gòu)的SQL語(yǔ)句。
表一:Sstudent CREATE TABLE Sstudent(Sno char(7)NOT NULL PRIMARY KEY, Sname VarChar(20)NOT NULL, Ssex Char(2)NOT NULL DEFAULT('男')check(Ssex IN('男','女')), Sage smallint check(Sage >14 AND Sage<65), Clno Char(5)NOT NULL REFERENCES Cclass(Clno)ON UPDATE CASCADE);
表二:Ccourse CREATE TABLE Ccourse(Cno Char(1)NOT NULL PRIMARY KEY, Cname VarChar(20)NOT NULL, Credit Smallint CHECK(Credit IN(1,2,3,4,5,6)));
表三:Cclass CREATE TABLE Cclass(Clno Char(5)NOT NULL PRIMARY KEY, Speciality VarChar(20)NOT NULL, Inyear Char(4)NOT NULL, Number Integer CHECK(Number>1 AND Number<100), Mointor Char(7)REFERENCES Student(Sno));
表四:Ggrade CREATE TABLE Ggrade(Sno Char(7)NOT NULL REFERENCES Student(Sno)ON DELETE CASCADE ON UPDATE CASCADE, Cno Char(1)NOT NULL REFERENCES Course(Cno)ON DELETE CASCADE ON UPDATE CASCADE, Gmark Numeric(4,1)CHECK(Gmark>0 AND Gmark<100), PRIMARY KEY(Sno,Cno));
2.SQL Server中提供了那些方法實(shí)現(xiàn)實(shí)體完整性、參照完整體和用戶自定義完整性
答:實(shí)體完整性:是通過(guò)主碼的定義(PRIMARY KEY)來(lái)實(shí)現(xiàn)的;
參照完整性:是利用外部碼(REFERENCES)的說(shuō)明,以限制相關(guān)表中某些屬性的取值,當(dāng)用戶違反規(guī)則時(shí),提供三種:RESTRICT(限制策略),CASCADE(級(jí)聯(lián)策略),SET NULL(置空策略);
用戶自定義完整性:check約束,對(duì)元組的CHECK約束