附加的基本运算
更名运算
使用更名运算的理由:
- from子句中的几个关系中有同名的属性;
- select子句中使用了算术表达式,该结果属性没有名字;
- 讲一个长的关系名,替换成一个短的,方便操作;
- 比较同一个关系中的元组的情况;
- 没有理由,就想给它改个名字!!!
使用as 语句进行重命名运算
SQL中提供了一个重命名结果关系中属性的方法,使用如下的as子句:
old-name as new-name
as子句既可以出现在select子句中,也可以出现在from 子句中。
查询1. 一个普通的查询
select name, course_id
from instructor, teaches
where instructor.ID = teaches.ID;
结果是一个具有下列属性的关系:
name,course_id
查询2. 用名字instructor_name代替属性名name
select name as instructor_name, course_id
from instructor, teaches
where instructor.ID = teaches.ID;
结果是一个具有下列属性的关系:
instructor_name,course_id
查询3. 简化名称
select T.name,S.course_id
from instructor as T, teaches as S
where T.ID = S.ID;
查询4. 同关系查询
找出满足下面条件的所有教师的名字,他们的工资至少比Biology系某一个教师的工资要高。
select distinct T.name
from instructor as T, instructor as S
where T.salary > S.salary and S.dept_name = 'Biology';
S和T被认为是instructor的两个拷贝,更准确的说是被声明为instructor关系的别名。
S和T这样的标识符在SQL标准中被称作:
相关名称(correlation name) 或 表别名(table alias) 或 相关变量 (correlation variable) 或 元组变量(tuple variable)
字符串运算
SQL允许在字符串上有多种函数,例如:
upper(s),lower(s),trim(s)等。
不同的数据库系统提供的字符串函数集不同个,这里不列举。
like操作符
使用like操作符可以实现模式匹配:
* %
:匹配任意字符串
* _
: 匹配任意一个字符
例如:
* ‘Intro%’:
* ‘%comp%’:
* ‘_ _ _’:
查询5.like表达式
找出所在建筑物名称中包含子串‘Watson’ 的所有系名。
select dept_name
from department
where building like '%Watson%';
使用escape关键字定义转义字符
/*使用反斜杠(\)作为转义字符,
匹配所有以“ab%cd”开头的字符串*/
like 'ab\%cd%' escape '\'
/* 匹配所有以“ab\cd”开头的字符串 */
like 'ab\\cd%' escape '\'
可以使用not like 比较运算符搜寻不匹配项
select子句中的属性说明
星号“*” 可以用在select 子句中表示“所有的属性”。
查询6. 星号表示所有的属性
下面的查询中,instructor中所有的属性都被选中。
select instructor.*
from instructor, teaches
where instructor.ID = teaches.ID;
排列元组的显示次序
使用order by子句
查询7. order by 查询
按字母顺序列出在Physics系的所有教师
select name
from instructor
where dept_name = 'Physics'
order by name;
order by 默认使用升序(asc)。
我们可以使用desc表示降序。
查询8. 使用asc和desc
按salary的降序列出整个instructor关系,如果有几个教师的工资相同,将他们按照名字升序排列。
select *
from instructor
order by salary desc, name asc;
where子句谓词
between 谓词
between比较运算符来说明一个值小于或等于某个值,同时大于或等于另一个值
查询9. 可以取代查询10
找出工资在90000美元到100000美元之间的教师的姓名
select name
from instructor
where salary between 90000 and 100000;
查询10.
找出工资在90000美元到100000美元之间的教师的姓名
select name
from instructor
where salary <= 100000 and salary >=90000;
not between
使用方法类似于between
(v1,v2,…,vn)n维元组比较
SQL允许我们使用记号(v1,v2,…,vn)表示一个分量值分别为v1,v2,…,vn的n维元组。
在元组上可以运用比较运算符,按照字典顺序进行比较。例如:
(a1,a2) <= (b1,b2)在 a1 <= b1且a2 <= b2时为真。
查询11. 等价于查询12
查找Biology系讲授了课程的所有教师的姓名和他们所讲授的课程。
select name, course_id
from instrucotr,teaches
where instructor.ID = teaches.ID and dept_name = 'Biology';
查询12. 等价于查询11
select name, course_id
from instructor, teaches;
where (instructor.ID, dept_name) = (teaches.ID, 'Biology');