[SQL]基礎SQL

SQL簡介

SQL是結構化查詢語言(Structure Query Language)的縮寫,它是使用關係模型的數據庫(RDBMS)應用語言。html

SQL歷史

在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

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 tabledrop table也不被容許。數據庫

架構 Schema:
schema_deapi

schema_en

下載:
https://db.in.tum.de/teaching...架構

Schma和大部分SQL語句來自Prof. Alfons Kemper, Ph.D.的課件和書。spa

課件:3d

書: https://db.in.tum.de/teaching...code

基礎SQL

  • 搜索全部rang是C4的教授:
select persnr, name
from professoren
where rang = 'C4'
  • 對全部的教授先對rang倒序排序,再對name正序排序:
select persnr, name, rang
from professoren
order by rang desc, name asc
  • 獲得professoren的rank的全部可能:
select distinct rang
from professoren
  • 搜索開Maeeutik這個課的教授:
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
  • 搜索assistenten的name和professoren的name的並集:
(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
    )
  • 搜索semester最大的學生:
select s.name
from studenten s
where s.semester >= all (
    select semester
    from studenten
    )
  • 求得studenten的平均semester:
select avg(semester)
from studenten
  • 搜索每個教授上的課的SWS的各自總和:
select v.gelesenvon, sum(v.sws)
from vorlesungen v
group by v.gelesenvon
  • 搜索有rank C4的professoren中上課總SWS超過3的professoren:
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

  • 比較的syntax sugar(語法糖)
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;

  1. SQL 維基百科. https://zh.wikipedia.org/wiki...
相關文章
相關標籤/搜索