一润歉、DDL
a) SQL Data Definition
SQL的基本數(shù)據(jù)類(lèi)型有char(n)、varchar(n)颈抚、int踩衩、smallint、numeric(p,d)、real,double precision驱富、float(n)等锚赤,int smallint real float依賴(lài)機(jī)器的精度
b) char(n)不夠的用空格補(bǔ)齊,比較兩個(gè)char(n)時(shí)會(huì)先補(bǔ)齊成一樣的長(zhǎng)度褐鸥;比較char和varchar時(shí)有的數(shù)據(jù)庫(kù)會(huì)先補(bǔ)齊线脚,但有的不會(huì),所以存儲(chǔ)字符串時(shí)最好都用varchar叫榕;
c)表結(jié)構(gòu)的定義:
類(lèi)似Create table department (dept_name varchar(20), budget numeric(12,2), primary key(dept_name));
定義表結(jié)構(gòu)的通用形式為:
Create table r
(A1, D1,
… ,
integrity-constraint1,
integrity-constraint2,
…);
常用的一致性約束類(lèi)型有:主鍵浑侥、外鍵、非空
二晰绎、集合運(yùn)算和null
a) 集合運(yùn)算包括并集union寓落、交集intersect、差集except寒匙。比如要查詢(xún)2009年秋季開(kāi)課的課程和2010年春季開(kāi)課課程分別為:
select course_id
from section
where semester=’Fall’ and year=2009
和
select course_id
from section
where semester=’Spring’ and year=2010
要得出兩個(gè)季度所有的課程可以用Union零如;使用intersect可以查找到兩個(gè)季度都開(kāi)課的課程躏将;而使用except可以得到第一個(gè)結(jié)果集中存在但第二個(gè)結(jié)果集不存在的內(nèi)容锄弱,這三種操作如果不需要去重,可以對(duì)應(yīng)使用union all, intersect all, except al祸憋。
b)Null
null與其它值類(lèi)型的算術(shù)運(yùn)算結(jié)果都為null会宪;
比較運(yùn)算中,1
AND :
true,unknown=unknown
false,unknown=false
unknown, unknown= unknown
OR:
true, unknown=true
false, unknown= unknown
unknown, unknown= unknown
NOT:
NOT unknown= unknown
三蚯窥、嵌套子查詢(xún)(Nested Subqueries)
子查詢(xún)是嵌套在另一個(gè)查詢(xún)中的select-from-where表達(dá)式掸鹅,用于對(duì)集合的成員資格進(jìn)行檢查以及對(duì)集合的比較。
a)檢查集合成員資格
比如前面用交集操作實(shí)現(xiàn)的查詢(xún)也可以寫(xiě)為:
select 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)
可見(jiàn)SQL實(shí)現(xiàn)同一查詢(xún)目的的方法可以是多樣的拦赠。
b)集合的比較
集合比較用到的寫(xiě)法有>some, >=some, =some, >all等巍沙,比如要查找比生物系中至少一位教師工資高的人,可以寫(xiě)為:
select distinct T.name
from instructor as T, instructor as S
where T.salary > S.salary and S.dept name = ‘Biology’
也可以使用>some的寫(xiě)法:
select name
from instructor
where salary > some (select salary
from instructor
where dept name = ‘Biology’);
c)空關(guān)系測(cè)試
可以用exist來(lái)測(cè)試關(guān)系中是否存在元組荷鼠,對(duì)應(yīng)還有not exist
前面要查詢(xún)的2009秋季和2010春季都開(kāi)課的課程句携,也可以寫(xiě)為:
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);
d)測(cè)試重復(fù)元組
使用unique來(lái)檢查關(guān)系中是否存在重復(fù)元組,對(duì)應(yīng)也有not unique允乐。比如要查找2009年秋季至多開(kāi)課一次的課程:
select T.course id
from course as T
where unique (select R.course id
from section as R
where T.course id= R.course id and R.year = 2009);
對(duì)于當(dāng)時(shí)沒(méi)開(kāi)課的課程矮嫉,因?yàn)榻Y(jié)果為empty,unique對(duì)empty的計(jì)算結(jié)果也是true
e)From子句中的子查詢(xún)
在from子句中也可以使用子查詢(xún)牍疏,因?yàn)槿魏蝧elect-from-where返回的結(jié)果都是關(guān)系蠢笋,所以可以在其上面繼續(xù)使用from子句。
查詢(xún)平均薪水超過(guò)42000的部門(mén)鳞陨,如果使用having子句可以是:
select dept name, avg (salary) as avg_salary
from instructor
group by dept name
having avg (salary) > 42000;
也可以采用From子查詢(xún)的方式:
select dept name, avg_salary
from (select dept name, avg (salary) as avg salary
from instructor
group by dept name)
where avg_salary > 42000;
同時(shí)還可以為from子查詢(xún)的的表和字段重命名:
select dept name, avg_salary
from (select dept name, avg (salary)
from instructor
group by dept name)
as dept_avg (dept name, avg_salary)
where avg salary > 42000;
f)With子句
with子句用來(lái)定義臨時(shí)關(guān)系昨寞,這個(gè)定義只對(duì)包含with子句的查詢(xún)有效。比如查詢(xún)擁有最多預(yù)算的部門(mén),可以使用子查詢(xún)援岩,但子查詢(xún)往往結(jié)構(gòu)復(fù)雜熟史、可讀性差,而使用with子句就會(huì)好很多:
with max budget (value) as
(select max(budget)
from department)
select budget
from department, max budget
where department.budget = max budget.value;
雖然with子句只能在緊接著的查詢(xún)中使用窄俏,但比子查詢(xún)方便的是蹂匹,它可以被多次使用。
g)標(biāo)量查詢(xún)
標(biāo)量查詢(xún)是指返回結(jié)果只是一個(gè)值的子查詢(xún)凹蜈,比如查詢(xún)每個(gè)部門(mén)的員工人數(shù):
select dept_name,
(select count(*)
from instructor
where department.dept_name = instructor.dept name)
as num instructors
from department;
由于使用了count限寞,這兒的子查詢(xún)結(jié)果只有一個(gè)值,雖然這仍然是一張表仰坦,但數(shù)據(jù)庫(kù)會(huì)自動(dòng)從表中取出值使用履植。標(biāo)量查詢(xún)可應(yīng)用于select, where, having等處。而且編譯時(shí)無(wú)法確保子查詢(xún)結(jié)果確實(shí)是一個(gè)值悄晃,如果不是玫霎,在運(yùn)行時(shí)會(huì)報(bào)錯(cuò)。
四妈橄、數(shù)據(jù)的修改
a)Insert
插入數(shù)據(jù)時(shí)可以直接使用select的結(jié)果庶近,但下面的寫(xiě)法會(huì)造成死循環(huán),插入無(wú)限多條:
insert into student
select *
from student;
而且數(shù)據(jù)庫(kù)產(chǎn)品一般會(huì)提供批量插入的方式眷蚓,用于快速地從格式化文本讀取并插入大批量的數(shù)據(jù)鼻种。
b)Update
更新數(shù)據(jù)時(shí)可以使用case when來(lái)區(qū)分不同的情況:
update instructor
set salary = case
when salary <= 100000 then salary * 1.05
else salary * 1.03
end
此外,set子句也可以使用子查詢(xún)
學(xué)習(xí)資料:Database System Concepts, by Abraham Silberschatz, Henry F.Korth, S.Sudarshan