1. 创建SQL表

答案:

2. 查询语句

3. 授权语句
grant 权利(select,update,insert) on 表名 to 用户

4. 关系代数

- 题目声明了要用relational algbra(关系代数)。
- (b)这一条说明并不是所有顾客都有积分。有积分的顾客并没有全列在customer表中。所以如果要得到所有有积分的顾客,我们应该使用
顾客积分表左外连接顾客表
![image]()
5. 插入语句

6. 并运算
找出在2009年秋季开课,或者在2010年春季开课或两个学期都开课的所有课程

7. 交运算
找出在2009年秋季和2010年春季同时开课的所有课程

8. 差运算
找出在2009年秋季学期开课但不在2010年春季学期开课的所有课程
![image]
(https://img2023.cnblogs.com/blog/3315907/202311/3315907-20231112203159456-396652988.png)
9. 聚集函数avg+distinct
找出在2010年春季学期讲授一门课程的教师总数
(不论教师讲了几个课时段,都只算一次)

10. group by
找出每个系的平均工资

找出每个系(group by聚类)在2010年春季学期讲授一门课程(where限定条件)的教师人数

注意:如果使用了group by语句,需要保证出现在select语句中的属性,只能要么出现在group by中的属性,要么就在聚集函数的内部。
错误查询:

dept_name出现在group by子句中,所以正确,
salary虽然没有在group by子句中,但是在聚类函数avg内,所以正确,
ID既没有在group by子句中,也没有在聚类函数avg内,所以查询是错误的。
11. 比较查询
使用内连接
找出满足下面条件的所有教师的姓名,他们的工资至少比biology系的某个教师的工资高
select distinct(T.name) #注意使用distinct,因为可能教师A的工资比教师B,C,D的工资够高,可能会重复统计
from instructor as T ,instructor as S
where T.salary> S.salary and S.dept_name = 'biology'
使用子查询+大于+some
找出满足下面条件的所有教师的姓名,他们的工资至少比biology系的某个教师的工资高
select name
from instructor
where salary > some(
select salary
from instructor
where dept_name = 'biology'
)
使用子查询+大于+any
找出满足下面条件的所有教师的姓名,他们的工资比biology系的每个教师的工资都高
select name
from instructor
where salary > all(
select salary
from instructor
where dept_name = 'biology'
)
12. exist...except...
not except用于测试查询结果集中是否不存在元组
我们将关系A包含关系B写成not exists(B except A)
例子:查询选修了biology系开设的所有课程的学生ID和学生姓名
=>说明这个学生选修的课程必须包含biology系的所有课程,即B:查出biology系的所有课程id,A:查出学生选修的所有课程
这里是相关子查询(correlated subquery),即子查询的内容还需要参照父查询
select T.name,T.id
from student as T
where not exists (
(select course_id
from course
where dept_name = 'biology'
)
except
(select S.course_id
from takes as S
where S.ID = T.ID
)
)
