学生表t,字段学生id(sid)姓名(name),成绩表x,字段成绩id(scid)课程id(cid)学生id(sid)分数id(sc_val),课程表s,字段课程id(cid)课程名(cname),查询每位学生语文数学外语三门课程成绩的sql
时间: 2023-07-20 20:20:01 浏览: 138
可以使用以下 SQL 查询每位学生语文数学外语三门课程成绩:
```
SELECT t.sid, t.name,
MAX(CASE WHEN s.cname = '语文' THEN x.sc_val ELSE NULL END) AS '语文',
MAX(CASE WHEN s.cname = '数学' THEN x.sc_val ELSE NULL END) AS '数学',
MAX(CASE WHEN s.cname = '外语' THEN x.sc_val ELSE NULL END) AS '外语'
FROM t
INNER JOIN x ON t.sid = x.sid
INNER JOIN s ON x.cid = s.cid
GROUP BY t.sid, t.name;
```
这个查询使用了 `INNER JOIN` 将学生表、成绩表和课程表联结起来,然后使用 `CASE` 语句筛选出每位学生的语文、数学和外语成绩。最后按照学生的编号和姓名进行分组,得到每位学生语文数学外语三门课程成绩的结果。
相关问题
学生表(t_students)有字段:学生id(SID),姓名(SNAME),成绩表(t_scores)有字段:成绩id(SCID),课程id(CID)学生id(SID)分数(SC_VAL),课程表(t_corses)有字段:课程id(CID),课程名(CNAME),要求写出查询每个学生的总分数,排名的SQL,结果列为学生id,姓名,总分数,排名
好的,以下是查询每个学生的总分数,排名的SQL语句:
```
SELECT t_students.SID, t_students.SNAME, SUM(t_scores.SC_VAL) AS total_score,
(SELECT COUNT(DISTINCT total_scores.total_score)
FROM (SELECT SUM(SC_VAL) AS total_score
FROM t_scores GROUP BY SID) AS total_scores
WHERE total_scores.total_score >= SUM(t_scores.SC_VAL)) AS rank
FROM t_students
JOIN t_scores ON t_students.SID = t_scores.SID
GROUP BY t_students.SID, t_students.SNAME
ORDER BY total_score DESC;
```
解释一下这个SQL语句:
1. 首先使用了三张表的 JOIN 操作,将学生表、成绩表、课程表关联起来。
2. 使用了 SUM 函数计算每个学生的总分数,并在 SELECT 语句中给这个总分数起了个别名 total_score。
3. 在 SELECT 语句中使用了子查询,使用 COUNT 函数计算每个学生的排名。子查询中先计算出每个学生的总分数(使用了内部的 GROUP BY 语句),然后对这些总分数去重计算数量,就可以得到总分数排名。
4. 最后按照总分数降序排序,得到每个学生的总分数和排名。
希望对你有所帮助!
create table student( stuid bigint primary key identity(1,1),--用户id stuname varchar(30),--学生的真实姓名 stuxuehao varchar(30) not null unique,--学生的学号(默认为学生登录的用户名) stupasswd varchar(30) not null,--密码 stugrade varchar(30),--年级 stumajor varchar(30),--专业 stusex varchar(2) default '男',--性别 stuborn varchar(30),--出生日期 role varchar(30) default '学生', stuhometown varchar(30),--籍贯 ) --管理员信息表(管理员id,用户名,密码) create table manager( manid bigint primary key identity(1,1),--用户id manname varchar(30) not null unique,--用户名 role varchar(30) default '管理员', manpasswd varchar(30) not null,--密码 ) --课程表(课程id,课程名,学期,学时,老师id) create table class( claid bigint primary key identity(1,1),--课程id claname varchar(30),--课程名 term varchar(30),--学期 teacher varchar(30),--老师姓名 ) --上课时间的表 create table sctime( sctimeid bigint primary key identity(1,1),--上课时间id claid bigint constraint csctime_id references class(claid),--课程的id sctime varchar(30),--上课时间 location varchar(30),--上课地点 ) --选课表(选课id,课程id,学生id,成绩) create table sc( scid bigint primary key identity(1,1),--选课id stuid bigint constraint ssc_id references student(stuid),--课程的id claid bigint constraint scc_id references class(claid),--课程id grades bigint --成绩 )
这是一个SQL Server数据库中创建表的代码片段。具体来说,这段代码创建了五个表,分别是student(学生信息表)、manager(管理员信息表)、class(课程表)、sctime(上课时间表)和sc(选课表)。
在student表中,使用了bigint类型的stuid作为主键,使用了identity(1,1)作为自增长的方式;stuname、stuxuehao、stupasswd、stugrade、stumajor、stusex、stuborn、role和stuhometown分别表示学生的姓名、学号、密码、年级、专业、性别、出生日期、角色和籍贯。
在manager表中,使用了bigint类型的manid作为主键,使用了identity(1,1)作为自增长的方式;manname和manpasswd分别表示管理员的用户名和密码。
在class表中,使用了bigint类型的claid作为主键,使用了identity(1,1)作为自增长的方式;claname、term和teacher分别表示课程名、学期和老师姓名。
在sctime表中,使用了bigint类型的sctimeid作为主键,使用了identity(1,1)作为自增长的方式;claid表示课程的id,使用了外键关联到class表中的claid;sctime和location分别表示上课时间和上课地点。
在sc表中,使用了bigint类型的scid作为主键,使用了identity(1,1)作为自增长的方式;stuid和claid分别表示学生的id和课程的id,使用了外键关联到student表和class表中的stuid和claid;grades表示成绩。
阅读全文