SQL查询的基本结构由三个子句构成:selct、from和where
查询的输入是在from子句中列出的关系,在这些关系上进行where和select子句中指定的运算,然后产生一个关系作为结果。
单关系查询
select
使用大学数据库的例子做一个简单查询:找出所有老师的名字
老师的名字可以在instructor关系中找到,因此我们把该关系放到from子句中。教师的名字出现在name属性中,因此我们把它放到select子句中
select name
from instructor;
现在考虑另外一个查询:找出所有教师所在的系名
select dept_name
from instructor;
因为一个系里有多个教师,所以在instructor关系中,一个系的名称可以出现不止一次。上述的查询结果是一个包含系名的关系,会有重复
如果我们想强行删除重复,可以在select后加入关键词distinct,例如
select distinct dept_name
from instructor;
在上述查询的结果中,每个系名最多只出现一次
SQL允许我们使用关键词all来表示不去除重复:
select all dept_name
from instructor;
事实上all是一个默认选项,可以不用加上all
+ - * /
select子句还可带含有+ - * / 运算符的算术表达式,运算对象可以是常数或元组的属性
例如,查询
select ID,name,dept_name,salary*1.1
from instructor;
这里将salary的值乘以来1.1倍。这显示了如果我们给每位教师增长10%的工资的结果。注意这并不会导致instructor关系的任何变化
where子句
where子句允许我们只选出那些在from子句点结果关系中满足特定谓词的元组。考虑查询:找出所有在Computer Science系并且工资超过7万美元的教师的名字
select name
from instructor
where dept_name = 'Comp.Sci.' and salary >70000;
多关系查询
到此为止我们的查询示例都是基于单个关系的。通常查询需要从多个关系中获取信息。
如果我们想:找出所有教师的姓名,以及他们所在系的名称和系所在建筑的名称
考虑instructor关系的模式,我们发现可以从dept_name属性得到系名,但是系所在建筑的名称是在depatment关系中的building属性中给出的
为了回答查询,instructor关系中的每个元组必须与depatment关系中的元组匹配。后者在dept_name上的取值相配于instructor元组在dept_name上的取值
select name,instructor.dept_name,building
from instructor,deptment
where instructor.dept_name=department.dept_name;
注意dept_name属性即出现在instructor关系中,也出现在department中,关系名被用作前缀(在instructor.dept_name和department.dept_name中)来说明我们使用的是哪个属性。相反,因为属性name和building只出现在一个关系中,因而不需要把关系名作为前缀