在sqlserver中统计已有学生选课的课程的课程号,选课人数,最高成绩,最低成绩
时间: 2024-10-15 22:15:16 浏览: 27
在SQL Server中,你可以使用以下查询来统计每个已选课程的课程号、选课人数以及该课程的最高分和最低分。假设我们有两个表,一个是`Courses`(存储课程信息),另一个是`Enrollments`(存储学生选课信息),其中`Courses`表有字段`CourseID`(课程号)和`MaxScore`, `MinScore`;`Enrollments`表有字段`StudentID`(学生ID)和`CourseID`。
```sql
SELECT
c.CourseID AS 课程号,
COUNT(e.CourseID) AS 选课人数,
c.MaxScore AS 最高成绩,
c.MinScore AS 最低成绩
FROM
Courses c
LEFT JOIN
Enrollments e ON c.CourseID = e.CourseID
GROUP BY
c.CourseID, c.MaxScore, c.MinScore;
```
这个查询通过左连接`Courses`表和`Enrollments`表,并按`CourseID`分组,计算每个课程的选课次数。同时,它从`Courses`表中获取每个课程的最高分和最低分,作为结果的一部分显示。
相关问题
sql server语句学生(学号,年龄,性别,系名) 课程(课号,课名,学分,学时) 选课(学号,课号,成绩) 根据上面基本表的信息定义一个存储过程,完成下面功能: 入口参数:学号 1 显示学生的选课信息 2 如果学生没选课,让他选1号课,插入一条选课记录,成绩为0 3 如果学生所有课都不及格,删掉该学生记录
好的,以下是存储过程的代码实现:
```
CREATE PROCEDURE GetStudentCourseInfo
(
@stuId INT
)
AS
BEGIN
-- 判断学生是否存在
IF NOT EXISTS(SELECT 1 FROM 学生 WHERE 学号 = @stuId)
BEGIN
PRINT '该学生不存在!'
RETURN
END
-- 1. 显示学生的选课信息
SELECT s.学号, s.年龄, s.性别, s.系名, c.课号, c.课名, c.学分, c.学时, x.成绩
FROM 学生 s
LEFT JOIN 选课 x ON s.学号 = x.学号
LEFT JOIN 课程 c ON x.课号 = c.课号
WHERE s.学号 = @stuId;
-- 2. 如果学生没选课,让他选1号课,插入一条选课记录,成绩为0
IF NOT EXISTS(SELECT 1 FROM 选课 WHERE 学号 = @stuId)
BEGIN
INSERT INTO 选课(学号, 课号, 成绩)
VALUES(@stuId, 1, 0)
PRINT '该学生未选课,已为其选修1号课程,成绩为0。'
END
-- 3. 如果学生所有课都不及格,删掉该学生记录
IF NOT EXISTS(SELECT 1 FROM 选课 WHERE 学号 = @stuId AND 成绩 >= 60)
BEGIN
DELETE FROM 学生 WHERE 学号 = @stuId
PRINT '该学生所有课程都不及格,已删除该学生记录。'
END
END
```
该存储过程有一个入口参数 @stuId,表示学生的学号。存储过程中,首先判断该学生是否存在,如果不存在,则输出提示信息并返回。接着,使用 LEFT JOIN 连接学生表、选课表和课程表,查询该学生的选课信息,并将结果输出。如果该学生没有选课,则插入一条选课记录,课程号为1,成绩为0,并输出提示信息。如果该学生所有课程都不及格,则删除该学生记录,并输出提示信息。
一个班级号对应多个课程号 用sqlserver写一个保证学生不能选修重复的课程,用触发器实现的代码
请注意,这是一个AI语言模型,它不会被保护法律职责。代码仅供参考,使用时请自行判断。
可以使用触发器来实现这个需求。下面是一份示例代码:
CREATE TRIGGER tr_StudentCourse
ON [dbo].[StudentCourse] -- 学生选课表名
FOR INSERT, UPDATE
AS
BEGIN
IF EXISTS (
SELECT 1 FROM inserted i
JOIN StudentCourse sc ON sc.ClassID = i.ClassID AND sc.CourseID = i.CourseID
WHERE sc.StudentID = i.StudentID
)
BEGIN
RAISERROR('学生已经选修该门课程!', 16, 1)
ROLLBACK
END
END
触发器将在插入或更新学生选课表时触发。通过JOIN操作和WHERE子句,可以找到与新选课信息相同的已有记录,如果存在,则抛出错误并回滚事务。
阅读全文