以学生课程为例子,原题取自课本,教材等,自己的思路练习,简化后为对应知识点
S(sno,sname,ssex,sage,sdept) 学号,姓名,性别,年龄,专业
C(Cno,Cname,Cpno) 课程号,课程名,先行号
SC(sno,cno,grade)
1.查询有直接先行课的课程的课程号,课程名和先行课号
查询条件与空值有关:
Select Cno,Cname,Cpno
From C
Where Cpno is not null;
2.查询不在电子系和机械系学习的学生的学号和姓名
查询条件与确定集合有关:
Select Sno,Sname
From S
Where Sdept not in ('电子','机械');
3.查询年龄不在18-21之间的数学系的学生的学号,姓名和年龄
查询条件涉及通配符使用与多重条件查询:
Select Sno, Sname,Sage
From S
Where Sdept='数学' And Sage not like [^18-21];
4.查询被计算机系全部学生都选修了的课程的课程号和课程名
查询条件涉及子查询,需要一步步分析,如果有数据库,可以尝试使用SQL进行新建查询
大小写可以从程序中得知,平时编写按个人习惯即可
SELECT C.Cno, C.Cname
FROM C
WHERE NOT EXISTS (
SELECT *
FROM S
WHERE S.Sdept='计算机'
AND NOT EXISTS (
SELECT *
FROM SC
WHERE SC.Sno=S.Sno AND SC.Cno=C.Cno
)
);
5.查询不在信息系学习的学生的学号,并对查询结果按照学号的降序排序
查询时涉及ORDER BY,其中升序:ASC(默认);降序:DESC:
SELECT Sno
FROM S
WHERE Sdept = '计算机'
ORDER BY Sno DESC;
6.统计各专业男生女生的人数
查询时涉及聚集函数:
SELECT Sdept, Ssex, COUNT(*) as 人数
FROM S
GROUP BY Sdept, Ssex;
/*另一种方法*/
SELECT Sdept,
SUM(CASE WHEN Ssex = '男' THEN 1 ELSE 0 END) AS 男生人数,
SUM(CASE WHEN Ssex = '女' THEN 1 ELSE 0 END) AS 女生人数
FROM S
GROUP BY Sdept;