数据库基础day03

##最近开心的事太多了,感觉生活像一大碗糖豆~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 salary
1.03
(----)end

猜你喜欢

转载自blog.csdn.net/weixin_43782979/article/details/86621658