數據庫基礎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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章