统计每个系的男生人数和女生人数以及男生的最大年龄和女生的最大年龄。结果按系名的升序排序
时间: 2024-09-23 21:05:28 浏览: 69
这是一个涉及到数据库查询的问题,通常在处理结构化数据时会遇到类似需求。假设我们有一个学生表(students),其中包括字段如系名(department)、性别(gender)和年龄(age)。要统计每个系的男生和女生人数,以及他们的最大年龄,可以编写SQL查询如下:
```sql
SELECT department,
COUNT(CASE WHEN gender = '男' THEN 1 END) AS male_count,
COUNT(CASE WHEN gender = '女' THEN 1 END) AS female_count,
MAX(CASE WHEN gender = '男' THEN age END) AS max_male_age,
MAX(CASE WHEN gender = '女' THEN age END) AS max_female_age
FROM students
GROUP BY department
ORDER BY department ASC;
```
这个查询做了以下几件事:
1. 分组(GROUP BY department)依据系名。
2. 计算男生(male_count)和女生(female_count)的数量,使用CASE WHEN语句筛选性别。
3. 对每个性别计算最大年龄(max_male_age 和 max_female_age)。
4. 使用ORDER BY将结果按照系名升序排列。
相关问题
已知Student表(Sno,Sname,Sex, Sage, Dept),统计每个系姓'李'的男生人数和女生人数以及男生的最大年龄和女生的最大年龄。结果按系名的升序排序。
为了统计每个系姓为"李"的学生中,男生和女生的人数,以及男生和女生的最大年龄,并按照系名升序排列,你可以编写如下的SQL查询:
```sql
SELECT
Dept,
COUNT(CASE WHEN Sex = '男' THEN 1 ELSE NULL END) AS MaleCount,
COUNT(CASE WHEN Sex = '女' THEN 1 ELSE NULL END) AS FemaleCount,
MAX(CASE WHEN Sex = '男' THEN Sage ELSE NULL END) AS MaxMaleAge,
MAX(CASE WHEN Sex = '女' THEN Sage ELSE NULL END) AS MaxFemaleAge
FROM
Student
WHERE
Sname LIKE '李%'
GROUP BY
Dept
ORDER BY
Dept ASC;
```
这个查询做了以下几件事:
1. 通过`WHERE`子句筛选出姓"李"的学生。
2. 使用`CASE`表达式分别计数男生(`Sex = '男'`)和女生(`Sex = '女'`)的人数。
3. 对于男生和女生,计算其最大年龄。
4. 使用`GROUP BY`按系名(Dept)分组。
5. 最后使用`ORDER BY`对结果按系名的升序排序。
三个基本表结构如下: student(sno,sname,ssex,sdept,sage),Course(cno,cname,cpno credit) ,SC(sno,cno,grade).,用SQL语句完成以下操作: 1.查询姓“王”的男同学的人数; 2.查询信息系所有年龄不大于21岁的女生 3.查询不是“计算机系CS”和“数学系MS”学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列 4.查询每门课程的课程名及选修人数 5.统计每个系的男生人数和女生人数以及男生的最大年龄和女生的最大年龄。结果按系名升序排序。 6.查询平均分高于70分以上的学生修课门数和平均分 7.查询年龄大于女同学平均年龄的男学生姓名和年龄 8.查询选修了2号课程且成绩在90分以上的学生学号和姓名 9.查询选修了“计算机组成原理”课程的学生的姓名和成绩 10.查询和“张三”在同一个系的学生的学号和姓名 11.查询每个学生超过他选修课程平均成绩的课程号
1. 查询姓“王”的男同学的人数
```
SELECT COUNT(*) FROM student WHERE sname LIKE '王%' AND ssex = '男';
```
2. 查询信息系所有年龄不大于21岁的女生
```
SELECT * FROM student WHERE sdept = '信息系' AND ssex = '女' AND sage <= 21;
```
3. 查询不是“计算机系CS”和“数学系MS”学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列
```
SELECT * FROM student WHERE sdept NOT IN ('计算机系', '数学系') ORDER BY sdept ASC, sage DESC;
```
4. 查询每门课程的课程名及选修人数
```
SELECT cname, COUNT(*) FROM SC, Course WHERE SC.cno = Course.cno GROUP BY cname;
```
5. 统计每个系的男生人数和女生人数以及男生的最大年龄和女生的最大年龄。结果按系名升序排序。
```
SELECT sdept,
SUM(CASE WHEN ssex = '男' THEN 1 ELSE 0 END) AS male_num,
SUM(CASE WHEN ssex = '女' THEN 1 ELSE 0 END) AS female_num,
MAX(CASE WHEN ssex = '男' THEN sage ELSE 0 END) AS male_max_age,
MAX(CASE WHEN ssex = '女' THEN sage ELSE 0 END) AS female_max_age
FROM student
GROUP BY sdept
ORDER BY sdept ASC;
```
6. 查询平均分高于70分以上的学生修课门数和平均分
```
SELECT sno, sname, COUNT(*) AS course_num, AVG(grade) AS avg_grade
FROM SC
WHERE grade > 70
GROUP BY sno, sname
HAVING COUNT(*) > 0;
```
7. 查询年龄大于女同学平均年龄的男学生姓名和年龄
```
SELECT sname, sage FROM student WHERE ssex = '男' AND sage > (SELECT AVG(sage) FROM student WHERE ssex = '女');
```
8. 查询选修了2号课程且成绩在90分以上的学生学号和姓名
```
SELECT student.sno, sname FROM student, SC WHERE student.sno = SC.sno AND SC.cno = '2' AND SC.grade >= 90;
```
9. 查询选修了“计算机组成原理”课程的学生的姓名和成绩
```
SELECT student.sname, SC.grade FROM student, SC, Course WHERE student.sno = SC.sno AND SC.cno = Course.cno AND Course.cname = '计算机组成原理';
```
10. 查询和“张三”在同一个系的学生的学号和姓名
```
SELECT sno, sname FROM student WHERE sdept = (SELECT sdept FROM student WHERE sname = '张三') AND sname != '张三';
```
11. 查询每个学生超过他选修课程平均成绩的课程号
```
SELECT SC.sno, SC.cno FROM SC
WHERE SC.grade > (SELECT AVG(grade) FROM SC AS SC2 WHERE SC2.sno = SC.sno);
```