在SQL领域,S2 SQL内部测试题涉及到一系列与数据库管理和数据查询相关的任务。这些任务主要集中在使用T-SQL(Transact-SQL)语言对学生成绩信息进行操作。以下是根据题目要求编写的T-SQL语句及其详细解释:
1) 查询各个学生语文、数学、英语、历史课程成绩:
```sql
SELECT MName AS '姓名',
(SELECT Score FROM Score WHERE MID = m.MID AND FName = '语文') AS '语文',
(SELECT Score FROM Score WHERE MID = m.MID AND FName = '数学') AS '数学',
(SELECT Score FROM Score WHERE MID = m.MID AND FName = '英语') AS '英语',
(SELECT Score FROM Score WHERE MID = m.MID AND FName = '历史') AS '历史'
FROM Member m;
```
这个查询使用了子查询来获取每个学生在指定课程的成绩。由于没有直接的关系连接,因此需要对每个课程单独进行子查询。
2) 查询四门课中成绩低于70分的学生及相对应课程名和成绩:
```sql
SELECT MName AS '姓名', FName AS '课程名', Score AS '成绩'
FROM Score s
JOIN Member m ON s.MID = m.MID
WHERE FName IN ('语文', '数学', '英语', '历史') AND Score < 70;
```
这个查询通过JOIN操作将`Score`表与`Member`表连接,然后筛选出四门课程中分数低于70的学生信息。
3) 统计各个学生参加考试课程的平均分,且按平均分数由高到低排序:
```sql
SELECT m.MID, MName, AVG(s.Score) AS '平均分'
FROM Member m
JOIN Score s ON m.MID = s.MID
GROUP BY m.MID, MName
ORDER BY '平均分' DESC;
```
这个查询首先通过JOIN操作合并两个表,然后使用GROUP BY对每个学生进行分组,并计算他们的平均分。使用ORDER BY按照平均分降序排列结果。
4) 创建存储过程,分别查询参加1、2、3、4门考试及没有参加考试的学生名单:
```sql
CREATE PROCEDURE GetStudentExamCount @examCount INT
AS
BEGIN
SELECT m.MID, MName
FROM Member m
WHERE (SELECT COUNT(*) FROM Score WHERE MID = m.MID) = @examCount;
END;
```
这个存储过程名为`GetStudentExamCount`,接受一个参数`@examCount`,表示学生参加的考试数量。在存储过程中,通过子查询计算每个学生在`Score`表中的记录数(即考试数量),然后筛选出满足条件的学生。要调用此存储过程,可以执行如下命令:
```sql
EXEC GetStudentExamCount 1;
EXEC GetStudentExamCount 2;
EXEC GetStudentExamCount 3;
EXEC GetStudentExamCount 4;
EXEC GetStudentExamCount 0; -- 查询没有参加考试的学生
```
以上SQL语句和存储过程均基于T-SQL编写,适用于SQL Server等支持T-SQL的数据库系统。它们展示了如何在实际环境中处理学生成绩信息,包括多表查询、聚合函数、子查询以及存储过程的创建和调用。