8、select student.* from student left join (select s_id from score join (select c_id from course join teacher on course.t_id=teacher.t_id and t_name='张三')tmp2 on score.c_id=tmp2.c_id )tmp on student.s_id = tmp.s_id where tmp.s_id is null;关系代数表达式
时间: 2023-06-16 22:05:11 浏览: 137
这条 SQL 查询语句的关系代数表达式如下:
π<sub>student.*</sub> (student) - π<sub>tmp.s_id</sub> (σ<sub>tmp.s_id is not null</sub> (student ⨝<sub>s_id=s_id</sub> tmp))
其中,π 表示投影运算符,σ 表示选择运算符,⨝ 表示自然连接运算符,tmp 是一个子查询结果的别名,其代表的是选取该老师所教授的课程的成绩表中的学生 ID,然后与学生表进行左连接,最终选取左表中存在但右表中不存在的学生记录。
相关问题
我给你四张表,表结构是第一张表名称是student,字段是 s_id,s_name,s_birth,s_sex; 第二张表名称是teacher字段是t_id,t_name 第三张表名称是course,字段是 c_id,c_name,t_id; 第四张表名称是score,表字段是 s_id,c_id,s_score,根据以上表结构生成难度高的oracle sql题目及答案
假设四张表的表结构如下:
```
CREATE TABLE student (
s_id INT PRIMARY KEY,
s_name VARCHAR2(50),
s_birth DATE,
s_sex VARCHAR2(10)
);
CREATE TABLE teacher (
t_id INT PRIMARY KEY,
t_name VARCHAR2(50)
);
CREATE TABLE course (
c_id INT PRIMARY KEY,
c_name VARCHAR2(50),
t_id INT,
CONSTRAINT fk_teacher FOREIGN KEY (t_id) REFERENCES teacher(t_id)
);
CREATE TABLE score (
s_id INT,
c_id INT,
s_score INT,
CONSTRAINT pk_score PRIMARY KEY (s_id, c_id),
CONSTRAINT fk_student FOREIGN KEY (s_id) REFERENCES student(s_id),
CONSTRAINT fk_course FOREIGN KEY (c_id) REFERENCES course(c_id)
);
```
现在给出以下复杂的 Oracle SQL 题目和答案:
1. 查询每门课程的平均分和最高分,按照平均分从高到低排序。
答案:
```
SELECT c.c_id, c.c_name, AVG(s.s_score) AS avg_score, MAX(s.s_score) AS max_score
FROM course c
LEFT JOIN score s ON c.c_id = s.c_id
GROUP BY c.c_id, c.c_name
ORDER BY avg_score DESC;
```
2. 查询每个学生的平均成绩,按照平均成绩从高到低排序。
答案:
```
SELECT s.s_id, s.s_name, AVG(sc.s_score) AS avg_score
FROM student s
LEFT JOIN score sc ON s.s_id = sc.s_id
GROUP BY s.s_id, s.s_name
ORDER BY avg_score DESC;
```
3. 查询没有选修任何课程的学生的姓名和性别。
答案:
```
SELECT s.s_name, s.s_sex
FROM student s
LEFT JOIN score sc ON s.s_id = sc.s_id
WHERE sc.s_id IS NULL;
```
4. 查询同时选修了编号为 1 和编号为 2 课程的学生的姓名。
答案:
```
SELECT s.s_name
FROM student s
INNER JOIN score sc ON s.s_id = sc.s_id
WHERE sc.c_id IN (1, 2)
GROUP BY s.s_id, s.s_name
HAVING COUNT(DISTINCT sc.c_id) = 2;
```
5. 查询选修了所有课程的学生的姓名。
答案:
```
SELECT s.s_name
FROM student s
INNER JOIN score sc ON s.s_id = sc.s_id
GROUP BY s.s_id, s.s_name
HAVING COUNT(DISTINCT sc.c_id) = (SELECT COUNT(*) FROM course);
```
这些题目和答案都比较复杂,需要熟练掌握 SQL 查询和连接的知识才能解决。
假设有以下四个表: 学生表 Student:包含学生的学号和姓名。 课程表 Course:包含课程的编号和教师工号。 教师表 Teacher:包含教师的工号和姓名。 成绩表 score:包含学号、课程号 四个表联合查询 查询没学过"王二"老师讲授的任一门课程的学生姓
姓氏。
可以使用以下 SQL 语句进行查询:
```sql
SELECT DISTINCT LEFT(s.name, 1) as surname
FROM Student s
WHERE s.id NOT IN (
SELECT DISTINCT sc.id
FROM Student sc
JOIN score c ON sc.id = c.sid
JOIN Course co ON c.cid = co.id
JOIN Teacher t ON co.tid = t.id
WHERE t.name = '王二'
)
```
解释一下这个 SQL 语句:
首先从学生表 `Student` 中查询所有学生的姓名,使用 `LEFT(s.name, 1)` 取出姓氏的第一个字符。
然后使用 `NOT IN` 子句排除掉选过 "王二" 老师任课的学生,这个子句的内部查询涉及到了多个表的联合查询:
- 学生表 `Student`
- 成绩表 `score`
- 课程表 `Course`
- 教师表 `Teacher`
具体地,内部查询的过程是这样的:
1. 从学生表 `Student` 中查询所有学生的学号 `id`。
2. 通过成绩表 `score` 将选过课程的学生筛选出来,即查询所有成绩表中的学号 `sid`。
3. 通过课程表 `Course` 将选过 "王二" 老师教授的课程筛选出来,即查询所有课程表中的课程号 `cid`。
4. 通过教师表 `Teacher` 将 "王二" 老师的工号筛选出来,即查询教师表中的工号 `tid`。
5. 将上述四个表联合查询,找到所有选过 "王二" 老师任课的学生的学号。
6. 最后使用 `NOT IN` 子句将这些学生排除掉。
最终,查询结果是所有没有选过 "王二" 老师任课的学生的姓氏的第一个字符。
阅读全文