用数据库代码查询每个学生的学号、姓名、课程号、成绩(包括没有成绩的学生)
时间: 2023-12-22 21:12:16 浏览: 226
你好!感谢您的提问。以下是答案:
SELECT 学生表.学号, 学生表.姓名, 选课表.课程号, 成绩表.成绩
FROM 学生表 LEFT JOIN 选课表 ON 学生表.学号 = 选课表.学号
LEFT JOIN 成绩表 ON 选课表.学号 = 成绩表.学号 AND 选课表.课程号 = 成绩表.课程号;
如果您有其他问题,请随时询问。感谢您的支持!
相关问题
(1)KC(课程表)(课程号 c_ID,课程名 c_Name,学分 c_Credit) (2)XS(学生表)(学号 s_ID,姓名 s_Name,所在系s_department,宿舍电话s_telephone) (3)XS_KC(学生选课表)(学号 s_ID,课程号 c_ID,成绩 score) 在 chaxun 数据库中进行如下查询,将代码保存在. sql 文件中。 (1) 在 KC 表中查询学分低于3分的课程信息,并按课程号升序排列。 (2) 在 XS _ KC 表中按学号分组汇总学生的平均分,并按平均分的降序排列。 (3) 在 XS _ KC 表中查询至少选修了2门课程的学生学号和姓名。 (4)查询成绩不及格的学生的基本信息。 (5)分别用子查询和连接查询,查询101号课程不及格的学生信息。 (6)在 XS 表中查询住在同一宿舍的学生信息,即其所住宿舍电话相同。 (7)查询 XS 表中所有的系名。 (8)查询有多少名同学选修了课程。 9)查询与杨颖同在一个系的同学姓名。 (10)查询选修课程的学生姓名、课程名和成绩。 (11)修改经管系电话号码为3615555。 (12)统计每门课程的选课人数和最高分。 (13)统计每个学生的选课门数和考试总成绩,并按选课门数的降序排列。 (14)查询有多少名同学没有选课。
以下是您提出的查询问题的 SQL 语句:
1. 在 KC 表中查询学分低于3分的课程信息,并按课程号升序排列。
```
SELECT c_ID, c_Name, c_Credit
FROM KC
WHERE c_Credit < 3
ORDER BY c_ID ASC;
```
2. 在 XS_KC 表中按学号分组汇总学生的平均分,并按平均分的降序排列。
```
SELECT s_ID, AVG(score) AS avg_score
FROM XS_KC
GROUP BY s_ID
ORDER BY avg_score DESC;
```
3. 在 XS_KC 表中查询至少选修了2门课程的学生学号和姓名。
```
SELECT XS.s_ID, XS.s_Name
FROM XS
INNER JOIN (
SELECT s_ID
FROM XS_KC
GROUP BY s_ID
HAVING COUNT(DISTINCT c_ID) >= 2
) AS T
ON XS.s_ID = T.s_ID;
```
4. 查询成绩不及格的学生的基本信息。
```
SELECT XS.s_ID, XS.s_Name, XS.s_department, XS.s_telephone
FROM XS
INNER JOIN XS_KC
ON XS.s_ID = XS_KC.s_ID
WHERE XS_KC.score < 60;
```
5. 分别用子查询和连接查询,查询101号课程不及格的学生信息。
使用子查询:
```
SELECT s_ID, s_Name
FROM XS
WHERE s_ID IN (
SELECT s_ID
FROM XS_KC
WHERE c_ID = '101' AND score < 60
);
```
使用连接查询:
```
SELECT XS.s_ID, XS.s_Name
FROM XS
INNER JOIN XS_KC
ON XS.s_ID = XS_KC.s_ID AND XS_KC.c_ID = '101' AND XS_KC.score < 60;
```
6. 在 XS 表中查询住在同一宿舍的学生信息,即其所住宿舍电话相同。
```
SELECT T1.s_ID, T1.s_Name, T1.s_department, T1.s_telephone, T2.s_ID, T2.s_Name, T2.s_department, T2.s_telephone
FROM XS AS T1
INNER JOIN XS AS T2
ON T1.s_telephone = T2.s_telephone AND T1.s_ID < T2.s_ID;
```
7. 查询 XS 表中所有的系名。
```
SELECT DISTINCT s_department
FROM XS;
```
8. 查询有多少名同学选修了课程。
```
SELECT COUNT(DISTINCT s_ID) AS num_students
FROM XS_KC;
```
9. 查询与杨颖同在一个系的同学姓名。
```
SELECT DISTINCT s_Name
FROM XS
WHERE s_department = (
SELECT s_department
FROM XS
WHERE s_Name = '杨颖'
);
```
10. 查询选修课程的学生姓名、课程名和成绩。
```
SELECT XS.s_Name, KC.c_Name, XS_KC.score
FROM XS_KC
INNER JOIN XS
ON XS_KC.s_ID = XS.s_ID
INNER JOIN KC
ON XS_KC.c_ID = KC.c_ID;
```
11. 修改经管系电话号码为3615555。
```
UPDATE XS
SET s_telephone = '3615555'
WHERE s_department = '经管系';
```
12. 统计每门课程的选课人数和最高分。
```
SELECT c_ID, COUNT(DISTINCT s_ID) AS num_students, MAX(score) AS max_score
FROM XS_KC
GROUP BY c_ID;
```
13. 统计每个学生的选课门数和考试总成绩,并按选课门数的降序排列。
```
SELECT s_ID, s_Name, COUNT(c_ID) AS num_courses, SUM(score) AS total_score
FROM XS_KC
INNER JOIN XS
ON XS_KC.s_ID = XS.s_ID
GROUP BY s_ID
ORDER BY num_courses DESC;
```
14. 查询有多少名同学没有选课。
```
SELECT COUNT(*) AS num_students
FROM XS
WHERE s_ID NOT IN (
SELECT DISTINCT s_ID
FROM XS_KC
);
```
设计一个程序,用于管理学生成绩信息,包含添加、编辑和查看学生信息的功能。使用sqlite数据库存储学生成绩信息,tkinter模块实现GUI界面。其中,学生信息包括学号、姓名和班级等基本信息;成绩信息包括课程名称、分数、排名等。可以通过界面输入学生成绩信息并保存到数据库中。可以查看所有已存储的学生成绩信息,并支持根据学号或姓名查询某个学生成绩进行编辑。同时,需要处理并提示用户可能出现的错误,例如重复的学生学号或非法的输入格式等。最后,在主窗口中加入统计每科成绩的均值、方差和及格率等功能,并在输出学生成绩信息时显示每个班级学生成绩的数量及及格率。
好的,这是一个比较复杂的项目,需要用到sqlite数据库和tkinter模块,以下是一些代码示例和实现思路。
## 数据库设计
首先,我们需要设计一个合适的数据库结构来存储学生成绩信息。我们可以设计两个表:一个是学生信息表,另一个是成绩信息表。其中,学生信息表包含学号、姓名和班级等基本信息;成绩信息表包含课程名称、分数、排名等。两个表之间可以通过学号进行关联,具体的数据库表结构如下:
### 学生信息表(students)
| 列名 | 类型 | 描述 |
| --- | --- | --- |
| id | INTEGER | 学号,主键 |
| name | TEXT | 姓名 |
| class | TEXT | 班级 |
### 成绩信息表(scores)
| 列名 | 类型 | 描述 |
| --- | --- | --- |
| id | INTEGER | 成绩ID,主键 |
| student_id | INTEGER | 学号,外键,关联学生信息表的id列 |
| course | TEXT | 课程名称 |
| score | REAL | 分数 |
| rank | INTEGER | 排名 |
## GUI界面设计
我们使用tkinter模块来实现GUI界面。主窗口包含添加、编辑和查看学生信息的功能,以及统计每科成绩的均值、方差和及格率等功能。具体的界面设计如下:
![学生成绩管理系统](https://img-blog.csdnimg.cn/20220216111040291.png)
## 代码实现
### 连接数据库
我们首先需要连接sqlite数据库,可以使用Python内置的sqlite3模块来完成。以下是连接数据库的代码示例:
```python
import sqlite3
# 连接数据库
conn = sqlite3.connect('students.db')
cursor = conn.cursor()
```
### 创建数据库表
我们需要在数据库中创建学生信息表和成绩信息表。可以使用以下的代码示例来创建表:
```python
# 创建学生信息表
cursor.execute('''
CREATE TABLE IF NOT EXISTS students (
id INTEGER PRIMARY KEY,
name TEXT,
class TEXT
)
''')
# 创建成绩信息表
cursor.execute('''
CREATE TABLE IF NOT EXISTS scores (
id INTEGER PRIMARY KEY,
student_id INTEGER,
course TEXT,
score REAL,
rank INTEGER,
FOREIGN KEY(student_id) REFERENCES students(id)
)
''')
```
### 添加学生信息
我们需要在GUI界面中添加学生信息,当用户点击“添加”按钮时,将表单中的数据保存到数据库中。以下是添加学生信息的代码示例:
```python
def add_student():
# 获取表单数据
id = int(id_entry.get())
name = name_entry.get()
class_ = class_entry.get()
# 检查学号是否已经存在
cursor.execute('SELECT * FROM students WHERE id = ?', (id,))
if cursor.fetchone() is not None:
messagebox.showerror("错误", "学号已经存在,请重新输入!")
return
# 将学生信息保存到数据库
cursor.execute('INSERT INTO students(id, name, class) VALUES (?, ?, ?)', (id, name, class_))
conn.commit()
messagebox.showinfo("提示", "添加成功!")
```
### 编辑学生信息
我们需要在GUI界面中编辑学生信息,当用户点击“编辑”按钮时,根据学号或姓名查询到对应的学生信息,并将表单中的数据更新到数据库中。以下是编辑学生信息的代码示例:
```python
def edit_student():
# 获取表单数据
id = int(id_entry.get())
name = name_entry.get()
class_ = class_entry.get()
# 检查学号是否已经存在
cursor.execute('SELECT * FROM students WHERE id = ?', (id,))
if cursor.fetchone() is None:
messagebox.showerror("错误", "学号不存在,请重新输入!")
return
# 更新学生信息到数据库
cursor.execute('UPDATE students SET name = ?, class = ? WHERE id = ?', (name, class_, id))
conn.commit()
messagebox.showinfo("提示", "更新成功!")
```
### 查询学生信息
我们需要在GUI界面中查询学生信息,当用户点击“查询”按钮时,根据学号或姓名查询到对应的学生信息,并将查询结果显示在表格中。以下是查询学生信息的代码示例:
```python
def search_student():
# 获取查询关键字
keyword = keyword_entry.get()
# 根据学号或姓名查询学生信息
cursor.execute('SELECT * FROM students WHERE id = ? OR name LIKE ?', (keyword, '%' + keyword + '%'))
rows = cursor.fetchall()
# 显示查询结果
result_tree.delete(*result_tree.get_children())
for row in rows:
result_tree.insert('', 'end', values=row)
```
### 添加成绩信息
我们需要在GUI界面中添加成绩信息,当用户点击“添加”按钮时,将表单中的数据保存到数据库中。以下是添加成绩信息的代码示例:
```python
def add_score():
# 获取表单数据
student_id = int(student_id_entry.get())
course = course_entry.get()
score = float(score_entry.get())
# 将成绩信息保存到数据库
cursor.execute('SELECT count(*) FROM scores WHERE student_id = ? AND course = ?', (student_id, course))
count = cursor.fetchone()[0]
if count > 0:
messagebox.showerror("错误", "该学生该课程成绩已存在,请勿重复添加!")
return
cursor.execute('INSERT INTO scores(student_id, course, score) VALUES (?, ?, ?)', (student_id, course, score))
conn.commit()
messagebox.showinfo("提示", "添加成功!")
```
### 统计成绩信息
我们需要在GUI界面中统计每科成绩的均值、方差和及格率等信息。以下是统计成绩信息的代码示例:
```python
def calculate_statistics():
# 统计每个班级的学生数量和及格率
cursor.execute('''
SELECT class, COUNT(*), AVG(score), VAR_POP(score), SUM(CASE WHEN score >= 60 THEN 1 ELSE 0 END) / COUNT(*)
FROM students JOIN scores ON students.id = scores.student_id
GROUP BY class
''')
rows = cursor.fetchall()
# 显示统计结果
statistics_text.delete('1.0', 'end')
statistics_text.insert('1.0', '班级\t学生数量\t平均分\t方差\t及格率\n')
for row in rows:
statistics_text.insert('end', '\t'.join(map(str, row)) + '\n')
```
## 完整代码
最后,我们将上面的代码示例整合成一个完整的程序。完整代码如下:
阅读全文