爲什麼學習SQL

自人類社會形成之日起,社會的運轉就在不斷地產生和使用各種信息(文獻、檔案、資料、數據等);在如今所謂的信息時代,由於計算機和互聯網的作用,信息的產生和使用達到前所未有的廣度和深度。如何管好和用好信息,是(而且將一直是)IT行業一塊重要的領域。
在過去幾十年中,關係數據庫一直在這一領域占主導地位,而建立在關係理論基礎之上的SQL也成爲數據庫領域的既定標準。

目前的數據存儲領域可稱爲三分天下:
a. 少量數據的存儲:
自定義數據文件或通用數據文件(單機數據庫),通過自定義接口或通用API訪問數據。如需要存儲數據的單機軟件或小型的動態網站。
b. 對一致性要求高的大量數據的存儲:
關係數據庫管理系統(RDBMS)。如各種傳統的信息系統(ERP、CRM、HRMS、MIS等)。
c. 對併發性要求高的大量數據的存儲:
NoSQL數據庫系統。如Web2.0網站的後臺數據系統。

以上,“狐假虎威”地借數據存儲的重要性來闡述了一番學習SQL的偉大意義。但重要的是,對SQL善於做什麼和不善於做什麼有個清楚的認識。




不久前整理了數據庫圖書ABC一文,對數據庫相關的參考資料作了粗略的分類。

對於初學者而言,可以結合着《數據庫系統概念(第5版)》一書和某個DBMS平臺的入門技術手冊練習,自行尋找或構思一個小需求,建一個數據庫,創建幾個表和視圖,練習寫查詢和修改語句。基礎理論和技術實踐可以相互促進。




單機數據庫(如sqlite、Access等,Excel也勉強可以算是)是應用於單個計算機的數據庫引擎,通常不具備網絡連接功能,適用於小型應用;程序部署時,一般只需要附帶數據文件即可。有時也稱作桌面數據庫。
服務器級數據庫(如Oracle、DB2、SQL Server、MySQL、PostgreSQL等)是具備網絡連接功能、可作爲單獨數據庫服務器的DBMS,適用於大型信息系統;程序部署時,需要專門安裝相應的DBMS,甚至要單獨進行數據庫服務器的架構設計。此類數據庫是我們討論的重點。


數據庫服務器是運行在一臺主機(Host)(或主機集羣)上的服務程序,維護着一個或多個數據庫,並通過網絡連接響應數據庫客戶端提交的SQL語句。
數據庫客戶端是向數據庫服務器發送查詢請求的應用程序,可能是DBMS的GUI管理界面或命令行應用程序,也可能是前端的Web服務器。數據庫客戶端和數據庫服務器可能是在同一臺主機上,但更多情況下則是位於不同的主機上,通過局域網訪問。

例如對於SQL Server來說,一個服務器實例(Instance)即是一個數據庫服務器,一臺主機上可以安裝多個服務器實例;而查詢分析器或SSMS、sqlcmd、以及連接數據庫服務器的IIS,都是數據庫客戶端。

比如你在SSMS中備份/還原/附加一個數據庫,或是通過xp_cmdshell執行一個命令程序,所操作的都是你所連接的數據庫服務器所在主機的文件,而不是你運行SSMS數據庫客戶端所在主機的文件。

一臺主機有時候會被稱作一臺(操作系統)服務器,而數據庫服務器和Web服務器都是運行在主機之上的應用服務器。它們都被稱作服務器,不要因此搞混了。

一個典型的基於SQL Server的網站系統的架構示例如下:
用戶瀏覽器(Web Client) <----> IIS(Web Server/DB Client) <----> SQL Server(DB Server)

2. 在where/on/having和if/case when中,只有True才使條件成立(即Unknown當作False來處理)。比如:
where column = value:表中column爲NULL的行永遠不會返回,即使value是NULL;
case value when NULL then XXX when ... end:XXX永遠不會執行,即使value是NULL;
if <Unknown> XXX else YYY end或case when <Unknown> then XXX else YYY end:這兩種情況下,YYY會執行。

3. 包含外鍵約束和Check約束的字段允許NULL(即約束只當條件爲False時出錯,Unknown是不管的)。
4. 包含唯一約束(unique index)的字段只允許一個NULL的行,再插入或更新該字段爲NULL的行會報字段重複的錯誤。
5. GROUP BY時,所有NULL被視爲一組。
6. ORDER BY時,所有NULL排在一起,但NULL排在非空值的前面(如SQL Server)還是後面(如Oracle),SQL標準未規定。
7. 聚集函數(SUM/AVG/MAX/MIN/COUNT)忽略NULL的行。
8. declare的變量,在未賦值之前爲NULL。
9. 與NULL處理相關的運算符和函數:
- IS NULL/IS NOT NULL:用這兩個運算符來判斷一個值是否爲NULL,而不是=或<>。
- ISNULL/COALESCE:取第一個非空值(注意兩個函數的數據類型轉換規則不同)。
- NULLIF(a,b):等價於CASE WHEN a = b THEN NULL ELSE a END。
來源:英超直播

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章