这里主要介绍几道题目用以更加深入的了解SQL语句。在工作面试时乃至在考研时,很多时候都会考到SQL语句。如果这篇文章中的所有的题目都搞明白了,那么应付工作面试笔试或者考研笔试将会更加的游刃有余。
来源:http://blog.csdn.net/ghuil/article/details/40981627
题目01
现有关系数据库如下:学生(学号,姓名,性别,专业,奖学金)
课程(课程号,名称,学分)
学习(学号,课程号,分数)
用SQL语言实现下列题目:
1. 检索不学课程号为“C135”课程的学生信息,包括学号,姓名和专业。
- select 学号, 姓名, 专业
- from 学生
- where 学号 NOT IN (
- select 学号
- from 学习
- where 课程号="C135");
- select 学号, 姓名, 专业
- from 学生
- where 学号 IN (
- select 学号
- from 学习 x, 学习 y
- where x.学号=y.学号 AND x.课程号='C135' AND y.课程号='C219');
- delete from 学生
- where 学号 IN (
- select 学号
- from 学习
- where 分数=0);
- 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 公司号;
- update 工作
- set 工资=工资+200
- where 职工号 IN (
- select 职工号
- from 职工
- where 年龄>=50);
- 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);
- select 学号, 姓名, 专业
- from 学生
- where 学号 NOT IN (
- select 学号
- from 学习
- where 分数<80);
- update 学生
- set 奖学金=1000
- where 奖学金<=0 AND 学号 IN (
- select 学号
- from 学习
- where 分数=100);
- 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';
- select Sno, Sname
- from SC, Course, Student
- where Course.Cno=SC.Cno AND Student.Sno=SC.Sno AND Cpno='8';
- -- 查询没有一门课程是该学生没有选的
- 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));
- select Sno, Sname
- from Student
- where Sno NOT IN (
- select Sno
- from SC
- where Cno='2');
- -- 本题未经验证,未必正确
- 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);
- 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;
- 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);
- -- 没有一门课程是该学生没有选修的
- 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#
- ));
- select C#, CN
- from C
- where C.C# NOT IN (
- select SC.C#
- from SC);
- select S#, count(C#), AVG(G)
- from SC
- group by S#
- having count(C#)>3;
- -- 首先删除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 |
1. 请找出stuId为IIIT003的学生信息。
- select *
- from StudentInfo
- where stuId="IIIT003";
- create unique index stuIndex ON StudentInfo(stuId);
- create view StuView
- AS
- select stuId, sName
- from StudentInfo;
- -- 创建存储过程
- 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
参考文献
王珊. 数据库系统概论,高等教育出版社.