1. 创建SQL表

image
答案:
image

2. 查询语句

image

3. 授权语句

grant 权利(select,update,insert) on 表名 to 用户
image

4. 关系代数

image

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

5. 插入语句

image

6. 并运算

找出在2009年秋季开课,或者在2010年春季开课或两个学期都开课的所有课程
image

7. 交运算

找出在2009年秋季和2010年春季同时开课的所有课程
image

8. 差运算

找出在2009年秋季学期开课但不在2010年春季学期开课的所有课程
![image]
(https://img2023.cnblogs.com/blog/3315907/202311/3315907-20231112203159456-396652988.png)

9. 聚集函数avg+distinct

找出在2010年春季学期讲授一门课程的教师总数
(不论教师讲了几个课时段,都只算一次)
image

10. group by

找出每个系的平均工资
image
找出每个系(group by聚类)在2010年春季学期讲授一门课程(where限定条件)的教师人数
image
注意:如果使用了group by语句,需要保证出现在select语句中的属性,只能要么出现在group by中的属性,要么就在聚集函数的内部。
错误查询:
image
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
	)
)