SQL在student表中通过birthday储存生日,求年龄大于男同学平均年龄的女同学的姓名cname和学号cno
时间: 2024-12-03 12:31:47 浏览: 3
SQL查询可以这样编写来满足您的需求:
```sql
SELECT cname, cno
FROM student
WHERE gender = '女'
AND birthday IS NOT NULL
AND DATEDIFF(CURRENT_DATE, birthday) > (
SELECT AVG(DATEDIFF(CURRENT_DATE, birthday))
FROM student
WHERE gender = '男'
)
```
解释一下这个查询:
1. `SELECT cname, cno`:选择我们想要的结果字段,即女生的姓名和学号。
2. `FROM student`:从学生表中查找信息。
3. `WHERE gender = '女'`:仅筛选出女性学生。
4. `AND birthday IS NOT NULL`:排除那些生日信息缺失的学生。
5. `AND DATEDIFF(CURRENT_DATE, birthday) > ...`:计算每个女生的年龄,并将其与男生的平均年龄做比较。如果当前日期与生日的差值大于男生的平均年龄差值,说明该女生的年龄大于平均年龄。
6. `(SELECT AVG(DATEDIFF(CURRENT_DATE, birthday)) ...)`: 这是一个嵌套查询,用于计算男生的平均年龄。
注意:这个查询假设`birthday`字段存储的是日期类型,`DATEDIFF`函数用于计算两个日期之间的差异。实际操作时,你需要根据数据库的具体语法和所使用的日期格式调整这个查询。
相关问题
以 Student、SC、Course 基本表为数据源,查询选修了全部课程的学生学号、姓名和专业。其中student数据源包括sno学号,sname姓名,ssex性别,birthday生日,en_time入学时间,specialty专业,grade年级;SC数据表包括sno学号,cno课程号,score成绩;course数据表包括cno课程号,cname课程名,classhour学时,credit学分,cpno先修课程,用SQL server实现
可以使用子查询和聚合函数(COUNT和SUM)来解决这个问题。以下是解决方案:
```
SELECT s.sno, s.sname, s.specialty
FROM student s
WHERE (SELECT COUNT(DISTINCT cno) FROM course) =
(SELECT COUNT(*) FROM SC WHERE SC.sno = s.sno)
```
解释:
1. 子查询 `(SELECT COUNT(DISTINCT cno) FROM course)` 用来计算课程总数。
2. 子查询 `(SELECT COUNT(*) FROM SC WHERE SC.sno = s.sno)` 用来计算每个学生选修的课程数。
3. `WHERE` 子句用来筛选出选修了全部课程的学生。
4. 最终结果中只显示学号、姓名和专业。
注意:如果有学生选修了同一门课程多次,需要使用 `DISTINCT` 关键字去重。
create TABLE Depts (Dno varCHAR(5) PRIMARY KEY, Dname varCHAR(20) NOT NULL ); create TABLE Students (Sno varCHAR(10), Sname varCHAR(20) NOT NULL, Sgender varCHAR(2), birthday date, Dno varCHAR(5), CONSTRAINT PK_Sno PRIMARY KEY(Sno), CONSTRAINT FK_Dno FOREIGN KEY(Dno) REFERENCES Depts ); create TABLE Courses (Cno varCHAR(6) PRIMARY KEY, Cname varCHAR(20), Pre_Cno varCHAR(6), Credits float ); CREATE TABLE Reports (Sno varchar(10), Cno varchar(6), Grade float CHECK(Grade>=0 and Grade<=100), PRIMARY KEY(Sno,Cno), CONSTRAINT Student_Report FOREIGN KEY(Sno) REFERENCES Students, CONSTRAINT Report_Course FOREIGN KEY(Cno) REFERENCES Courses ); 基于以上四个表,完成以下题目: (11) 查询选修全部课程的学生姓名,相当于查询这样的学生,没有一门课程是他不选的。 (12) 查询平均成绩大于等于黄河同学的平均成绩的学生的学号、姓名和平均成绩。 (13)查询每门课程获得最高分的同学的学号、姓名、课程名称和成绩,并按照最高成绩从高到低进行排序。
(11) 查询选修全部课程的学生姓名,相当于查询这样的学生,没有一门课程是他不选的。
```sql
SELECT S.Sname
FROM Students S
WHERE NOT EXISTS (
SELECT C.Cno
FROM Courses C
WHERE NOT EXISTS (
SELECT R.Cno
FROM Reports R
WHERE R.Cno = C.Cno AND R.Sno = S.Sno
)
)
```
(12) 查询平均成绩大于等于黄河同学的平均成绩的学生的学号、姓名和平均成绩。
```sql
SELECT S.Sno, S.Sname, AVG(R.Grade) AS avg_grade
FROM Students S, Reports R
WHERE S.Sno = R.Sno
GROUP BY S.Sno, S.Sname
HAVING AVG(R.Grade) >= (
SELECT AVG(R1.Grade)
FROM Students S1, Reports R1
WHERE S1.Sno = R1.Sno AND S1.Sname = '黄河'
GROUP BY S1.Sno, S1.Sname
)
```
(13)查询每门课程获得最高分的同学的学号、姓名、课程名称和成绩,并按照最高成绩从高到低进行排序。
```sql
SELECT S.Sno, S.Sname, C.Cname, R.Grade
FROM Students S, Courses C, Reports R
WHERE S.Sno = R.Sno AND C.Cno = R.Cno AND R.Grade = (
SELECT MAX(R1.Grade)
FROM Reports R1
WHERE R1.Cno = R.Cno
)
ORDER BY R.Grade DESC
```
阅读全文