##最近开心的事太多了,感觉生活像一大碗糖豆~ok,go on
嵌套子查询
1、集合成员资格
in:测试元组是否是集合中的成员
not in:测试元组是否不是集合中的成员
将子查询嵌入where子句中示例:
select distinct course_id
from section
where semester = ‘Fall’ and year = 2009 and
(------)course_id in (select course_id
(------------------------)from section
(------------------------)where semester = 'Spring ’ and year =2010);
#查询09年秋季和10年春季同时开课的所有课程。
#in 和 not in 也能用于枚举集合。
select distinct name
from instructor
where name not in(‘Mozart’, ‘Einstein’);
2、集合的比较
some:至少比某一个要大用>some表示
=some等价于in,<>some不等价于not in
all:比所有的都大用>all表示
<>all等价于not in,=all不等价于in
#找出平均工资大于等于所有系平均工资的系
select dept_name
from instructor
group by dept_name
having avg(salary) >= all (select avg(salary)
(----------------------------------)from instructor
(----------------------------------)group by dept_name);
3、空关系测试
exists:非空时返回true,测试一个子查询结果中是否存在元组
#09年秋季和10年春季同时开课所有课程 的另一种写法:
select course_id
from section as S
where semester =‘Fall’ and year =2009 and
(-----)exists (select *
(--------------)from section as T
(--------------)where semester =‘Spring’ and year =2010 and
(-----------------------)S.course_id = T.course_id);
#上述查询说明,来自外层查询的表别名可以用在where子句的子查询中。使用了来自外层查询相关名称的子查询被称作相关子查询。
not exists:可以模拟集合包含操作
A包含B可以写成:not exists (B except A)
4、重复元组存在性测试
unique:测试在子查询结果中是否存在重复元组
#注意,unique在空集上返回真。
not unique:作用同上。
5、from子句中的子查询
可以把子查询嵌在外层from中。
在from子句中嵌套的子查询不能使用来自from子句其他关系的相关变量,用lateral作为前缀才行。
select name , salary, avg_salary
from instructor I1 , lateral(select avg(salary) as avg_salary
(--------------------------------)from instructor I2
(---------------------------------)where I2.dept_name = I1.dept_name);
#没有lateral子句的话,不能访问I1
6、with子句
with子句可以定义临时关系,这个定义只对包含with子句的查询有效。
#找出具有最大预算值的系
with max_budget(value) as
(select max(budget)
from department)
select budget
from department , max_budget
where department.budget = max_budget.value;
7、标量子查询
SQL允许子查询出现在返回单个值得表达式能够出现的任何地方,只要该子查询只返回包含单个属性的单个元组。
删除
只能删除整个元组,而不能只删除某些属性上的值。
delete from r
where p;
#p代表一个谓词,r代表一个关系
delete语句首先从r中找出所有使p为真的元组,然后把它们从r中删除。
如果省略where子句,则r中所有元组将被删除。
可以在where子句中进行嵌套。
#delete命令只能作用域一个关系。
插入
insert into 表名(属性1,属性2,属性3,属性4)
(---------)values (‘a’ ,‘ab’ ,1,3);
#如果在表名后不加属性值,就要以原本的默认属性的顺序按顺序插入
如果仅仅插入部分属性,余下的属性用null表示。
更新
update 表名
set salary = salary*1.05
where salary<70000;
case结构:
case
(----)when pred1 then result1
(----)when pred2 then result2
…
(----)else result
end
示例:
update instructor
set salary =case
(------)when salary<=100000 then salary1.05
(------)else salary1.03
(----)end