1、字符串运算
对字符串进行的最通常的操作是使用操作符like的模式匹配,使用两个特殊的字符来描述模式:
百分号(%):匹配任意子串
下划线(_):匹配任意一个字符
如:找出所在建筑名称中包含子串‘Watson’的所有系名
select dept_name
from department
‘%Watson%’;
2、为使模式中能够包含特殊字符,即%和_,SQL允许定义转义字符。在like比较运算中使用escape关键字来定义转义字符,
如:使用反斜线(\)作为转义字符
— like ‘ab\%cd%’escape ‘\’匹配所有以“ab%cd”开头的字符串
SQL还允许在字符串上有多种函数,例如串联(“||”)、提取子串、计算字符串长度、大小写转换(用upper(s)将字符串s转换为大写或用lower(s)将字符串s转换为小写)、去掉字符串后面的空格(使用trim(s))等等。
3、SQL还提供了一些对关系中元组显示次序的控制。order by子句就可以让查询结果中元组按排列顺序显示。例如:按字母顺序列出在Physics系的所有教师
select name
from instructor
‘Physics’
order by name;
子句默认使用升序。要说明排序顺序,可以用desc表示降序,用asc表示升序 如: order by salary desc ,name asc;
用降序,若salary相同那name升序显示。
4、重复
在关系模型的形式化数学定义中,关系是一个集合,所以重复的元组不会出现在关系中。但在实践中,包含重复元组的关系是有用的。
可以用关系运算符多重集版本来定义SQL查询的复本定义。在此定义几个关系代数运算符的多重集版本,已知多重集关系r1和r2
σp(r1):如果在r1中有元组t1的c1个复本,而且t1满足选择σp,那么有c1个t1的复本在σp(r1)中
∏A(r):对于r1中t1的每个复本,在∏A(r1)中都有一个∏A(t1)的复本与其对应,其中∏A(t1)表示单个元组t1的投影
r1 x r2:如果有c1个t1的复本在r1中且 有c2个t2的复本在r2中,那么有c1*c2个t1·t2元组的复本在r1 x r2中。
SQL中的select子句也支持关系代数运算符的多重集版本:σ 、∏、x
形如select A1,A2,……,An
from r1,r2,……,rm
where P;
的SQL查询等价于关系代数表达式(多重集版本):
∏A1,A2,……,An(σp(r1,r2,……,rm))
5、集合运算
SQL作业在关系上的union、intersect、except运算对应于数学集合论中的∩,U和-运算,这些运算和select子句不同,它们会自动去除重复,若想保留所有重复,必须在运算符后加上all。
假设一个元组在关系r中重复出现m次,在关系s中出现n次,那么这个元组将会重复出现:
在r union all s中,重复出现m+n次;
r intersect all s中,重复出现min(m,n)次;
r except all中,重复出现max(0,m-n)次。
| |
当m<n. 当m>n.
在Oracle中,支持union,union ALL,intersect和Minus;不支持Intersect ALL和Minus ALL,在SQL Server 2000中,只支持union和union ALL。