Skip to Content

SQL首部曲:NoSQL? No! SQL!

SQL首部曲:NoSQL? No! SQL!
Gordon Lau
2019-10-08

由本篇開始,接連四篇都是與SQL有關的文章,會想寫SQL的原因,是因為SQL在現今軟件開發及數據科學佔有舉足輕重之地位,卻總是在背後默默無名,從未見得到像其他新興技術之關注,有見及此,筆者決定介紹SQL之特點,順便破除一些對使用SQL上常有的誤解。

-- 一條SQL綜合本文目的!
SELECT * FROM sql_knowledge AS knowledge

    INNER JOIN public_understanding AS understanding 
        ON knowledge.id = understanding.sql_knowledge_id

    INNER JOIN my_understanding as my_understanding
        ON knowledge.id = my_understanding.knowledge_id

    WHERE knowledge.concept !=  understanding.concept
        AND knowledge.concept = my_understanding.concept

    ORDER BY understanding.created_at;

SQL是一個簡稱,讀音是Sequel或是S-Q-L(逐字母讀出),全名是Structured Query Language,中文是結構化查詢語言,最早出現時間非常早,時年為1974年,比大家熟知的元祖級程式語言C只是僅僅遲了兩年。假如你由上世紀七十年代開始,只會寫C及SQL,直至今時今日也沒有失業危機哦。而與C有所不同的是,SQL最開始時是基於一個稱為關聯模型的數學理論所開發,專為資料存取所發明,並非如C一樣設計作廣泛編程需要。

關聯模型圖解

Source

SQL本質上與其他程式語言不同,並非逐步指示電腦如何做(How to do),而是直接提出問題(Query),也就是直接向電腦提出要做甚麼(What to do)。由電腦自行決定如何在不同的Relation中,以最有效率,及準確之方法讀取答案(Output)。

用上面一句SQL作例,可見我無須表明如何讀取my_understandingpublic_understanding,只須寫出

SELECT * FROM sql_knowledge AS knowledge

    INNER JOIN public_understanding AS understanding 
        ON knowledge.id = understanding.sql_knowledge_id

    INNER JOIN my_understanding as my_understanding
        ON knowledge.id = my_understanding.knowledge_id
        

就將現有的sql_knowledge、我的個人理解my_understanding、大眾理解public_understanding連接(Join)在一起。 下面的WHERE語句,就特定選擇了有誤解概念,再根據創建時間created_at排序。

正因SQL的本質不是為了向電腦提供逐行命令,因此SQL可歸類為宣告式語言(Declarative Language)的一種,而較常用作編程的程式語言,例如CJavaScript等語言則應歸類為指令式語言(Imperative Language)

SQL之發展

SQL出現後,很快就成為了查詢數據庫的標準語言,大家熟知的甲骨文公司(Oracle Corporation),正是在1977年開發Oracle SQL資料庫開始的。到了1986年,SQL作為一種數據查詢語言,國際標準化組織(ISO)將SQL標準化,以後SQL在語法上不斷改良,也不斷有新的版本推出,最新的SQL推出時間為2016年。

NoSQL現身

也許正是因為SQL與平常使用之編程語言本質上不同,筆者認識不少軟件工程師,都對SQL避之則吉,編寫SQL可免則免。後來出現的MongoDB更令這種「SQL避免症」變本加厲。 MongoDB 在2009年出現,在之後幾年更帶起了NoSQL的風潮。而又由於MongoDB是一個文件導向資料庫(Document Oriented Database),可以直接儲存JSON作儲存格式,對使用JavaScript的開發者非常方便,因此旋即出現了MEAN(MongoDB-Express-AngularJS-Node.js)的技術棧,由於容易上手,理解容易,成為不少網上教學首選之技術。上Youtube搜尋一圈,不難發現大量Mean Stack的教學影片,原因正是如此。

mean-stack.jpg

Source

SQL因此退出歷史舞台了嗎?當然沒有,結果MongoDB的好處,慢慢在大量使用下變成了壞處: MongoDB無需定義Table Structure,令資料愈趨無結構,變得難以管理; MongoDB原生不支援JOIN的概念,也難以表達關聯性資料; MongoDB支援Database Transaction方面,也無法比上傳統SQL數據庫。不少軟件工程師在大量使用後,也得出類似的結論。當不同的SQL實作,例如PostgreSQL開始支援直接存取JSON、MySQL 容許將JSON字串儲存成BSON數據。MongoDB之優勢就大為減少。 因此網上出現了以下趣圖。

NoSQL_No_SQL演化史趣圖 Source

由七十年代的沒有SQL,到千禧年間NoSQL,再返回現在發覺SQL之可貴,就正是SQL四十多年發展之寫照了。

Comments

Read More

非結構化數據

非結構化數據

非結構化數據
Gordon Lau
2019-05-08

近年數據科學及人工智能發展迅速,大眾開始對數據(Data)有很大興趣,甚至有「數據是未來的石油」(Data is the new oil)的講法。很容易會聽到如大數據(Big Data)、數據導向決策(Data Driven Decision)、數據化組織(Data Organization)等等與數據相關的詞語,其中重點,不外乎都是如何運用已儲存的數據,通過數據處理及數據分析,從而得出結論,幫助決策。筆者今日希望談談的,是另一個技術用語,與大數據一詞經常一齊出現,就是非結構化數據(Unstructured Data)。


SQL二部曲:五件事,你不知道SQL勝任有餘

SQL二部曲:五件事,你不知道SQL勝任有餘

SQL二部曲:五件事,你不知道SQL勝任有餘
Gordon Lau
2019-10-15

上一篇文章講到了SQL的發展歷史,也提到了NoSQL的出現曾經為SQL資料庫帶來不少挑戰。正是這些挑戰,令現今SQL內置功能愈來愈豐富。近年SQL資料庫功能上大有進展,其中PostgreSQL功能日臻完善,運用PostgreSQL,連帶不少大家本以為只能運用NoSQL解決的問題,也可以輕鬆解決。 因此,本文主要會以PostgreSQL作舉例,當然以下很多功能在其他SQL實作如Oracle、SQL Server 、MySQL等都已逐漸支援,因此可看成是普遍SQL在不久將來廣泛支援的功能。


SQL三部曲:你不需要ORM

SQL三部曲:你不需要ORM

SQL三部曲:你不需要ORM
Gordon Lau
2019-10-22

曾經學習軟件開發的朋友,都應該在框架中,學過如何從資料庫讀取資料,而十之八九學到的方法,就是使用框架中的ORM程式庫。例如Ruby on Rails 內置了Active Record、Django內置了Django ORM、 Spring Boot則通常與 Hibernate一齊使用,C#則有一套本身的.Net Entity Framework。基本上通用的程式開發框架,都必然有自己的ORM程式庫。


SQL四部曲: SQL的未來在何方?

SQL四部曲: SQL的未來在何方?

SQL四部曲: SQL的未來在何方?
Gordon Lau
2019-10-25

先前三篇關於SQL的文章,分別講述了SQL的歷史、功能、誤解,這一篇筆者將會大膽預測,預測SQL的未來發展的可能方向。到底SQL在未來會是比現在更廣泛使用,成為每一個數據分析師的必備工具?還是被另外一種語言所取代?還是關聯式資料庫不會再受歡迎呢?


Request Syllabus
Please check your email after submissions.
hello@tecky.iot.me/tecky_hub+852 9725 6400
green_org
Caring Company 2019-2022
TQUK Approved Centre
aws_partner
Reimagine Education Challenge Award
B Corp™ Certified B Corporation
Web Content Accessibility Guidelines (WCAG) 2.1 at Level AA
Web Accessibility Gold Award
© 2024 Tecky Academy Limited