1、DDL
a) SQL Data Definition
SQL的基本數據類型有char(n)、varchar(n)、int、smallint、numeric(p,d)、real,double precision、float(n)等,int smallint real float依賴機器的精度
b) char(n)不夠的用空格補齊,比較兩個char(n)時會先補齊成同樣的長度;比較char和varchar時有的數據庫會先補齊,但有的不會,因此存儲字符串時最好都用varchar;
c)表結構的定義:
相似Create table department (dept_name varchar(20), budget numeric(12,2), primary key(dept_name));
定義表結構的通用形式爲:
Create table r
(A1, D1,
… ,
<integrity-constraint1>,
<integrity-constraint2>,
…);
經常使用的一致性約束類型有:主鍵、外鍵、非空
2、集合運算和null
a) 集合運算包括並集union、交集intersect、差集except。好比要查詢2009年秋季開課的課程和2010年春季開課課程分別爲:
select course_id
from section
where semester=’Fall’ and year=2009
和
select course_id
from section
where semester=’Spring’ and year=2010
要得出兩個季度全部的課程能夠用Union;使用intersect能夠查找到兩個季度都開課的課程;而使用except能夠獲得第一個結果集中存在但第二個結果集不存在的內容,這三種操做若是不須要去重,能夠對應使用union all, intersect all, except al。
b)Null
null與其它值類型的算術運算結果都爲null;
比較運算中,1<null的結果爲unknow,這樣除了「是」與「否」兩種邏輯結果,有多了一個unknow;AND, OR, NOT邏輯運算遇到unknow時的狀況依次爲:
AND :
true,unknown=unknown
false,unknown=false
unknown, unknown= unknown
OR:
true, unknown=true
false, unknown= unknown
unknown, unknown= unknown
NOT:
NOT unknown= unknown
3、嵌套子查詢(Nested Subqueries)
子查詢是嵌套在另外一個查詢中的select-from-where表達式,用於對集合的成員資格進行檢查以及對集合的比較。
a)檢查集合成員資格
好比前面用交集操做實現的查詢也能夠寫爲:
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)
可見SQL實現同一查詢目的的方法能夠是多樣的。
b)集合的比較
集合比較用到的寫法有>some, >=some, =some, >all等,好比要查找比生物系中至少一位教師工資高的人,能夠寫爲:
select distinct T.name
from instructor as T, instructor as S
where T.salary > S.salary and S.dept name = ‘Biology’
也可使用>some的寫法:
select name
from instructor
where salary > some (select salary
from instructor
where dept name = ‘Biology’);
c)空關係測試
能夠用exist來測試關係中是否存在元組,對應還有not exist
前面要查詢的2009秋季和2010春季都開課的課程,也能夠寫爲:
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)測試重複元組
使用unique來檢查關係中是否存在重複元組,對應也有not unique。好比要查找2009年秋季至多開課一次的課程:
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);
對於當時沒開課的課程,由於結果爲empty,unique對empty的計算結果也是true
e)From子句中的子查詢
在from子句中也可使用子查詢,由於任何select-from-where返回的結果都是關係,因此能夠在其上面繼續使用from子句。
查詢平均薪水超過42000的部門,若是使用having子句能夠是:
select dept name, avg (salary) as avg_salary
from instructor
group by dept name
having avg (salary) > 42000;
也能夠採用From子查詢的方式:
select dept name, avg_salary
from (select dept name, avg (salary) as avg salary
from instructor
group by dept name)
where avg_salary > 42000;
同時還能夠爲from子查詢的的表和字段重命名:
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子句用來定義臨時關係,這個定義只對包含with子句的查詢有效。好比查詢擁有最多預算的部門,可使用子查詢,但子查詢每每結構複雜、可讀性差,而使用with子句就會好不少:
with max budget (value) as
(select max(budget)
from department)
select budget
from department, max budget
where department.budget = max budget.value;
雖然with子句只能在緊接着的查詢中使用,但比子查詢方便的是,它能夠被屢次使用。
g)標量查詢
標量查詢是指返回結果只是一個值的子查詢,好比查詢每一個部門的員工人數:
select dept_name,
(select count(*)
from instructor
where department.dept_name = instructor.dept name)
as num instructors
from department;
因爲使用了count,這兒的子查詢結果只有一個值,雖然這仍然是一張表,但數據庫會自動從表中取出值使用。標量查詢可應用於select, where, having等處。並且編譯時沒法確保子查詢結果確實是一個值,若是不是,在運行時會報錯。
4、數據的修改
a)Insert
插入數據時能夠直接使用select的結果,但下面的寫法會形成死循環,插入無限多條:
insert into student
select *
from student;
並且數據庫產品通常會提供批量插入的方式,用於快速地從格式化文本讀取並插入大批量的數據。
b)Update
更新數據時可使用case when來區分不一樣的狀況:
update instructor
set salary = case
when salary <= 100000 then salary * 1.05
else salary * 1.03
end
此外,set子句也可使用子查詢
學習資料:Database System Concepts, by Abraham Silberschatz, Henry F.Korth, S.Sudarshan
數據庫