更名运算
from子句中的两个关系中可能存在同名属性,除了使用前缀名之外,SQL也提供了一种重命名结果关系中属性的方法,即使用as子句:old_name as new_name
,as子句既可以出现在select子句中也可以出现在from子句中。
使用在select子句中,用于更改结果关系中属性的名字:
select name as instructor_name ,teaches_name
from instructor,teaches
where instructor.ID = teaches.ID
使用在from子句中,用于重命名关系,重命名关系的一个原因是可以将长的关系名替换成短的,方便在查询语句的其他地方使用:
select T.name,S.teaches_name
from instruct as T,teaches as S
where T.ID = S.ID
另一个原因是适用于需要比较同一个关系中的元组的情况,需要把关系与自身进行笛卡尔积运算,需要用重命名区分开:
select distinct T.name
from instructor as T,instructor as S
where T.salary > S.salary and S.dept_name = 'Biology';
在这个例子中,就不能使用instructor.salary
的写法,否则无法区别是引用哪一个instructor,T与S称为相关名称、表别名、相关变量、元组变量
字符串运算
-
SQL中使用单引号标识字符串,如果字符串中有单引号,那就用两个单引号字符来表示,比如
it's right
可表示为it''s right
-
SQL标准中,字符串上的相等运算是大小写敏感的
-
SQL允许字符串上有多种函数,如串联("||")、提取子串、计算字符串长度、大小写转换(
upper(s)
和lower(s)
)、去掉字符串后面空格(srim(s)
),等等
使用like
操作符来实现模式匹配:
- 百分号(%):匹配任意子串
- 下划线(_):匹配任意一个字符
- ’Intro%’:匹配任何以"Intro"打头的字符串
- ’%Comp%’:匹配任何包含"Comp"子串的字符串
- ’___’:匹配值含三个字符的字符串(这里是三个连着的下划线)
- ’___%’:匹配至少含三个字符的字符串
- 反斜线(****):转义字符,放在特殊字符前面转换为普通字符
like的使用:
select dept_name
from department
where building like '%Comp'
- SQL还允许
not like
搜索不匹配项,以及SQL:1999提供similar to
,有更强大的类似正则表达式的模式匹配能力,这里就不展开了
select子句中的属性说明
"*
"用来在select子句中表示所有的属性,select instructor.*
为instructor中的所有属性被选中,select *
则为from子句中所有属性被选中
排列元组的显示次序
order by
子句默认升序,可以用desc
表示降序,或用asc
表示升序:
select *
from instructor
order by salary desc,name asc;
where子句谓词
-
用
between
说明一个值≤某个值同时≥另一个值 可以用where salary between 90000 and 100000
取代salary <= 100000 and salary >= 90000
类似的,还有not between
运算符 -
SQL允许用记号(v1,v2,v3,…,vn)表示一个分量为v1,v2,v3,…,vn的n维元组,按字典顺序进行比较运算,如
(a1,a2)<=(b1,b2)
在a1<=b1且a2<=b2时为真
select name,course_id
from instructor,teaches
where (instructor.ID,dept_name) = (teaches.ID,'Biology');
select name,course_id
from instructor,teaches
where instructor.ID = teaches.ID and dept_name = 'Biology';
上述两个例子相等