SQL習題筆記

這裏主要介紹幾道題目用以更加深入的瞭解SQL語句。在工作面試時乃至在考研時,很多時候都會考到SQL語句。如果這篇文章中的所有的題目都搞明白了,那麼應付工作面試筆試或者考研筆試將會更加的遊刃有餘。


題目01

現有關係數據庫如下:
學生(學號,姓名,性別,專業,獎學金)
課程(課程號,名稱,學分)
學習(學號,課程號,分數)
用SQL語言實現下列題目:
1. 檢索不學課程號爲“C135”課程的學生信息,包括學號,姓名和專業。
select 學號, 姓名, 專業
from 學生
where 學號 NOT IN (
	select 學號
	from 學習
	where 課程號="C135");

2. 檢索至少學過課程號爲“C135”和“C219”的學生信息,包括學號、姓名和專業。
select 學號, 姓名, 專業
from 學生
where 學號 IN (
	select 學號
	from 學習 x, 學習 y
	where x.學號=y.學號 AND x.課程號='C135' AND y.課程號='C219');

3. 從學生表中刪除成績出現過0分的所有學生信息。
delete from 學生
where 學號 IN (
	select 學號
	from 學習
	where 分數=0);

4. 定義“英語”專業學生所學課程的信息視圖AAA,包括學號、姓名、課程號和分數。
create view AAA(學號, 姓名, 課程號, 分數)
AS
select 學號, 姓名, 課程號, 分數
from 學生, 學習
where 學生.學號=學習.學號 AND 專業="英語";

題目02

學校有多名學生,財務處每年要收一次學費。爲財務處收學費工作設計一個數據庫,包括兩個關係:
學生(學號,姓名,專業,入學日期)
收費(學年,學號,學費,書費,總金額)
假設規定屬性的類型:學費、書費、總金額爲數值型數據;學號、姓名、學年、專業爲字符型數據;入學日期爲日期型數據。列的寬度自定義。
試用SQL語句定義上述表的結構。(定義應包括主鍵子句和外鍵子句)。
create table 學生(
	學號 char(8) primary key,
	姓名 char(25),
	專業 char(50),
	入學日期 date
);
create table 收費(
	學年 char(10),
	學號 char(8),
	學費 numeric(4),
	書費 numeric(5,2),
	總金額 numeric(7,2),
	primary key(學號, 學年),
	foreign key(學號) references 學生(學號)
);

題目03

設某公司數據庫中有關係模式如下:職工(職工號,職工名,性別,年齡)工作(職工號,公司號,工資)公司(公司號,公司名,地址)。1. 寫出查詢每個公司女職工的平均工資的SQL語句。(提示:求平均值用函數AVG())
select 公司號, 公司名, AVG(工資)
from 職工, 工作, 公司
where 公司.公司號=工作.公司號 AND 職工.職工號=工作.職工號 AND 性別='女'
group by 公司號;

2. 試用SQL語句寫出下列操作:超過50歲職工的工資增加200元。
update 工作
set 工資=工資+200
where 職工號 IN (
	select 職工號
	from 職工
	where 年齡>=50);

3. 把對職工表的插入權限授給用戶A,並許諾他再將此權限授予其他用戶。
grant insert ON 職工 TO A WITH GRANT OPTION;

題目04

圖書出版管理數據庫中有兩個基本表:
圖書 (書號,書名,作者編號,出版社,出版日期)
作者 (作者編號,作者名,年齡,地址)
試用SQL語句寫出下列查詢:
檢索年齡低於作者平均年齡的所有作者的作者名、書名和出版社。
select 作者名, 書名, 出版社
from 圖書, 作者
where 圖書.作者編號=作者.作者編號 AND 年齡 <= (
	select AVG(年齡)
	from 作者);

題目05

現有關係數據庫如下:學生(學號,姓名,性別,專業,獎學金)課程(課程號,名稱,學分)學習(學號,課程號,分數)用SQL語言實現下列題目。 

1. 檢索沒有獲得獎學金、同時至少有一門課程成績在95分以上的學生信息,包括學號、姓名和專業。

select 學號, 姓名, 專業
from 學生
where 獎學金<=0 AND 學號 IN (
	select 學號
	from 學習
	where 分數>=95);

2. 檢索沒有任何一門課程成績在80分以下的所有學生的信息,包括學號、姓名和專業。
select 學號, 姓名, 專業
from 學生
where 學號 NOT IN (
	select 學號
	from 學習
	where 分數<80);

3. 對成績得過滿分(100分)的學生,如果沒有獲得獎學金的,將其獎學金設爲1000元。
update 學生
set 獎學金=1000
where 獎學金<=0 AND 學號 IN (
	select 學號
	from 學習
	where 分數=100);

4. 定義學生成績得過滿分(100分)的課程視圖 AAA,包括課程號、名稱和學分。
create view AAA(課程號, 名稱, 學分)
AS
select 課程號, 名稱, 學分
from 課程
where 課程號 IN (
	select 課程號
	from 學習
	where 分數=100);

題目06

設有學生-課程關係數據庫,其數據庫關係模式爲:學生Student(學號Sno,姓名Sname,所在系Sdept,年齡Sage,性別Ssex)課程Course(課程號Cno,課程名稱Cname,先修課號Cpno,學分Ccredit)學生選課SC(學號Sno,課程號Cno,成績Grade)試用SQL語言分別寫出下列查詢:1. 查詢選修了3號或6號課程的學生的學號。
select Sno
from SC
where Cno='3' OR Cno='6';
2. 查詢至少選修了一門其直接先行課爲8號課程的學生學號與姓名。
select Sno, Sname
from SC, Course, Student
where Course.Cno=SC.Cno AND Student.Sno=SC.Sno AND Cpno='8';
3. 查詢選修了全部課程的學生學號、姓名和年齡。
-- 查詢沒有一門課程是該學生沒有選的
select Sno, Sname, Sage
from Student
where NOT EXISTS (
	select *
	from Course
	where NOT EXISTS (
		select *
		from SC
		where Student.Sno=SC.Sno AND Course.Cno=SC.Cno));

4. 查詢沒有選修2號課程的學生學號與姓名。
select Sno, Sname
from Student
where Sno NOT IN (
	select Sno
	from SC
	where Cno='2');

5. 查詢選修了3門以上課程並且成績均及格的學生學號與其平均成績。
-- 本題未經驗證,未必正確
select Sno, AVG(Grade)
from SC x
group by Sno
having COUNT(Cno)>3
where NOT EXISTS (
	select *
	from SC y
	x.Cno=y.Cno AND Grade<60);

6. 將計算機科學系(CS)全體學生的所有成績置爲零。
update SC
set Grade=0
where Sno IN (
	select Sno
	from Student
	where Sdept='CS');

題目07

設有學生-課程關係數據庫,其數據庫關係模式爲:學生S(學號S#,姓名SN,所在系SD,年齡SA)課程C(課程號C#,課程名稱CN,先修課號PC#)學生選課SC(學號S#,課程號C#,成績G)試用SQL語言分別寫出下列查詢:1. 求學生'95001'(爲學號)所選的成績爲60以上的課程號。
select C#
from SC
where S#='95001' AND G>=60;
2. 求選讀了“數據庫概論”,併成績爲80或90的學生學號和姓名。
select S#,SN
from S,SC,C
where C.C#=SC.C# AND SC.S#=S.S# AND C.CN='數據庫概論' AND (G=90 OR G=80);
3. 求選修了全部課程的學生學號、姓名及其所在系名。
-- 沒有一門課程是該學生沒有選修的
select S#, SN, SD
from S
where NOT EXISTS (
	select *
	from C
	where NOT EXISTS (
		select *
		from SC
		where SC.C#= C.C# AND SC.S#=S.S#
	));

4. 找出沒有學生選修的課程號及課程名稱。
select C#, CN
from C
where C.C# NOT IN (
	select SC.C#
	from SC);
5. 列出選課數超過3門的學生學號、其所修課程數及平均成績。
select S#, count(C#), AVG(G)
from SC
group by S#
having count(C#)>3;
6. 刪除“數據結構”課程及所有對它的選課情況。
-- 首先刪除SC中的數據
delete from SC
where SC.C# IN (
	select C.C#
	from C
	where CN='數據結構');
-- 其次刪除C的數據
delete from C
where Cname='數據結構';

題目08

下表爲數據表Register的相關信息,請寫出創建該表的語句(PK代表主鍵)。字段名數據類型長度允許空。
Id(PK) int8
Username varchar20
Password varchar20
create table Register(
	id int(8) primary key,
	username varchar(20),
	password varchar(20)
);

題目09

根據下表完成任務:(PK代表主鍵)

stuId(PK)  sName classId professional
IIIT001 zhangsan IIIT20501 software
IIIT002 lisi IIIT20501 software
IIIT003 wangwu IIIT20501 software
IIIT004 zhaoliu IIIT20501 software
表StudentInfo
1. 請找出stuId爲IIIT003的學生信息。
select *
from StudentInfo
where stuId="IIIT003";
2. 在字段stuId上創建索引。
create unique index stuIndex ON StudentInfo(stuId);
3. 創建視圖查詢學生的stuId和sName。
create view StuView
AS
select stuId, sName
from StudentInfo;
4. 創建存儲過程,通過輸入stuId對應的學生id號碼,輸出sName(學生姓名)。
-- 創建存儲過程
CREATE PROCEDURE pro_inid_out_sName
@stuIdvarchar(10),sNamevachar(10) OUTPUT
As
Begin
	Select @sName=sName 
	from StudentInfo
	where stuId=@stuId
end
-- 調用存儲過程
declare @sNamevarchar(10)
execute pro_inid_out_sName ‘IIIT001’,@sName output


全文完。轉載請註明出處。如有不對之處請在留言板中指正。

參考文獻

王珊. 數據庫系統概論,高等教育出版社.


發佈了52 篇原創文章 · 獲贊 17 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章