SQL 查询语句 课程作业练习

数据库实验作业,一共二十道题,以下一一列出
仅作为个人的学习记录,欢迎交流指正。

写出下列查询语句:

1. 查询计算机系年龄在18~20之间且性别为“男”的学生的姓名、年龄

SELECT Sname,Sage
FROM STUDENT
WHERE SDEPT=‘计算机系’ AND SSEX=‘男’ AND Sage BEWTEEN 18 AND 20;

2. 查找姓王的同学的所有信息。

SELECT *
FROM STUDENT
WHERE Sname LIKE ‘王%;

3. 查找姓王的两个字的同学的所有信息。

SELECT *
FROM STUDENT
WHERE Sname LIKE ‘王____’;

4. 查询“C001”号课程的最高分和最低分。

SELECT MAX(Grade),MIN(Grade)
FROM SC
WHERE CNO=‘C001’;

5. 统计每门课程的选课人数和考试最高分。

SELECT COUNT(DISTINCT(SNO)) 人数,MAX(GRADE) 最高分
FROM SC
GROUP BY CNO;

6. 统计每个学生的选课门数和考试总成绩,并按选课门数升序显示结果。

SELECT SNO,COUNT(DISTINCT(CNO)) 选课门数,SUM(GRADE) 总成绩
FROM SC
GROUP BY SNO
DRDER BY COUNT(CNO);

7. 查询总成绩超过200分的学生,要求列出学号和总成绩。

SELECT SNO,SUM(GRADE) 总分
FROM SC 
GROUP BY SNO;
HAVING SUM(GRADE)>200;

8. 查询选课门数超过2门的学生的学号、平均成绩和选课门数。

错误代码:
忽视了两个表,加上course后需要注意count里的cno指代不明的问题
SELECT SNO,AVG(GRADE),COUNT(CNO)
FROM SC
HAVING COUNT(CNO)>2;
正确:

SELECT SNO,AVG(GRADE) 平均分,COUNT(COURSE.CNO) 选课门数
FROM SC,Course
WHERE SC.CNO=COURSE.CNO
GROUP BY SC.SNO
HAVING COUNT(COURSE.CNO)>2;

9. 查询选了“C002”课程的学生的姓名和所在系。

SELECT SNAME,SDEPT
FROM STUDENT
WHERE SNO IN (SELECT SNO FROM SC WHERE CNO=‘C002’);

10. 查询成绩80分以上的学生的姓名、课程号和成绩,并按成绩降序排列结果。

SELECT SNAME,SC.CNO,GRADE
FROM SC join STUDENT on sc.sno=student.sno
WHERE GRADE>80
ORDER BY GRADE DESC;

–另一种写法

	SELECT SNAME,SC.CNO,GRADE
	FROM SC ,STUDENT
	WHERE SC.SNO=STUDENT.SNO AND GRADE>80
	ORDER BY GRADE DESC;

这里当时运行的时候,from的两个表中间少了个逗号。
一直显示的问题,找了老半天。

11. 查询计算机系男生修了“VB”的学生的姓名和成绩。

SELECT SNAME,GRADE
FROM STUDENT,SC,COURSE
WHERE SC.SNO=STUDENT.SNO AND COURSE.CNO=SC.CNO AND SSEX=‘男’AND 
CNAME=‘VB’AND SDEPT=‘计算机系’) ;

12. 查询学生的选课情况,要求列出每位学生的选课情况(包括未选课的学生),并列出学生的学号、姓名、课程号和考试成绩。

SELECT STUDENT.SNO,SNAME,CNO,GRADE 
FROM STUDENT LEFT JOIN SC ON (STUDENT.SNO=SC.SNO)
--GROUP BY SC.SNO;

13. 查询哪些课程没有人选,要求列出课程号和课程名。

SELECT CNAME,COURSE.CNO
FROM COURSE LEFT JOIN SC ON COURSE.CNO=SC.CNO
WHERE SC.SNO IS NULL;
         外联接

14. 查询计算机系没有选课的学生,列出学生姓名。

SELECT SNAME
FROM STUDENT LEFT JOIN SC ON STUDENT.SNO=SC.SNO
WHERE SDEPT=‘计算机系’ AND SC.SNO IS NULL;   

15. 列出“高等数学”课程考试成绩前三名的学生的学号、姓名、所在系和考试成绩。

SELECT TOP 3 STUDENT.SNO,SNAME,SDEPT,GRADE
FROM STUDENT JOIN SC ON SC.SNO=STUDENT.SNO
WHERE CNAME=‘高等数学’
ORDER BYGRADE DESC;

这个用法是我第一次接触

16. 查询VB考试成绩最低的学生的姓名、所在系和VB成绩。

SELECT SNAME, SDEPT,MIN(GRADE)
FROM STUDENT,SC,COURSE
WHERE STUDENT.SNO=SC.SNO AND COURSE.CNO=SC.CNO AND CNAME=‘VB’;

17. 查询姓王和李的学生的考试情况学号,姓名和成绩。

SELECT distinct(student.SNO),SNAME,GRADE,sc.cno
FROM STUDENT join  SC on student.sno=sc.sno
WHERE SNAME like '王%' or sname like '李%';

错误代码:
SELECT SNO,SNAME,GRADE
FROM STUDENT,SC
WHERE STUDENT.SNO=SC.SNO AND SNAME IN
(SELECT SNO FROM STUDENT WHERE SNAME LIKE ‘王%’
OR SNAME LIKE ’李%’);
这地方用in是不对的

18. 查询“大学英语”课的选修情况,要求将查询结果放在一张新的永久表中,假设新表名为new_sc。

SELECT SNO,CNO,GRADE INTO NEW_SC
FROM SC,COURSE
WHERE SC.CNO=COURSE.CNO AND CNAME=’大学英语’;

19. 查询“C001”课程的选课人数,要求将查询结果放在一张局部临时表中,假设新表名为new_OS。

错误代码:
SELECT COUNT(CNO=‘C001’) AS 选课人数 INTO #NEW_OS
FROM SC;
不能在select中进行匹配,应该让where进行匹配
一直显示)旁有语法错误(?)

select count(cno) as 选课人数  into #new_sc
from sc
where cno='c001';

20. 分别查询信息管理系和计算机系的学生的姓名、性别、修课名称、修课成绩,并要求将这两个查询结果合并成一个结果集。

SELECT SNAME,SSEX,CNAME,GRADE
FROM SC,STUDENT,COURSE
WHERE SC,SNO=STUDENT.SNO AND COURSE.CNO=SC.CNO AND SDEPT=‘信息管理系’
UNION 
SELECT SNAME,SSEX,CNAME,GRADE
FROM SC,STUDENT,COURSE
WHERE SC,SNO=STUDENT.SNO AND COURSE.CNO=SC.CNO AND SDEPT=‘计算机系’;

“无法绑定由多个部分组成的标识符”
“指定了非布尔类型的表达式”
“选择列表中的列无效,因为该列没有包含在聚合函数或GROUP BY子句中”
以上三个是我翻历史记录找出来的遇到的问题,但准确对应哪些修改不记得了,放在这里仅供记录和参考,下次再碰到尽量详尽记录一下;

都是比较简单的代码,刚学不是很熟悉,也是花了不少时间

如果用于作业仅供参考哈,万一我们是同一个老师呢哈哈哈哈(不是)
在csdn查了那么久代码第一次自己发博客,排版重点什么的还不太会

  • 7
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值