建立數據庫:sql
create database 學生課程
建表:數據庫
create table 學生表( 學號 char(10) not null primary key, 姓名 nvarchar(30) not null, 性別 nvarchar(2) not null, 年齡 int not null, 所在院系 nvarchar(10) not null, 班級名稱 nvarchar(20) not null, 入學年份 datetime not null ); create table 課程表( 課程號 char(10) not null primary key, 課程名 nvarchar(20) not null, 選修課 nvarchar(10) ); create table 成績表( 學號 char(10) not null references 學生表(學號), 課程號 char(10) not null references 課程表(課程號), 成績 int not null ); create table 授課表( 教師名 nvarchar(30) not null, 課程號 char(10) not null references 課程表(課程號), 學時數 int not null, 班級名 nvarchar(20) );
插入數據:數據結構
insert into 學生表 values('200009001',N'葛文卿',N'女',22,N'國際貿易',N'國貿2班',2000-8-29); insert into 學生表 values('200104019',N'鄭秀莉',N'女',21,N'會計學',N'會計2班',2001-2-9); insert into 學生表 values('200203001',N'劉成協',N'男',18,N'計算機',N'軟件2班',2002-8-27); insert into 學生表 values('200206001',N'蘇懷欣',N'男',22,N'電子學',N'電子1班',2002-8-27); insert into 學生表 values('200203002',N'夏洛特',N'女',22,N'計算機',N'軟件2班',2002-8-27); insert into 學生表 values('200206002',N'李濤',N'男',23,N'電子學',N'電子1班',2002-8-27); insert into 學生表 values('200203003',N'肖一竹',N'女',19,N'計算機',N'軟件2班',2000-8-27); insert into 課程表 values('C801',N'高等數學',' '); insert into 課程表 values('C807',N'離散數學',' '); insert into 課程表 values('C802',N'C++語言','C807'); insert into 課程表 values('C803',N'數據結構','C802'); insert into 課程表 values('C804',N'數據庫原理','C803'); insert into 課程表 values('C805',N'操做系統','C807'); insert into 課程表 values('C806',N'編譯原理','C803'); insert into 成績表 values('200203001','C801',98); insert into 成績表 values('200203002','C804',70); insert into 成績表 values('200206001','C801',85); insert into 成績表 values('200203001','C802',99); insert into 成績表 values('200206002','C803',82); insert into 授課表 values(N'趙鑫智','C801',72,N'軟件2班'); insert into 授課表 values(N'王立山','C802',64,N'軟件2班'); insert into 授課表 values(N'何珊','C803',72,N'軟件2班'); insert into 授課表 values(N'王立山','C804',64,N'軟件2班'); insert into 授課表 values(N'趙鑫智','C801',72,N'軟件1班');
題目及答案:測試
--1.查詢學生表中信息 select * from 學生表; --2.查詢成績表中的信息 select * from 成績表; --3.查詢所有學生的全部信息,且姓名輸出在左邊(第一列) select 姓名,學號,性別,年齡,所在院系,班級名稱,入學年份 from 學生表; --4.查詢學生當前的年齡是多少歲 select 姓名,性別,年齡 from 學生表; --5.要求計算教師授課程的學分(設學分=學時數/16) select 教師名,學時數/16 as 學分 from 授課表; --6.要求列出學生所在的全部院系名稱 select distinct 所在院系 from 學生表; --7.查詢姓'李'的學生狀況 select * from 學生表 where 姓名 like N'肖%'; --8.查詢成績不在85 到95 之間的信息 select * from 成績表 where 成績 not in(select 成績 from 成績表 where 成績>=85 and 成績<95); select * from 成績表 where 成績<85 or 成績>95; --9.列出全部非軟件2班的班級名稱 select 班級名稱 from 學生表 where 班級名稱 not in (select 班級名稱 from 學生表 where 班級名稱 = N'軟件2班'); --10.列出課程號在'C802'與'C806'之間的全部課程信息 select * from 課程表 where 課程號 like 'C80[2-6]'; --11.列出無選修課的全部課程的課程名 select 課程名 from 課程表 where 選修課=''; --12.列出'高等數學','操做系統','編譯原理'的所有信息 select * from 課程表 where 課程名=N'高等數學' or 課程名=N'操做系統'or 課程名=N'編譯原理'; --13.要求查詢全部2002年元旦前入學的學生名單.()並按年齡排序 --這句是對的,可是查詢不出來的本來是,當初插入數據時未加單引號,致使datetime類型插入有誤 select * from 學生表 where month(入學年份)<1 and year(入學年份)<2002 order by 年齡; --14.要求查詢年齡在19歲如下或者是女生的學生姓名,年齡,性別 select 姓名 as 學生姓名,年齡,性別 from 學生表 where 年齡<19 or 性別=N'女'; --15.同時按學號(從小到大)和成績(從大到小)排列出全部學生課程成績 select * from 成績表 order by 學號,成績 desc; --16.從學生表中統計每一個班級名稱的人數 select 班級名稱,count(班級名稱) from 學生表 group by 班級名稱; --17.統計19歲以上女生的個數 select count(年齡) from 學生表 where 性別 = N'女' and 年齡>19; --18.查詢全部年齡的總和 select sum(年齡) from 學生表; --19.從成績表查詢最高分,最低分 select max(成績) as 最高分,min(成績)as 最低分 from 成績表; --20.要求查詢'C801'課程的平均分 select avg(成績) from 成績表 where 課程號='C801'; --21.統計選修了課程的學生人數(用成績表) select count(a) from (select count(學號) as a from 成績表 group by 學號) as b where b.a>1; --22.根據性別統計學平生均年齡 select avg(年齡) from 學生表 group by 性別; --23.根據學生表統計入學年份 select 入學年份 from 學生表 group by 入學年份; --24.找出入學人數大於3人的年份及人數 select 人數 from (select 入學年份,count(入學年份) as 人數 from 學生表 group by 入學年份 ) as A where 人數>3; --25.求相同月份入學的人數(不考慮年份) select month(入學年份) from 學生表; select count(入學月份) from (select MONTH(入學年份) as 入學月份 from 學生表)as A group by 入學月份 having count(*)>1; --26.篩選出平均成績在80分以上的課程及平均成績 select 課程號,平均成績 from (select 課程號,AVG(成績) as 平均成績 from 成績表 group by 課程號) as A where 平均成績>80; --27.查詢學生 姓名,課程號,成績 select 姓名,課程表.課程號,成績 from 學生表,課程表,成績表 where 學生表.學號=成績表.學號 and 課程表.課程號=成績表.課程號; select 姓名,課程表.課程號,成績 from 學生表 join 成績表 on 學生表.學號 = 成績表.學號 join 課程表 on 成績表.課程號=課程表.課程號; --28.列出全部課程的選修課程名稱 select 課程號 as 選修課,課程名 from 課程表 where 課程號 in (select 選修課 from 課程表 where 選修課 !=''); --29.查詢課程號爲'C801'而且成績大於90分的學生姓名,學號和成績 select distinct 學生表.姓名,學生表.學號,成績表.成績 from 學生表,成績表 ,課程表 where 成績表.課程號='C801' and 成績表.成績>90 and 成績表.學號=學生表.學號; --30.查詢學生姓名,學號,課程名,成績 select 姓名,學生表.學號,課程表.課程名,成績 from 學生表,課程表,成績表 where 學生表.學號=成績表.學號 and 課程表.課程號=成績表.課程號; --31.要求列出選修了C++語言的學生學號,姓名,成績,課程名 select 學生表.學號,姓名,成績,課程名 from 學生表,課程表,成績表 where 學生表.學號=成績表.學號 and 課程表.課程號=成績表.課程號 and 選修課='C802'; --32.查詢與'劉成協' 同院系的學生信息 select * from 學生表 where 所在院系 in(select 所在院系 from 學生表 where 姓名=N'劉成協'); --33.查詢選修了'C802'與'C807' 這2門課程的學生姓名,課程名和成績 select distinct 姓名,課程名,成績 from 學生表,課程表,成績表 where 學生表.學號=成績表.學號 and 成績表.課程號=課程表.課程號 and (選修課='C802' or 選修課='C807'); --34.查詢全部與計算機系學生年齡不相同的學生信息 select * from 學生表 where 年齡 not in (select 年齡 from 學生表 where 所在院系=N'計算機'); --35.查詢全部年齡大於計算機系的平均年齡的非計算機系學生的學生信息 select * from 學生表 where 年齡 >(select avg(年齡) from 學生表 where 所在院系=N'計算機') and 所在院系 != N'計算機'; --36.查詢全部年齡大於計算機系的最小年齡的非計算機系學生的學生信息 select * from 學生表 where 年齡>(select min(年齡) from 學生表 where 所在院系=N'計算機') and 所在院系 != N'計算機'; --37.查詢全部年齡小於計算機系的最大年齡的非計算機系學生的學生信息 select * from 學生表 where 年齡<(select max(年齡) from 學生表 where 所在院系=N'計算機') and 所在院系 != N'計算機'; --38.查詢'何珊'所教班級的全部任課教師的姓名,所教班級名 select * from 授課表; select 教師名,班級名 from 授課表 where 班級名 in (select 班級名 from 授課表 where 教師名=N'何珊'); --39.按年齡降序列出全部超過平均年齡的學生姓名和年齡 select 姓名,年齡 from 學生表 where 年齡>(select avg(年齡) from 學生表) order by 年齡 desc; --40.檢索學號不是[200108011]且入學月份爲5月的學生信息 --這道題廢了半天勁,緣由: --學生表的入學年份輸入的時候寫的是2000-8-29 --可是實際插入的是1905-05-18 --緣由可能因爲內部機制問題,因此查入學年份時,注意下 --這是我網上找的解釋:日期型數據插入要帶上單引號.否則就變成數字,當你的字段類型爲日期型時,我插入日期類型時確實沒加單引號,加入單引號 --測試了一下,加單引號是對的,因此你能夠加單引號插入,不要跟着我作 select month(入學年份) from 學生表;--結果都是5和6 select * from 學生表 where 學號 != '200108011' and month(入學年份)=5; --41.列出年齡在18~23歲之間且選修了C++語言的男同窗的詳細信息 select * from 學生表 where 年齡>=18 and 年齡<=23 and 性別=N'男' and 學號 in(select 學號 from 成績表 where 課程號 in(select 課程號 from 課程表 where 選修課='C802')); --42.列出全部不是姓'劉'的學生信息 --這個題用到了正則,可是沒有搞出來 select * from 學生表 where 姓名 not in(select 姓名 from 學生表 where 姓名=N'劉成協'); --43.統計學生表中一共有多少名20歲以上的女同窗 select count(性別) from 學生表 where 年齡>20 and 性別=N'女'; --44.查找年齡最大和最小的男學生年齡 select max(年齡)as maxage,min(年齡)as minage from 學生表 where 性別=N'男'; --45.計算選修課門數在1門以上的學生號,姓名, 選課門數 --這個寫法理解錯的 select 學號,姓名 from 學生表 where 學號 in(select 學號 from 成績表 where 課程號 in(select 選修課 as 課程號 from 課程表 group by 選修課 having count(選修課)>1 and 選修課 !='')); select 學生表.學號,姓名 from 學生表 where 學號 in( select 學號 from 成績表 group by 學號 having count(學號)>1); --選課門數沒有統計 --46.計算每一個班學生的平均年齡和最小年齡 select 班級名稱,avg(年齡) as 平均年齡,min(年齡) as 最小年齡 from 學生表 group by 班級名稱; --47.列出全部成績大於學號爲200106001的學平生均成績的學生姓名,課程名和成績 select 姓名,課程名,成績 from 學生表,課程表,成績表 where 學生表.學號=成績表.學號 and 成績表.課程號 =課程表.課程號 and 學生表.學號>'200106001'; --48.建立一個[簡單學生表]要求包含4個字段"學號,姓名,性別和所在院系", ----而後將[學生表]中"國際貿易"或者男學生的記錄所有插入到簡單學生表中,最後顯示插入的記錄 create table 簡單學生表( 學號 char(10) not null primary key, 姓名 nvarchar(30) not null, 性別 nvarchar(2) not null, 所在院系 nvarchar(10) not null ); insert into 簡單學生表 select 學號,姓名,性別,所在院系 from 學生表 where 所在院系=N'國際貿易' or 性別=N'男'; select * from 簡單學生表; --49.列出全部沒有選修課程'C804'的學生清單 select * from 學生表 where 學號 in( select 學號 from 成績表 where 課程號 in( select 課程號 from 課程表 where 選修課 in(select 選修課 from 課程表 where 選修課 !='C804'))); --50.將計算級系的學生成績均加5分 select 成績+5 as 加5後成績 from 成績表 where 學號 in (select 學號 from 學生表 where 所在院系=N'計算機');