圖解 SQL,這也太形象了吧!
公眾號(hào)關(guān)注“杰哥的IT之旅”, 選擇“星標(biāo)”,重磅干貨,第一時(shí)間送達(dá)!

作者:?不剪發(fā)的Tony老師
來源:CSDN
鏈接:https://blog.csdn.net/horses/article/details/104553075

作者:?不剪發(fā)的Tony老師
來源:CSDN
鏈接:https://blog.csdn.net/horses/article/details/104553075
作者:?不剪發(fā)的Tony老師
來源:CSDN
鏈接:https://blog.csdn.net/horses/article/details/104553075
本文介紹關(guān)系數(shù)據(jù)庫的設(shè)計(jì)思想:在 SQL 中,一切皆關(guān)系。
在計(jì)算機(jī)領(lǐng)域有許多偉大的設(shè)計(jì)理念和思想,例如:
在 Unix 中,一切皆文件。
在面向?qū)ο蟮木幊陶Z言中,一切皆對(duì)象。
關(guān)系數(shù)據(jù)庫同樣也有自己的設(shè)計(jì)思想:在 SQL 中,一切皆關(guān)系。
關(guān)系模型

關(guān)系模型中的數(shù)據(jù)結(jié)構(gòu)就是關(guān)系表,包括基礎(chǔ)表、派生表(查詢結(jié)果)和虛擬表(視圖)。 常用的關(guān)系操作包括增加、刪除、修改和查詢(CRUD),使用的就是 SQL 語言。其中查詢操作最為復(fù)雜,包括選擇(Selection)、投影(Projection)、并集(Union)、交集(Intersection)、差集(Exception)以及笛卡兒積(Cartesian product)等。 完整性約束用于維護(hù)數(shù)據(jù)的完整性或者滿足業(yè)務(wù)約束的需求,包括實(shí)體完整性(主鍵約束)、參照完整性(外鍵約束)以及用戶定義的完整性(非空約束、唯一約束、檢查約束和默認(rèn)值)。
面向集合
?在關(guān)系數(shù)據(jù)庫中,關(guān)系、表、集合三者通常表示相同的概念。
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;
-- PostgreSQLSELECT *FROM upper('sql');| upper ||-------||???SQL?|

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

ORDER BY 用于對(duì)查詢的結(jié)果進(jìn)行排序,示意圖如下:

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

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

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

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

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

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

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

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

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

?其他類型的連接還有半連接(SEMI JOIN)、反連接(ANTI JOIN)。
SELECT department_idFROM departmentsUNIONSELECT 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);-- OracleINSERT INTO test(id)(SELECT 1 AS id FROM DUALUNION ALLSELECT 2 FROM DUALUNION ALLSELECT?3?FROM?DUAL);
SELECT *FROM (VALUES(1),(2),(3))?test(id);
如果您覺得這篇文章對(duì)您有點(diǎn)用的話,麻煩您為本文來個(gè)四連:轉(zhuǎn)發(fā)分享、點(diǎn)贊、點(diǎn)在看、留言,因?yàn)檫@將是我寫作與分享更多優(yōu)質(zhì)文章的最強(qiáng)動(dòng)力!
本公眾號(hào)全部博文已整理成一個(gè)目錄,請(qǐng)?jiān)诠娞?hào)后臺(tái)回復(fù)「m」獲取!
推薦閱讀:
1、13000字!最常問的MySQL面試題集合
2、SQL 語法速成手冊(cè)
3、MySQL 常用優(yōu)化指南,及大表優(yōu)化思路都在這了!
4、一款 SQL 自動(dòng)檢查神器!
5、史上最全 SQL 優(yōu)化方案
6、萬字長文 SQL 語句大全,所有的 SQL 都在這里了。
7、【建議收藏】寫給程序員的 MySQL 面試高頻 100 問!
8、超全面的 MySQL 優(yōu)化面試解析
9、有了這 4 款工具,老板再也不怕我寫爛SQL了
10、一款跨平臺(tái)免費(fèi)的開源 SQL 編輯器和數(shù)據(jù)庫管理器! 關(guān)注微信公眾號(hào)「杰哥的IT之旅」,后臺(tái)回復(fù)「1024」查看更多內(nèi)容,回復(fù)「加群」備注:地區(qū)-職業(yè)方向-昵稱?即可加入讀者交流群。
推薦閱讀:
2、SQL 語法速成手冊(cè)
3、MySQL 常用優(yōu)化指南,及大表優(yōu)化思路都在這了!
4、一款 SQL 自動(dòng)檢查神器!
5、史上最全 SQL 優(yōu)化方案
6、萬字長文 SQL 語句大全,所有的 SQL 都在這里了。
7、【建議收藏】寫給程序員的 MySQL 面試高頻 100 問!
8、超全面的 MySQL 優(yōu)化面試解析
9、有了這 4 款工具,老板再也不怕我寫爛SQL了
10、一款跨平臺(tái)免費(fèi)的開源 SQL 編輯器和數(shù)據(jù)庫管理器!
點(diǎn)個(gè)[在看],是對(duì)杰哥最大的支持!
評(píng)論
圖片
表情

