1. 在 studentsdb 数据库中使用 SELECT 语句进行基本查询。
(1)在 student_info 表中,查询每个学生的学号、姓名、出生日期信息。
(2)查询 student_info 表学号为 0002 的学生的姓名和家庭住址。
(3)查询 student_info 表所有出生日期在 95 年以后的女同学的姓名和出生日期。
2. 使用 select 语句进行条件查询。
(1)在 grade 表中查询分数在 70-80 范围内的学生的学号、课程编号和成绩。
(2)在 grade 表中查询课程编号为 0002 的学生的平均成绩。
(3)在 grade 表中查询选修课程编号为 0003 的人数和该课程有成绩的人数。
(4)查询 student_info 的姓名和出生日期,查询结果按出生日期从大到小排序。
(5)查询所有姓名“张”的学生的学号和姓名。
3. 对 student_info 表,查询学生的学号、姓名、性别、出生日期及家庭住址,查询
结果先按照性别的由小到大排序,性别相同的再按学号由大到小排序。
4. 使用 GROUP BY 子句查询 grad
实验报告主要围绕数据库查询展开,涉及SQL语言中的SELECT语句及其相关子句的使用,包括基本查询、条件查询、GROUP BY、ORDER BY、UNION、嵌套查询和连接查询等。以下是具体的知识点详解:
1. **SELECT基本查询**:
- 在`student_info`表中,查询每个学生的学号、姓名、出生日期信息,可以使用如下SQL语句:
```sql
SELECT student_id, name, birth_date FROM student_info;
```
- 查询`student_info`表学号为0002的学生的姓名和家庭住址:
```sql
SELECT name, address FROM student_info WHERE student_id = '0002';
```
2. **SELECT条件查询**:
- 查询`grade`表中分数在70-80范围内的学生的学号、课程编号和成绩:
```sql
SELECT student_id, course_id, score FROM grade WHERE score BETWEEN 70 AND 80;
```
- 查询课程编号为0002的学生平均成绩:
```sql
SELECT AVG(score) FROM grade WHERE course_id = '0002';
```
- 查询选修课程编号为0003的人数和该课程有成绩的人数:
```sql
SELECT COUNT(DISTINCT student_id), SUM(CASE WHEN score IS NOT NULL THEN 1 ELSE 0 END)
FROM grade WHERE course_id = '0003';
```
- 查询`student_info`的姓名和出生日期,按出生日期降序排列:
```sql
SELECT name, birth_date FROM student_info ORDER BY birth_date DESC;
```
- 查询所有姓名为"张"的学生的学号和姓名:
```sql
SELECT student_id, name FROM student_info WHERE name = '张';
```
3. **ORDER BY与GROUP BY子句**:
- 对`student_info`表,按性别升序排序,性别相同的按学号降序排列查询学号、姓名、性别、出生日期及家庭住址:
```sql
SELECT student_id, name, gender, birth_date, address
FROM student_info
ORDER BY gender ASC, student_id DESC;
```
- 使用`GROUP BY`查询`grade`表中每个学生的平均成绩:
```sql
SELECT student_id, AVG(score) AS avg_score FROM grade GROUP BY student_id;
```
4. **UNION运算符**:
- 将`student_info`中姓"刘"和姓"张"的学生学号和姓名合并到一个结果集中:
```sql
SELECT student_id, name FROM student_info WHERE name LIKE '刘%'
UNION
SELECT student_id, name FROM student_info WHERE name LIKE '张%';
```
5. **嵌套查询**:
- 查找与"刘东阳"性别相同的所有学生姓名和出生日期:
```sql
SELECT name, birth_date FROM student_info WHERE gender = (SELECT gender FROM student_info WHERE name = '刘东阳');
```
- 使用`IN`子查询查找修过课程编号为0002和0005的学生学号、姓名和性别:
```sql
SELECT student_id, name, gender FROM student_info
WHERE student_id IN (SELECT student_id FROM grade WHERE course_id IN ('0002', '0005'));
```
- 使用`ANY`子查询查找学号为0001的学生分数高于0002号学生最低分数的课程编号和分数:
```sql
SELECT course_id, score FROM grade WHERE student_id = '0001' AND score > ANY (SELECT MIN(score) FROM grade WHERE student_id = '0002');
```
- 使用`ALL`子查询查找学号为0001的学生分数高于0002号学生最高成绩的课程编号和分数:
```sql
SELECT course_id, score FROM grade WHERE student_id = '0001' AND score > ALL (SELECT MAX(score) FROM grade WHERE student_id = '0002');
```
6. **连接查询**:
- 查询分数在80-90范围内的学生的学号、姓名、分数:
```sql
SELECT g.student_id, s.name, g.score
FROM grade g
JOIN student_info s ON g.student_id = s.student_id
WHERE g.score BETWEEN 80 AND 90;
```
- 使用INNER JOIN查询学习“数据库原理及应用”课程的学生学号、姓名、分数:
```sql
SELECT g.student_id, s.name, g.score
FROM grade g
INNER JOIN student_info s ON g.student_id = s.student_id
WHERE g.course_id = '数据库原理及应用';
```
- 查询每个学生所选课程的最高成绩,列出学号、姓名、最高成绩:
```sql
SELECT s.student_id, s.name, MAX(g.score) AS max_score
FROM student_info s
LEFT JOIN grade g ON s.student_id = g.student_id
GROUP BY s.student_id, s.name;
```
- 使用左外连接查询每个学生的总成绩,列出学号、姓名、总成绩,未选修课程的学生总成绩为空:
```sql
SELECT s.student_id, s.name, COALESCE(SUM(g.score), 0) AS total_score
FROM student_info s
LEFT JOIN grade g ON s.student_id = g.student_id
GROUP BY s.student_id, s.name;
```
- 添加数据到`grade`表后,使用右外连接查询所有课程的选修情况,列出课程编号、课程名称、选修人数:
```sql
SELECT c.course_id, c.course_name, COUNT(g.student_id) AS enrolled_students
FROM curriculum c
RIGHT JOIN grade g ON c.course_id = g.course_id
GROUP BY c.course_id, c.course_name;
```
通过这些实验,学生可以掌握SQL语言的基础查询技巧,包括单表查询、条件查询、聚合函数、排序和分组,以及更复杂的联合查询和连接查询,为实际数据库管理与数据分析工作奠定基础。
评论10