計網0831數據庫課程設計
1、數據的導入和導出今天是數據庫實習的第壹天,對於我們來說數據庫雖然是今年剛剛學過的課程,但是我們已經考試完壹段時間了,所以也很久沒有翻書本了,很多知識在剛剛做的時候還是很陌生的,不得不翻壹下書本,下面就是在第壹天實習中所產生的問題報告和分析結果。
在做實訓前,老師先給我們講了數據庫如何導入EXCL表,在老師的指導下我們學會了,為創建表提供了方便。
首先我們是建立了壹個新的KCSJ數據庫,建立的數據語句如下:
用SQL語句在D:\KCSJ下創建課程設計數據庫(KCSJ)
(壹)CREATE DATABASE KCSJ
ON
(NAME=KCSJ_DATA,
FILENAME='D:\KCSJ_DATA.MDF')
LOG ON
(NAME=KCSJ_LOG,
FILENAME='D:\KCSJ_LOG.LDF')
將KCSJ.XLS文件中的數據導入KCSJ數據庫中。導入後在數據庫中將生成以下五個基本表:
學生(學號,姓名,性別,年齡,入學成績,班級,籍貫)
成績(學號,課程號,成績)
課程(課程號,課程名,教師名)
三角形(a,b,c,s)
回文數(A1,A2)
其中:a> 學生、成績、課程、三角形、回文數是表的名字。
b> 學號、姓名、性別、班級、籍貫、課程名和教師名為字符型,長度分別為10 、10、2、6、8、20、10;
c> 入學成績為整型。
d> 年齡、課程號和成績為整型或微整型。
e> A1為整型;A2為字符型,長度為2。
f> a、b、c為float類型,代表三角形的三邊,s為float類型,代表三角形的面積。
在導入數據庫中KCSJ.XLS文件的數據導入的時候是在所有任務--導入數據—數據源為excel97-2000- 文件位置—導入表中的數據—修改類型和長度 最後確定。
用企業管理器創建數據庫(JW0831),將KCSJ數據庫中的五個表導入該數據庫中。
打開所有任務 導入數據源 選擇KSCJ 數據庫 下壹步 再選擇jw0831數據庫 選擇所有 確定 就可以將KCSJ數據庫中的五個表導入該數據庫中。
簡單的結構化查詢
--(1)查詢學生的詳細記錄
select*from 學生
--(2)查詢學生表中前兩個班級(班級名稱不能重復)
select top 2 班級 from 學生
group by 班級
在做本題的時候,由於想的比較復雜,外加題意有點模糊,所以轉了很大壹個圈,並在老師的側外指導下通過group by分組才把本題做了出來。
--(3)顯示把 成績表中各科學生的成績加 20 分後的信息
select*from 成績
where 成績='成績'+20
在做本題的時候,由於題意理解錯誤,所以我先用updata語句來進行更新,但是在做到其它題的時候,聽到老師在指導其它同學的時候,把題意壹說,我才恍然大悟,自己的方向又錯了。然後又重新思考,接著就做出了上面的答案。
--(4)查詢來自“寧波” 學生的學號、姓名、籍貫
select 學號,姓名,籍貫 from 學生
where 籍貫='寧波'
--(5)查詢選修4號課程且考試成績在70分以上的學生的學號以及所選修的課程號和成績,顯示前3條結果記錄
select top 3*from 成績
where 成績>=70 and 課程號='4'
--(6)查詢入學成績在 300-400 分之內的學生的詳細情況,並按入學成績降序排序 ( 用兩種方法完成 )
select * from 學生
where 300<入學成績 and 入學成績<400 order by 入學成績 desc
select * from 學生
where 入學成績 between 300 and 400 order by 入學成績 desc
--(7)統計學生表中的學生人數
select count(*)from 學生
對於今天的題目做的多了,忽然發現很多題的類型都差不多,都是運用基本的書本知識,然後融會貫通,舉壹反三,然後不費吹灰之力就做出來了,我說的不費吹灰之力是簡單的,但是有些還是費了好大壹番功夫的。
--(8)查詢學生表中姓李,姓名列包含兩個字的學生的基本情況
select * from 學生
where 姓名 like '李_'
--(9)查詢名字中第 2 個字為‘北'的學生的基本信息
select * from 學生
where 姓名 like '_北%
在做這幾道題的時候,我解決了並也明白了—和%得區別和用途
--(10)查詢選修 4 號課程,成績在 80-90 分之間的學生學號和成績
select*from 成績
where 80<=成績 and 成績<90 and 課程號='4'
--(11)查詢 JW0831 班和 JW0551 班學生的姓名、性別及班級(用謂詞查詢 in )
select 姓名,性別,班級 from 學生 where 班級 in('JW0831','JW0551')
group by 姓名,性別,班級
對於本道題拿到的時候,還是楞了壹下的,因為我忽然不知道什麽是,對於用謂詞查詢 in,自己不會用,在翻書翻了壹遍並且詢問了同學才發現如何去用它。
--(12)查詢缺少成績的學生的學號和相應的課程號
select 學號,課程號 from 成績
where 成績 is NULL
--(13)統計選修了4號課程學生人數
SELECT COUNT(*)AS'人數' FROM 成績 where 課程號='4'
--(14)查詢JW0831班家在河北學生的學號、姓名、性別
select 學號,姓名,性別 from 學生
where 籍貫='河北'and 班級='JW0831'
--(15)檢索劉誌生老師所授課程的課程號和課程名。
select 課程號,課程名 from 課程
where 教師名='劉誌生'
---(16)檢索年齡大於23歲的男學生的學號和姓名。
select 學號,姓名 from 學生
where 性別='男' and 年齡>23
--(17)查詢學生表中姓李的學生的基本情況
select *from 學生
where 姓名 like '李%'
--(18) 統計學生表中所有學生“入學成績”的平均分、最高分、最低分
select AVG(入學成績) as'平均成績',max(入學成績) as'最高分',min(入學成績) as'最低分'from 學生
--(19)查詢選修了1號或者3號課程,成績及格的學生的學號和成績
select 學號,成績 from 成績
where 成績>=60 and 課程號 in (1,3)
--(20)統計學生表中所有男女生人數
SELECT 性別, COUNT(性別)AS'人數' FROM 學生
group by 性別
對於今天的題除了自己不太熟悉課本知識和同學討論出來的那些分析外,對於其他的題已經沒有什麽問題了,因為我把今天的題做完之後,把報告寫完的同時,對於明天的題我也進行了壹番思考,並且還幫助其他同學解決了壹些不會的問題。
星期二 天氣 冷 心情 good
3、復雜的結構化查詢
--(1)檢索至少選修劉誌生老師所授課程中壹門課程的女學生姓名。
select 學生.學號,姓名,性別,課程.課程號 from 學生,成績,課程
where 性別='女' and 課程.課程號 in(select 課程號 from 課程 where 教師名='劉誌生')and 學生.學號=成績.學號
and 課程.課程號=成績.課程號
對於今天的課程設計不是像昨天壹樣那麽簡單了,簡直是提高了壹個很大的層次,簡直是壹步三晃啊!不容易啊!就像本題壹樣,在查詢的時候要用壹個子查詢和三個條件才能把它做出來!
--(2)檢索吳計算同學不學的課程的課程號。
select 課程號 from 課程 where 課程號 not in(select 成績.課程號 from 成績,學生where 姓名='吳計算' and 成績.學號=學生.學號)
在本題中,用的方法還真是壹波三折啊!因為如果要查不學的課程,要先查出他學的課程,然後再排掉學過的!充分運用了not in這個語法
--(3)檢索至少選修四門課程的學生學號。
select 學號, count(成績.學號)as '門數' from 成績,課程 where 成績.課程號=課程.課程號
group by 成績.學號
having count(成績.學號)>=4
對於本題的用的是count做統計這個數據語句,外加可以用在group by 語句後的having條件語句。通過本題的聯系,可以很好的運用count 和having語句
--(4)檢索全部學生都選修的課程的課程號與課程名。
select 課程.課程名 ,課程.課程號 from 成績,課程
where 成績.課程號=課程.課程號
group by 課程.課程名,課程.課程號
having count(成績.學號) in (select count(學生.學號)from 學生)
--(5)檢索選修課程包含劉誌生老師所授課的學生學號。
select 學號 from 成績,課程
where 教師名='劉誌生'and 成績.課程號=課程.課程號
--(6)統計有學生選修的課程門數。
select 學號, count(成績.學號)as '門數' from 成績,課程 where 成績.課程號=課程.課程號
group by 成績.學號
--(7)求選修4號課程的學生的平均年齡。
select AVG(年齡)as'平均年齡',成績.課程號 from 學生,成績
where 課程號='4' and 學生.學號=成績.學號
group by 成績.課程號
--(8)求劉誌生老師所授課程的每門課程的學生平均成績。
select avg(成績.成績)as'平均成績',課程.課程號 from 成績,課程
where 教師名='劉誌生' and 成績.課程號=課程.課程號
group by 課程.課程號
--(9)統計每門課程的學生選修人數(超過6人的課程才統計)。要求輸出課程號和選修人數,查詢結果按人數降序排列,若人數相同,按課程號升序排列。
select 成績.課程號, count(成績.學號)as '人數' from 成績,課程
where 成績.課程號=課程.課程號
group by 成績.課程號
having count(成績.學號)>=6
order by count(成績.學號) asc
--(10)檢索學號比陸力利同學大,而年齡比他小的學生姓名。
select 學號,姓名 from 學生
where 學號>(select 學號 from 學生 where 姓名='陸力利') and 年齡<(select 年齡 from 學生 where 姓名='陸力利'
--(11)求年齡大於女同學平均年齡的男學生姓名和年齡。
select 姓名,年齡 from 學生
where 性別='男'and 年齡>(select avg(年齡)as'平均年齡'from 學生 where 性別='女')
--(12)統計學生人數超過 5人的班級名稱和對應的人數
select 班級,count(學生.學號)as '人數'from 學生
group by 班級
having count(學生.學號)>=5
--(13)檢索課程號和選修人數,查詢結果按人數升序排列,若人數相同,按課程號降序排列。
select 成績.課程號, count(成績.學號)as '人數' from 成績,課程
where 成績.課程號=課程.課程號
group by 成績.課程號
order by count(成績.學號) asc,成績.課程號 desc
這道題運用很多知識點,不但用了count 統計 還用了 group by 分組 外加排序
--(14)查詢選修課程學生的學號、姓名、所選課程號、取得的成績
select 學生.學號,學生.姓名,成績.課程號,成績.成績 from 學生,成績
where 學生.學號=成績.學號
--(15)查詢學生的學號、課程號和成績等級
select 學號,課程號,成績,(
CASE
WHEN 成績>=90 and 成績<=100 THEN 'A'
WHEN 成績>=80 and 成績<90 THEN 'B'
WHEN 成績>=70 and 成績<80 THEN 'C'
WHEN 成績>=60 and 成績<70 THEN 'D'
ELSE 'E'
END ) as 等級
from 成績
本題運用了壹個新的知識點,這個知識點是在老師的ppt課件上找到的,利用這個語句何以很好很方便的為管理系統中的成績分等級,所以在本體中壹定要記住本語句的語法如:case when……and then ……else end
今天小結,通過今天壹天的課程設計,我覺得我收獲了很多,因為它讓我以前學的不太好的知識點全部都鞏固了壹遍,尤其是成績、課程、學生這些表與表的鏈接,每次不是這裏連不上就是那裏連不上,但是現在不但可以連上了,還可以幫助其他同學檢查出來錯誤,真是壹筆不小的收獲,雖然今天做的題比較難,但是每壹次在自己的努力下做出來都會有不小的成就感……
3、復雜的結構化查詢
星期三 天氣 冷 心情 good
外面飄著雪花,美好的壹天又已經開始了!實習已經到了壹半,離回家的日子也近了很多,所以心情也是越實習越好了!今天的工作當然也完成的比較順利!雖然有的還挺難的!但是相信自己壹定就會成功!嘿嘿……看看自己的勞動成果就知道了!
3、復雜的結構化查詢
--(16)查詢選修了英語的學生的姓名和成績;
select 學生.姓名,成績.成績 from 成績,學生,課程
where 課程.課程名='英語'and 學生.學號=成績.學號 and 課程.課程號=成績.課程號
group by 學生.姓名,成績.成績
--(17)分別統計每個班級的男女人數(要求顯示出班級、性別、對應的人數)
SELECT 班級, 性別, COUNT(性別)AS'人數' FROM 學生
group by 班級,性別
--(18)求年齡大於所有女同學年齡的男學生姓名和年齡。
select 姓名,年齡 from 學生
where 性別='男'and 年齡>(select max(年齡) from 學生 where 性別='女')
group by 姓名,年齡
--(19)計算選修了1號課程的學生的平均成績(要求顯示出課程號和對應的平均成績)
select 課程號,avg(成績)as'平均成績'from 成績
where 課程號='1'
group by 課程號
--(20)查詢選修課程學生的學號、姓名、所選課程名、取得的成績
select 學生.學號,姓名,課程.課程名,成績.成績 from 學生,成績,課程
where 學生.學號=成績.學號 and 課程.課程號=成績.課程號
--(21)查詢學生的學號、姓名、性別及所選修各門課程的成績(要求每位學生用壹個數據行顯示這些信息)
SELECT 學生.學號, 學生.姓名,學生.性別,
(select 成績 from 成績 where 課程號='1' and 學生.學號=學號) as '數學',
(select 成績 from 成績 where 課程號='2' and 學生.學號=學號) as '英語',
(select 成績 from 成績 where 課程號='3' and 學生.學號=學號) as '計算機基礎',
(select 成績 from 成績 where 課程號='4' and 學生.學號=學號) as '數據庫',
(select 成績 from 成績 where 課程號='5' and 學生.學號=學號) as '政治',
(select 成績 from 成績 where 課程號='6' and 學生.學號=學號) as '體育'
FROM 學生 INNER JOIN 成績 ON 學生.學號=成績.學號
GROUP BY 學生.學號, 學生.姓名,學生.性別
--(22)查詢李路路所學的課程名和對應的成績,並按照成績升序排列。
select 姓名,課程名,成績 from 學生,課程,成績
where 姓名='李路路'and 課程.課程號=成績.課程號 and 學生.學號=成績.學號
order by 成績
--(23)查詢平均成績大於 75 分的課程,要求顯示課程名和平均成績。
select 課程名,avg(成績)as'平均成績' from 課程,成績
where 課程.課程號=成績.課程號
group by 課程名
having avg(成績)>=75
--(24)查詢所選課程平均成績前三名的那些學生的姓名和平均成績。
select top 3 學生.學號,姓名,avg(成績.成績)as'平均成績'from 成績,學生 where 學生.學號=成績.學號 group by 學生.學號,姓名 order by avg(成績.成績) desc
--(25)查詢和李工業在同壹個班級的學號和姓名
select 學號,姓名 from 學生
where 班級 in (select 班級 from 學生 where 姓名='李工業')
--(26)查詢JW0831班中入學成績比李裏高的學生的姓名
select 姓名 from 學生
where 班級='JW0831' and 入學成績>(select 入學成績 from 學生 where 姓名='李裏')
--(27)在學生表中查詢高於入學成績平均分的學生學號、姓名、班級、入學成績
select 學號,姓名,班級,入學成績 from 學生
where 入學成績>(select avg(入學成績)as'平均成績'from 學生)
--(28)查詢沒有選修課程的學生的學號和姓名
select 學生.學號,學生.姓名 from 學生
where 學號 not in(select 學號 from 成績 group by 學號 )
--(29)查詢選修了 5(含5) 門以上課程的學生的姓名。
select 姓名 from 學生,成績,課程 where 成績.課程號=課程.課程號 and 學生.學號=成績.學號
group by 成績.學號,姓名
having count(成績.學號)>=5
--(30)查找同名同姓的學生信息。
select a1.* from 學生 a1,學生 a2
where a1.姓名=a2.姓名 and a1.學號<>a2.學號
星期四 天氣 冷 心情 good
數據管理
--(1)利用學生表創建壹個新表(不含數據):優秀(學號,姓名,性別),
--然後在學生表中檢索每壹門課程成績都大於等於80分的學生學號、姓名和性別,
--並把檢索到的值送往優秀表中。
select 學號,姓名,性別 into 優秀 from 學生
where 5>6
insert into 優秀 select 學號,姓名,性別 from 學生 where 學號 in (select 學號 from 成績 group by 學號 having min(成績)>=80 )
--(2)把李路路同學的選課和成績全部刪去。
delete from 成績
where 成績 in(select 成績 from 學生,成績 where 學生.學號=成績.學號 and 姓名='李路路')
--(3)把低於總平均成績的女同學成績提高5%。
UPDATE 成績 SET 成績=成績*(1+0.05) WHERE 成績<(select avg(成績.成績)as'平均成績'from 成績) and 學號 in(select 學號 from 學生 where 性別='女')
--(4)把選修數學課不及格的成績全改為空值。
UPDATE 成績 SET 成績=null WHERE 成績<60 AND 課程號=(select 課程號 from 課程 where 課程名='數學')
--(5)在成績表修改4號課程的成績,若成績小於等於75分時提高5%,若成績大於75分時提高4%(用兩個UPDATE語句實現)。
UPDATE 成績 SET 成績=成績*0.5 WHERE 成績<=75 and 課程號='4'
UPDATE 成績 SET 成績=成績*0.4 WHERE 成績>75 and 課程號='4'
--(6)將選修4號課程且成績沒有及格的學生的成績調整為 60 分。
UPDATE 成績 SET 成績=60 WHERE 成績<60 AND 課程號='4'
自定義函數的使用
編寫壹函數(hws),判斷壹個整數是否為回文數,若是函數值為“是”,否則為“否”,利用該函數判斷回文數基本表中A1列的整數是否為回文數,若是,則A2列的值為“是”,否則為“否”。
create function hws(@A1 int)
returns char(2)
as
begin
declare @y int,@r int,@c char(2),@z int
select @y=0,@z=@A1
while @A1!=0
select @r=@A1%10,@y=@y*10+@r,@A1=@A1/10
if @y=@z
set @c='是'
else
set @c='否'
return @c
end
update 回文數 set A2=dbo.hws(A1)。
星期五 天氣 冷 心情 good
遊標的使用
利用遊標可以訪問單獨數據行的特點,逐壹對三角形基本表中的數據行(三條邊)進行處理,求三角形的面積。
Declare yb cursor
For
Select*from 三角形
Declare @a float,@b float,@c float,@p float,@s float
Open yb
Fetch next from yb into @a,@b,@c,@s
While @@fetch_status=0
Begin
If @a+@b>@c and @a+@c>@b and @b+@c>@a
select @p=(@a+@b+@c)/2.0,@s=round(sqrt(@p*(@p-@a)*(@p-@b)*(@p-@c)),2)
else
set @s=null
update 三角形 set s=@s where current of yb
fetch next from yb into @a,@b,@c,@s
end
close yb
deallocate yb
心得體會
時光匆匆,壹個星期的實習已經接近尾聲了,對於本次的實習心情就是輕松加愉快,收獲也是碩果累累,在老師的安排下,實習的過程是根據每天老師給的任務,按時完成作業然後再把報告寫完根據規劃每天都有條不絮的幹著自己的事情,對於我是壹個不會安排時間的人,生活中重來沒有規劃,所以事情每次幹完不是緊壹陣就是松壹陣的,所以通過這次實習中在老師的安排下,自己也懂得了安排時間的重要性,也從中吸取到了壹些經驗。
在本次實習中我不僅把本學期學習的數據庫基本知識進行了點到點的復習,也把它進行了鞏固,在原來沒有學好的地方通過本次的實習學的比以前學的更好,不僅如此,我們在做課程設計的時候還學會了獨自的思考和協作,有些知識點我們運用的不是很好,但是後面再老實的幫助和在同學的探討下,最後都把它解決了出來。除此之外,我也感覺到實習並不是因為完成任務而實習,它是為了讓我們更好的掌握知識,並把知識運用到生活中去的,就像藝術壹樣,源於生活,而應用於生活壹樣。數據庫的學習,也是為了以後生活中方便自己方便他人而學習的。
由於每天緊張的課程,壹路都是匆匆來匆匆去,所以壹個班同學的交流也是很少的,通過實習所以同學之間交流的機會也就比較多了壹點,比才的感覺也因此增進了不少,以上就是本次在實習中所得到的心得,至於沒有感受到的,將在以後的生活中再次的吸取生活中的經驗。來進行學習中的總結。