score表里有学生s_id,课程c_id字段,我想查询到s_id为1的学生的所有课程,然后找到和s_id为1的学生所选课程全部都一样的学生的s_id
时间: 2024-03-18 12:42:10 浏览: 10
好的,根据您的描述,您可以使用如下SQL语句来实现您的需求:
```sql
SELECT T2.s_id
FROM
(SELECT c_id
FROM score
WHERE s_id = 1) T1
JOIN
(SELECT s_id, c_id
FROM score) T2
ON T1.c_id = T2.c_id
GROUP BY T2.s_id
HAVING COUNT(DISTINCT T2.c_id) = (SELECT COUNT(DISTINCT c_id) FROM score WHERE s_id = 1)
AND T2.s_id != 1;
```
以上SQL语句中,首先我们使用一个子查询查询到s_id为1的学生所选的所有课程,然后再使用一个JOIN操作将score表中所有学生的选课情况与该子查询结果进行比较,只有在两者选课情况完全一致时才会被统计到结果中。最后,我们使用HAVING子句过滤掉s_id为1的学生,并且只保留选课情况与s_id为1的学生完全一致的学生。
相关问题
查询"01"课程比"02"课程成绩高的学生的信息及课程分数. 学生信息表为student,有学生s_id,班级s_class字段。分数表有学生s_id,班级s_class,分数s_score字段
可以使用以下 SQL 语句来查询"01"课程比"02"课程成绩高的学生的信息及课程分数:
```
SELECT s.s_id, s.s_class, s_score
FROM student s
JOIN score sc1 ON s.s_id = sc1.s_id AND sc1.course = '01'
JOIN score sc2 ON s.s_id = sc2.s_id AND sc2.course = '02'
WHERE sc1.s_score > sc2.s_score
```
其中,使用 JOIN 子句将学生表和分数表连接起来,同时使用两个 JOIN 子句分别连接"01"课程和"02"课程的分数,然后使用 WHERE 子句筛选出"01"课程成绩高于"02"课程的学生信息。最后,使用 SELECT 子句选择需要的学生信息和课程分数。
查询所有学生的出生年份及至2019-01-01时的年龄; 查询所有课程中的最高分、最低分、平均分和及格率,按课程id升序输出。 Student表结构: 字段名 说明 s_id 学生id s_name 学生姓名 s_birth 学生生日 s_sex 学生性别 Course表结构: 字段名 说明 c_id 课程id c_name 课程名 Score表结构: 字段名 说明 s_id 学生id c_id 课程id s_score 学生成绩
查询所有学生的出生年份及至2019-01-01时的年龄的 SQL 查询语句如下:
```
SELECT s_birth AS birth_year, YEAR('2019-01-01') - YEAR(s_birth) AS age FROM Student;
```
查询所有课程中的最高分、最低分、平均分和及格率,按课程id升序输出的 SQL 查询语句如下:
```
SELECT c_id, MAX(s_score) AS max_score, MIN(s_score) AS min_score, AVG(s_score) AS avg_score,
COUNT(CASE WHEN s_score >= 60 THEN 1 ELSE NULL END)/COUNT(*) AS pass_rate
FROM Score
GROUP BY c_id
ORDER BY c_id ASC;
```
上述 SQL 语句中,`Student` 表包含学生信息,`Course` 表包含课程信息,`Score` 表包含学生成绩信息。
注意,以上查询语句仅供参考,具体实现可能需要根据具体数据库的语法进行调整。