[SQL]常见数据库上机考试题

创建一个数据库中,然后建表并写出题目所要求的SQL语句:

student表:

字段名描述数据类型约束
sno学号12个字符宽主键
sname姓名10个字符宽
sex性别2个字符宽
age年龄整型
address住址50个字符宽
classno班级号5个字符宽

course表:

字段名描述数据类型约束
cno课程号10个字符宽主键
cname课程名20个字符宽
lecture学时整型
credit学分整型

sc表:

字段名描述数据类型约束
sno学号10个字符宽主键
cno课程号20个字符宽主键
score成绩整型

class表:

字段名描述数据类型约束
classno班级号5个字符宽主键
classname班级名称20个字符宽
monitor班长姓名10个字符宽

创建以上表结构:

/*数据表的创建*/
USE HNIST
GO

--①创建student表
CREATE TABLE student
(
--sno   学号  12个字符宽  主键
sno char(12) primary key,

--sname 姓名  10个字符宽  
sname char(10),

--sex   性别  2个字符宽
sex char(2),

--age   年龄  整型
age int,
    
--address   住址  50个字符宽  
address char(50),

--classno   班级号 5个字符宽   
classno char(5)

)
GO


--②创建course表
CREATE TABLE course
(
--cno   课程号 10个字符宽  主键
cno char(10) primary key,

--cname 课程名 20个字符宽  
cname char(20),

--lecture   学时  整型  
lecture int,

--credit    学分  整型
credit int, 

)
GO

--③创建sc表
CREATE TABLE sc
(

--sno   学号  10个字符宽  主键
sno char(10) not null,

--cno   课程号 20个字符宽  主键
cno char(20) not null,

--score 成绩  整型
score int,

primary key(sno,cno)    
)
GO

--④创建class表
CREATE TABLE class
(

--classno   班级号 5个字符宽   主键
classno char(5) primary key,

--classname 班级名称    20个字符宽  
classname char(20),

--monitor   班长姓名    10个字符宽  
monitor char(10)


--foreign key(dno) REFERENCES Dept_info(dno)
)
GO

注意题目答案都是我自己整理和编写的SQL语句若有瑕疵请私信指出,感激不尽

题目:

1、给sc表创建一个check约束,设置成绩在0-150分之间。给sc表的sno字段创建一个外键约束。

USE HNIST
GO
ALTER TABLE sc
ADD CONSTRAINT con CHECK(sc.score>0 and sc.score<150)

2、查询选修了课程号为”002”的课程且该课程成绩高于L.Toni的学生的学号和成绩。

–思路:先成绩->再学号->然后姓名

USE HNIST
GO

SELECT sno,score
FROM sc
WHERE cno='002' and score > 
(
        select score
        from sc 
        where cno='2' and sno=(
            select sno
            from student 
            where sname = 'L.Toni'
        )
);
go

3、查询和B选修的课程号为”006”的课程分数相同的学生学号和姓名。

–思路:嵌套的思维,按题目顺序从前到后(正常是从后到前),先通过名字和课程号找到成绩再套一层select找相同成绩,由于相同成绩不止一个所以给到的是in

USE HNIST

SELECT sc.sno,sname
FROM sc,student
WHERE  sc.sno = student.sno and cno = '006' and score in 
(
    select score
    from sc,student
    where sname = 'B' and cno = '006'
)

4、查询没有选修课程号为”009”的课程的学生学号和姓名。

思路:在课程号009内没有这位学生的

SELECT sno,sname
FROM student
WHERE sno not in (
    SELECT sno
    FROM SC
    WHERE cno = '009'
)

5.查询年龄大于女同学平均年龄的男同学的姓名和年龄。

USE HNIST
GO

SELECT sname,age
FROM student
WHERE sex = '男' and age >
(
    SELECT avg(age)
    FROM student
    WHERE sex = '女'
)

6、统计各门课程的平均成绩,要求输出课程号、课程名称和平均成绩。

SELECT classno,classname,AVG(score)
FROM class,sc
GROUP BY classno,classname

7、查询选修了”云计算”课程且成绩为90分以上的学生的学号与成绩。

–思路:sc表用于连接student和class表,使值不重复

USE HNIST
GO
SELECT student.sno,score
from student,sc,class
where student.sno = sc.sno and class.classno = SC.cno and  class.classname='云计算' and  score>90
go

8、查询选修了课程号为”001”的课程且成绩在80-90之间的学生的学号、姓名和成绩,并将成绩乘以系数0.85输出。

USE HNIST
GO
SELECT student.sno,sname,score*0.8 as 'score'
FROM SC,student
WHERE cno = '001' and score between 80 and 90;

9、创建一个存储过程,根据输入的学号显示学生的姓名、选修课程名、学分、学时和成绩。

USE HNIST
GO
CREATE PROCEDURE pr4 @number char(12)
as
select sname,classname,credit,lecture,score
from student join course  on student.classno = course.cno  and sno = @number ,class,sc
GO
--执行:
exec pr4 '传入一个值'

10、创建一个视图,显示各个学生的学号、姓名、家庭住址、选修课程号、选修课程名、学分和学时。

USE HNIST 
GO
CREATE VIEW v
as
select student.sno,sname,address,class.classno,cname,credit,lecture
from student,sc,class,course

11.查询B选修的课程中成绩最高的课程号和成绩。

USE HNIST
GO
SELECT cno,score
FROM SC
WHERE score = (
    SELECT MAX(score)
    FROM SC
    WHERE sno = (
        SELECT sno
        FROM student
        WHERE sname = 'B'
    )
)

12.查询选修了“大数据分析”课程且成绩超过该课程平均成绩的学生的学号和成绩。

–思路:依靠属性连接表,再进行筛选

USE HNIST
GO
SELECT sc.sno,score
FROM sc,student,class
where sc.sno = student.sno and sc.cno = class.classno and classname = '大数据分析' and score>(
                                                                        select avg(score)
                                                                        from sc
                                                                        where classname = '大数据分析'
)

13.查询选修了“大数据分析”课程的学生学号和成绩,按成绩降序排列,成绩相同则按学号升序排列。

USE HNIST
GO

SELECT sno,score
FROM sc,class
WHERE sc.cno = class.classno and classname = '大数据分析'
order by score asc,cno desc

14.查询”006”号课程成绩最高的学生学号、姓名和成绩。

USE HNIST
GO
SELECT sno,score
FROM sc
where score = (
    select max(score)
    from sc
    where cno = '006'
)

15.查询选修了学分为3分的课程的学生学号、姓名、课程名和成绩。

–思路:值对应

USE HNIST
GO
select student.sno,sname,classname,score
from course,student,class,sc
where course.cno = sc.cno and sc.cno = class.classno and sc.sno = student.sno and credit = '3'

16.创建存储过程,根据输入的课程名显示选修该课程的男学生的姓名、年龄和成绩。

–注意不要把存储过程命名为proc!

USE HNIST
go
create procedure pro @name char(10)
as 
select sname,age,score
from sc,student
where sc.sno = student.sno and classno = (
                            select classno
                            from class
                            where classname = @name
)
--执行:
exec pro '传入一个值'
    原文作者:Topus
    原文地址: https://www.jianshu.com/p/427168fc0e65
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞