##最近開心的事太多了,感覺生活像一大碗糖豆~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