创建一个数据库中,然后建表并写出题目所要求的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 '传入一个值'