SQL是結構化查詢語言(Structure Query Language)的縮寫,它是使用關係模型的數據庫(RDBMS)應用語言。html
在1970年代初,由IBM公司San Jose,California研究實驗室的Edgar Frank Codd(又稱Ted Codd)發表將數據組成表格的應用原則(Codd's Relational Algebra)。1974年,同一實驗室的D.D.Chamberlin和R.F. Boyce對Codd's Relational Algebra在研製關係數據庫管理系統System R中,研製出一套規範語言-SEQUEL(Structured English Query Language),並在1976年11月的IBM Journal of R&D上公佈新版本的SQL(叫SEQUEL/2)。1980年更名爲SQL。
1979年ORACLE公司首先提供商用的SQL,IBM公司在DB2和SQL/DS數據庫系統中也實現了SQL。 1
Ted Codd是絕對的數據庫開創者,以relation model
得到1981年圖靈獎。咱們在關係模型中的Boyce-Codd Normal From
(介於第三範式和第四範式)也來自於他的名字。mysql
System R
在數據庫歷史上也絕對的重要。特別是看書的時候不斷被提起。sql
1986年10月,美國ANSI採用SQL做爲關係數據庫管理系統的標準語言(ANSI X3. 135-1986),後爲國際標準化組織(ISO)採納爲國際標準。
1989年,美國ANSI採納在ANSI X3.135-1989報告中定義的關係數據庫管理系統的SQL標準語言,稱爲ANSI SQL 89,該標準替代ANSI X3.135-1986版本。該標準爲下列組織所採納:
國際標準化組織(ISO),爲ISO 9075-1989報告「Database Language SQL With Integrity Enhancement」
美國聯邦政府,發佈在The Federal Information Processing Standard Publication(FIPS PUB)127
當前,全部主要的關係數據庫管理系統支持某些形式的SQL,大部分數據庫至少遵照ANSI SQL89標準。
ANSI SQL92標準在交叉鏈接(cross join)和內部鏈接之上,新增長了外部鏈接,並支持在FROM子句中寫鏈接表達式。支持集合的並運算、交運算。支持Case (SQL)表達式。支持CHECK約束。建立臨時表。支持cursor。
支持事務隔離。 1
咱們這一篇文章採用PostgreSQL的SQL語法。重點咱們關注select...from...where
這種讀操做,分析query (analytical query)。
數據集在 https://hyper-db.de/interface... 能夠直接使用。另外在這個網頁不容許進行寫操做:insert
, update
, delete
之類的transactional query。固然create table
和drop table
也不被容許。數據庫
架構 Schema: api
下載:
https://db.in.tum.de/teaching...架構
Schma和大部分SQL語句來自Prof. Alfons Kemper, Ph.D.的課件和書。spa
課件:3d
書: https://db.in.tum.de/teaching...code
select persnr, name from professoren where rang = 'C4'
select persnr, name, rang from professoren order by rang desc, name asc
select distinct rang from professoren
select p.name, v.titel from professoren p, vorlesungen v where p.persnr = v.gelesenvon and titel = 'Maeeutik'
select s.name, v.titel from studenten s, hoeren h, vorlesungen v where s.matrnr = h.matrnr and h.vorlnr = v.vorlnr
(select name from assistenten) union (select name from professoren)
-- correlated sub-query select p.name from professoren p where not exists( select * from vorlesungen v where v.gelesenvon = p.persnr ) -- un-correlated sub-query -- not in: 集合的比較 select p.name from professoren p where p.persnr not in ( select v.gelesenvon from vorlesungen v )
-- correlated sub-query select s.name from studenten s where not exists( select * from hoeren h where h.matrnr = s.matrnr ) -- un-correlated sub-query -- not in: 集合的比較 select s.name from studenten s where s.matrnr not in ( select h.matrnr from hoeren h )
select s.name from studenten s where s.semester >= all ( select semester from studenten )
select avg(semester) from studenten
select v.gelesenvon, sum(v.sws) from vorlesungen v group by v.gelesenvon
select v.gelesenvon, p.name, sum(v.sws) from vorlesungen v, professoren p where v.gelesenvon = p.persnr and rang = 'C4' group by v.gelesenvon, p.name having avg(v.sws) >= 3
這裏須要注意一下aggregation operation。
對每個group都會生成一個tuple。因此對於帶有group by
子句的SQL
語句,select
子句裏面只能是group by
子句提到的屬性值和aggregation operation。orm
SELECT * FROM studenten WHERE semester >= 1 AND semester <= 4; SELECT * FROM studenten WHERE semester between 1 and 4; SELECT * FROM studenten WHERE semester in (1,2,3,4);
SELECT * FROM studenten WHERE name like 'T%eophrastos'; SELECT DISTINCT s.name FROM vorlesungen v, hoeren h, studenten s WHERE s.matrnr = h.matrnr AND h.vorlnr = v.vorlnr AND v.titel LIKE '%thik%';
case
:SELECT matrnr, (case when note <= 1.5 then 'sehr gut' when note <= 2.5 then 'gut' when note <= 3.5 then 'befriedigend' when note <= 4.0 then 'ausreichend' else 'nicht bestanden' end) FROM pruefen;
left outer join
:SELECT p.persnr, p.name, f.persnr, f.note, f.matrnr, s.matrnr, s.name FROM professoren p left outer join pruefen f left outer JOIN studenten s ON f.matrnr = s.matrnr ON p.persnr = f.persnr;
right outer join
:SELECT p.persnr, p.name, pf.persnr, pf.note, pf.matrnr, s.matrnr, s.name FROM professoren p right outer JOIN pruefen pf right outer JOIN studenten s ON pf.matrnr = s.matrnr ON p.persnr = pf.persnr;
full outer join
:SELECT p.persnr, p.name, pf.persnr, pf.note, pf.matrnr, s.matrnr, s.name FROM professoren p full outer JOIN pruefen pf full outer JOIN studenten s ON pf.matrnr = s.matrnr ON p.persnr = pf.persnr;