假设有以下四个表: 学生表 Student:包含学生的学号和姓名。 课程表 Course:包含课程的编号和教师工号。 教师表 Teacher:包含教师的工号和姓名。 成绩表 score:包含学号、课程号 四个表联合查询 查询没学过"王二"老师讲授的任一门课程的学生姓名
时间: 2024-05-14 18:19:09 浏览: 156
可以使用如下 SQL 语句进行联合查询:
```
SELECT DISTINCT Student.姓名
FROM Student, Course, Teacher, score
WHERE Student.学号 = score.学号
AND Course.课程号 = score.课程号
AND Course.教师工号 = Teacher.工号
AND Teacher.姓名 = '王二'
AND Student.姓名 NOT IN (
SELECT DISTINCT Student.姓名
FROM Student, Course, Teacher, score
WHERE Student.学号 = score.学号
AND Course.课程号 = score.课程号
AND Course.教师工号 = Teacher.工号
AND Teacher.姓名 = '王二'
)
```
其中,首先通过 `WHERE` 子句将四个表进行联合查询,并且限制教师姓名为 '王二'。然后,在子查询中查询出所有选过 '王二' 老师讲授的课程的学生姓名,最后在主查询中使用 `NOT IN` 子句将已选过该老师课程的学生排除掉,即可得到查询结果。
相关问题
模块化设计一个数据库模型,数据库设计要满足第三范式。通过模型创建数据库、表、表间关系。数据库中属性数据类型和约束要做到适合该属性。该数据库包括学生信息表(姓名、学号、出生地址、联系方式、性别)、成绩表(学号、课程号、成绩)、课程信息表(课程编号、课程名称、课程描述)、 教师信息表(姓名、工号、性别)。
好的,我可以帮你设计一个满足第三范式的数据库模型,包括四张表:学生信息表、成绩表、课程信息表和教师信息表。具体设计如下:
**学生信息表**
| 字段名 | 数据类型 | 约束 | 说明 |
| ----- | ------- | ---- | ---- |
| id | int | PRIMARY KEY | 学生ID |
| name | varchar(20) | NOT NULL | 学生姓名 |
| student_id | varchar(20) | UNIQUE, NOT NULL | 学号 |
| gender | varchar(2) | NOT NULL | 性别 |
| birth_address | varchar(100) | | 出生地址 |
| contact | varchar(20) | | 联系方式 |
**成绩表**
| 字段名 | 数据类型 | 约束 | 说明 |
| ----- | ------- | ---- | ---- |
| id | int | PRIMARY KEY | 成绩ID |
| student_id | varchar(20) | FOREIGN KEY | 学号 |
| course_id | varchar(20) | FOREIGN KEY | 课程编号 |
| score | int | | 成绩 |
**课程信息表**
| 字段名 | 数据类型 | 约束 | 说明 |
| ----- | ------- | ---- | ---- |
| id | int | PRIMARY KEY | 课程ID |
| course_id | varchar(20) | UNIQUE, NOT NULL | 课程编号 |
| name | varchar(20) | NOT NULL | 课程名称 |
| description | varchar(100) | | 课程描述 |
**教师信息表**
| 字段名 | 数据类型 | 约束 | 说明 |
| ----- | ------- | ---- | ---- |
| id | int | PRIMARY KEY | 教师ID |
| name | varchar(20) | NOT NULL | 教师姓名 |
| teacher_id | varchar(20) | UNIQUE, NOT NULL | 工号 |
| gender | varchar(2) | NOT NULL | 性别 |
这个模型满足了第三范式,因为每个字段都只包含单一的数据类型,并且每张表都只包含一个主键,其他字段都直接依赖于主键,没有产生冗余信息。现在我们可以根据这个模型创建数据库和表,并且建立表间关系。
注:具体的数据库创建过程和表间关系建立过程需要通过具体的数据库管理系统来完成,这里不做赘述。
Student-Course-SC数据库中 ·新生“张军”来校报到,(学号:200915121;姓名:张军;性别:男;所在系:cs;年龄:19),请将相关的信息插入到对应表中去。·删除信息系所有学生的选课记录。 ·将计算机系“王明”的1号课程成绩置为90。 职工-工资数据库 职工(工号,姓名,职务,部门) 工资表(工号,月份,基本工资,岗位津贴,交通补贴) 查询所有职工的姓名和5月份总收入 。将本月总收入低于1000元的职工的基本工资增加200元 •将工资表中记录清空
以下是对每个问题的解答:
1. 将新生“张军”来校报到,(学号:200915121;姓名:张军;性别:男;所在系:cs;年龄:19),请将相关的信息插入到对应表中去。
```
INSERT INTO Student (Sno, Sname, Ssex, Sage, Sdept) VALUES ('200915121', '张军', '男', 19, 'cs');
```
2. 删除信息系所有学生的选课记录。
```
DELETE FROM SC WHERE Cno IN (SELECT Cno FROM Course WHERE Cdept='信息');
```
3. 将计算机系“王明”的1号课程成绩置为90。
```
UPDATE SC SET Score=90 WHERE Sno IN (SELECT Sno FROM Student WHERE Sdept='计算机') AND Cno='1';
```
4. 查询所有职工的姓名和5月份总收入。
```
SELECT E.ename, SUM(S.salary + S.job_salary + S.transport_salary) AS TotalIncome
FROM Employee E, Salary S
WHERE E.eno=S.eno AND S.month='5'
GROUP BY E.ename;
```
5. 将本月总收入低于1000元的职工的基本工资增加200元。
```
UPDATE Salary SET basic_salary=basic_salary+200 WHERE month='5' AND (salary + job_salary + transport_salary) < 1000;
```
6. 将工资表中记录清空。
```
TRUNCATE TABLE Salary;
```
阅读全文