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 HNISTGOALTER TABLE scADD 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,scorefrom student,sc,classwhere student.sno = sc.sno and class.classno = SC.cno and class.classname='云计算' and score>90go
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,scGO
--执行:exec pr4 '传入一个值'
10、创建一个视图,显示各个学生的学号、姓名、家庭住址、选修课程号、选修课程名、学分和学时。
USE HNIST GO CREATE VIEW v as select student.sno,sname,address,class.classno,cname,credit,lecturefrom 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,classwhere 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,classWHERE sc.cno = class.classno and classname = '大数据分析'order by score asc,cno desc
14.查询”006”号课程成绩最高的学生学号、姓名和成绩。
USE HNIST GO SELECT sno,score FROM scwhere score = ( select max(score) from sc where cno = '006')
15.查询选修了学分为3分的课程的学生学号、姓名、课程名和成绩。
--思路:值对应
USE HNIST GO select student.sno,sname,classname,scorefrom course,student,class,scwhere 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
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦