practice:sqlite更名运算实践
考虑查询
select name, course_id from instructor, teaches where instructor.id = teaches.id;
它的结果是一个具有属性 name,course_id 的关系,结果中的属性名来自 from 子句中关系的属性名
但是这样的手段会在更复杂的情况下遇到问题,① from 子句的两个关系中可能存在同名属性,这样结果里就会出现重复的属性名 ②如果我们在 select 子句中使用算术表达式,那么结果属性就没有名字 ③我们希望使用新的名称来取代原来的属性名
基于以上原因,sql 提供了一个重命名(rename)结果关系中的属性的方法,即使用 as 子句
old-name as new-name
as 子句即可以出现在 select 子句中,也可以出现在 where 子句中
例如,我们想用名字 instructor_name 来代替属性名 name,则可以重写上面的查询如下
sqlite> select name as instructor_name, course_id ...> from instructor, teaches ...> where instructor.id = teaches.id;
as 子句在重命名关系时非常管用,重命名关系的原因是把一个长的关系名替换成一个短的关系名,这样在查询的其他地方使用起来就很方便
重写查询,对于大学中所有讲授课程的教师,列出他们的姓名以及所讲述的所有课程标识
sqlite> select t.name, s.course_id ...> from instructor as t, teaches as s ...> where t.id = s.id; srinivasan|cs-101 srinivasan|cs-315 srinivasan|cs-347 wu|fin-201 mozart|mu-199 einstein|phy-101 el said|his-351 katz|cs-101 katz|cs-319 crick|bio-101 crick|bio-301 brandt|cs-190 brandt|cs-190 brandt|cs-319 kim|ee-181
重命名一个关系的另一个重要原因是为了适用于需要比较同一个关系中的元组的情况
在这种情况下,我们需要把一个关系跟它自身做笛卡尔积运算,如果不重命名,则不可能把一个元组与其他元组区分开来
考虑查询,找出满足以下条件的所有教师的姓名,他们的工资至少比 biology 系的某一个教师的工资要高,我们有
sqlite> select distinct t.name ...> from instructor as t, instructor as s ...> where t.salary > s.salary and s.dept_name = 'biology'; wu einstein gold katz singh brandt kim
注意上面的查询中不能使用 instructor.salary 这样的写法,因为指称不明
在上面的查询中,t 和 s 可以被认为是 instructor 关系的两份拷贝,但更准确地说是被声明为 instructor 关系的别名(alias)
类似于 t 和 s 这样被用来重命名关系的标识符在 sql 标准中被称作相关名称(correlation name),但通常也被称作表别名(table alias)或相关变量(correlation variable)或元组变量(tuple variable)
上述查询可以用更好的方式表达,找出工资比 biology 系教师的最低工资高的所有教师的姓名,我们使用前一种表达式因为它更符合我们现在学到的 sql 语法,但在后面的实践中将看到这种表达也可以用 sql 语法直观的表示