圖解 SQL 基礎知識
點擊關注上方“逆鋒起筆”,
設為“置頂或星標”,第一時間送達干貨 不剪發(fā)的Tony老師
https://blog.csdn.net/horses/article/details/104553075
本文介紹關系數(shù)據(jù)庫的設計思想:在 SQL 中,一切皆關系。
設為“置頂或星標”,第一時間送達干貨 不剪發(fā)的Tony老師
https://blog.csdn.net/horses/article/details/104553075
本文介紹關系數(shù)據(jù)庫的設計思想:在 SQL 中,一切皆關系。
在 Unix 中,一切皆文件。
在面向對象的編程語言中,一切皆對象。
關系模型

關系模型中的數(shù)據(jù)結構就是關系表,包括基礎表、派生表(查詢結果)和虛擬表(視圖)。 常用的關系操作包括增加、刪除、修改和查詢(CRUD),使用的就是 SQL 語言。其中查詢操作最為復雜,包括選擇(Selection)、投影(Projection)、并集(Union)、交集(Intersection)、差集(Exception)以及笛卡兒積(Cartesian product)等。 完整性約束用于維護數(shù)據(jù)的完整性或者滿足業(yè)務約束的需求,包括實體完整性(主鍵約束)、參照完整性(外鍵約束)以及用戶定義的完整性(非空約束、唯一約束、檢查約束和默認值)。
我們今天的主題是關系操作語言,也就是 SQL。本文使用的示例數(shù)據(jù)來源于https://blog.csdn.net/horses/article/details/86518676
面向集合
??在關系數(shù)據(jù)庫中,關系、表、集合三者通常表示相同的概念。
SELECT
SELECT?
employee_id,
first_name,
last_name,
hire_date
FROM?employees;
SELECT?*
??FROM?(SELECT?employee_id, first_name, last_name, hire_date
??????????FROM?employees) t;
-- PostgreSQL
SELECT?*
??FROM?upper('sql');
| upper |
|-------|
| SQL |

除了 SELECT 之外,還有一些常用的 SQL 子句。

ORDER BY 用于對查詢的結果進行排序,示意圖如下:

總之,SQL 可以完成各種數(shù)據(jù)操作,例如過濾、分組、排序、限定數(shù)量等;所有這些操作的對象都是關系表,結果也是關系表。

在這些關系操作中,有一個比較特殊,就是分組。
GROUP BY
SELECT?department_id, count(*), first_name
??FROM?employees
?GROUP?BY?department_id;

盡管如此,GROUP BY 的結果仍然是一個集合。
UNION
兩邊的集合中字段的數(shù)量和順序必須相同; 兩邊的集合中對應字段的類型必須匹配或兼容。

INTERSECT 操作符用于返回兩個集合中的共同部分,即同時出現(xiàn)在第一個查詢結果和第二個查詢結果中的數(shù)據(jù),并且排除了結果中的重復數(shù)據(jù)。INTERSECT 運算的示意圖如下:

EXCEPT 或者 MINUS 操作符用于返回兩個集合的差集,即出現(xiàn)在第一個查詢結果中,但不在第二個查詢結果中的記錄,并且排除了結果中的重復數(shù)據(jù)。EXCEPT 運算符的示意圖如下:

除此之外,DISTINCT 運算符用于消除重復數(shù)據(jù),也就是排除集合中的重復元素。
??SQL 中的關系概念來自數(shù)學中的集合理論,因此 UNION、INTERSECT 和 EXCEPT 分別來自集合論中的并集(∪\cup∪)、交集(∩\cap∩)和差集(?\setminus?)運算。需要注意的是,集合理論中的集合不允許存在重復的數(shù)據(jù),但是 SQL 允許。因此,SQL 中的集合也被稱為多重集合(multiset);多重集合與集合理論中的集合都是無序的,但是 SQL 可以通過 ORDER BY 子句對查詢結果進行排序。
JOIN

左外連接(Left Outer Join)返回左表中所有的數(shù)據(jù);對于右表,返回滿足連接條件的數(shù)據(jù);如果沒有就返回空值。左外連接的原理如下圖所示:

右外連接(Right Outer Join)返回右表中所有的數(shù)據(jù);對于左表,返回滿足連接條件的數(shù)據(jù),如果沒有就返回空值。右外連接與左外連接可以互換,以下兩者等價:
t1 RIGHT?JOIN t2
t2 LEFT?JOIN t1

交叉連接也稱為笛卡爾積(Cartesian Product)。兩個表的交叉連接相當于一個表的所有行和另一個表的所有行兩兩組合,結果的數(shù)量為兩個表的行數(shù)相乘。交叉連接的原理如下圖所示:

??其他類型的連接還有半連接(SEMI JOIN)、反連接(ANTI JOIN)。
SELECT?department_id
??FROM?departments
?UNION
SELECT?department_id
??FROM?employees;
SELECT?COALESCE(d.department_id, e.department_id)
??FROM?departments d
??FULL?JOIN?employees e ON?(e.department_id = d.department_id);
DML
CREATE?TABLE?test(id?int);
-- MySQL、SQL Server 等
INSERT?INTO?test(id) VALUES?(1),(2),(3);
-- Oracle
INSERT?INTO?test(id)
(SELECT?1?AS?id?FROM?DUAL
UNION?ALL
SELECT?2?FROM?DUAL
UNION?ALL
SELECT?3?FROM?DUAL);
SELECT?*
FROM?(
??VALUES(1),(2),(3)
) test(id);
逆鋒起筆是一個專注于程序員圈子的技術平臺,你可以收獲最新技術動態(tài)、最新內測資格、BAT等大廠的經驗、精品學習資料、職業(yè)路線、副業(yè)思維,微信搜索逆鋒起筆關注!

后臺回復關鍵字:編程資源,獲取23種編程視頻教程 后臺回復關鍵字:pdf,獲取經典電子版資料。 推薦閱讀
評論
圖片
表情
