SQL程式設計思想
在計算機領域中有許多偉大的設計理念和思想;在Unix中,一切皆檔案;在面向物件的程式語言中,一切皆物件;在關係型資料庫中,一切皆關係。
一、SQL程式設計思想
關係模型
關係模型以集合論中的關係概念為基礎;無論是現實世界的實體物件還是它們之間的聯絡都用關係表示。我們在資料庫中看到的關係就是二維表,由行和列組成。所以可以說是關係表是由資料行構成的集合。
關係模型由資料結構、關係操作、完整性約束三部分組成:
- 資料結構:關係模型中的資料結構就是關係表,包括基礎表、派生表(查詢結果)和虛擬表(檢視)。
- 關係操作:增加、刪除、修改、和查詢,使用的就是SQL語言。其中查詢操作最為複雜,包括選擇、投影、並集、交集、差集以及笛卡爾積。
- 完整性約束:用於維護資料的完整性或者滿足業務約束的需求,包括實體完整性(主鍵約束)、參照完整性(外來鍵約束)以及使用者定義的完整性(非空約束、唯一約束、檢查約束和預設值)。
面向集合
SQL是操作關係資料庫的標準語言。我們通常只需要說明想要的結果,而將資料處理的過程交給資料庫管理系統。SQL是一種面向集合的程式語言,它的操作物件是集合,操作的結果也是集合。(在關係資料庫中,關係、表、集合三者通常表示相同的概念)
SELECT
select id,name,age,create_time from student;
select *
from (select id,name,age,create_time from student)t
第一個SQL的作用是從學生表中查詢學生資訊。from之後是一個表,不僅如此查詢結果也是一個表,我們可以將查詢的結果作為一個表使用,()內的內容被稱為派生表,指定了一個別名叫做t。
select字句用於指定需要查詢的欄位,可以包括表示式、函式值等。select在關係操作中被稱作為投影。選擇自己想要的結果重新組成一個集合。
where用於指定資料過濾的條件,在關係運算中被稱作為選擇。
order by用於對查詢的結果進行排序,總之,SQL可以完成各種資料操作,過濾、分組、排序、限定數量等,所有這些操作的物件是關係表,結果也是關係表。
分組GROUP BY
分組操作和其他的關係操作不同,因為它改變了關係的結構。
select max(id),max(name),age,count(*) from student group by age
分組的其他欄位,查詢時都需要套用函式欄位進行取值,否則出現多個值時不知道取哪個值,會出現報錯。所以,group by 改變了集合元素的結構,建立了一個全新的關係。
UNION
SQL面向集合特性最明顯的體現就是union、intersect、except/minus,這些集合運算子的作用都是將兩個集合併成一個集合,必須滿足一下條件:
- 兩邊的集合中欄位的數量和順序必須相同
- 兩邊的集合中對應欄位的型別必須匹配或者相容
集合操作運算子具體操作:
- union:計算兩個集合的並集,排除了結果中的重複資料
- union all:計算兩個集合的並集,保留了重複資料
- intersect:返回兩個集合中的共同部分,並且排除了結果中的重複資料
- except:返回出現在第一個結果集中,但不出現在第二個結果集中的記錄,並且排除了結果中的重複資料
- minus:返回出現在第一個結果集中,但不出現在第二個結果集中的記錄,並且排除了結果中的重複資料
- distinct:用於消除重複資料,排除集合中的重複元素
JOIN
在SQL中,不僅實體物件儲存在關係表中,物件之間的聯絡也儲存在關係表中。當我們需要獲取這些相關的資料時,需要使用到另外一個操作:連線查詢。
JOIN:連線查型別包括內連線、外連線、交叉連線等,外連線分為左外連線、右外連線以及全外連線:
- 內連線:返回兩個表中滿足連線條件的資料
- 左外連線:返回左表中所有的資料,對於右表,返回滿足連線條件的資料,如果沒有就返回空值
- 右外連線:返回右表中所有的資料,對於左表,返回滿足連線條件的資料,如果沒有就返回空值
- 全外連線:同時返回左表和右表中的所有資料,對於兩個表中不滿足條件的資料返回空值
- 交叉連線:笛卡爾積
DML
表示資料操作語言,也就是插入、更新和刪除。由於我們經常插入單條記錄,並沒有意思到實際上是以表為單位進行操作。update和delete語句都是以關係表尾單位的操作,只不過我們習慣說更新一行
資料或者刪除幾條記錄。