Loading...

SQL (Structured Query Language 結構化查詢語言) 是一種專門用來管理與查詢關聯式資料庫(Relational database)的程式語言。

SQL/NoSQL是什麼?認識資料庫管理系統DBMS

透過 SQL,我們能在關聯式資料庫裡新增、查詢、更新和刪除資料,同時也能建立和修改資料庫模式。它的語法簡單直接,一切都是以資料為主角去思考。讓我們一起來看一個簡單的 SQL 的範例:

SELECT * FROM [TABLE_NAME] WHERE [COND];

這句話的意思,就是「從 [TABLE_NAME] 的資料表中取出滿足 [COND] 條件的資料。

在過去的幾十年裡,關聯式資料庫的發展並不是一帆風順,有很多批評者,但由於關聯式資料庫使用簡單,穩定度高,而 SQL 功能強大,並且也積累了很多企業開放支援 SQL 的軟體與大量的成功案例,所以目前關聯式資料庫仍是最多軟體開發者使用的資料庫系統。

該用MySQL 或MongoDB?選擇資料庫前你該了解的事

關聯式資料庫有三個主要特徵:

  1. 以表格 (table) 的形式儲存資料
  2. 資料之間有明確的關聯
  3. 使用 SQL 語言操作資料庫

資料表 Table

「資料表 (Table)」是關聯式資料庫的最基本的結構,以下是一張資料表,看起來是一張通訊錄。這張表格是數筆資料的集合。

表格是由垂直的欄 (column) 和水平的列 (row) 所組成的,而在資料表上,這些欄和列各自有不同的意義。

每一列是一筆紀錄 (record)

在資料表上,每一列 (row) 都代表一筆紀錄 (record),也就是「一筆資料」。

上圖中的郭大明、陳小明、李艾倫等人,是在真實世界中存在的聯絡人,因此在不同的脈絡中,有時候也會被稱為實體 (entity)。

資料欄位代表屬性 (attribute)

垂直的欄在資料庫的術語裡被稱為資料欄位 (field),而他們代表的意義是屬性 (attribute)。

在這個例子裡,當我們把實體世界的「聯絡人」轉化成數位世界的資料時,我們使用 4 個屬性來描述這些聯絡人:編號、名字、電話、郵箱。

表格的第一行,也就是標頭 (header row) 裡定義了每個欄位的名稱。

格子裡儲存實際的值 (value)

在資料表上最小的單位是格子 (cell),每個格子代表某一筆紀錄的某一個屬性的值 (value)。例如在下例中,「陳小明的郵箱」是 chen@example.com。

當我們在設計資料表結構時,需要為每一種屬性定義資料型態,例如數字、字串、日期等等,符合資料型態的 value 才能存放資料表裡。如此一來維持了資料表的結構性,讓資料更容易管理與使用。

資料的關聯

在關聯式資料庫裡,資料之間必須有明確的「關聯」,而所謂的「關聯」,主要可分為三個種類:

  • one-to-one:一對一
  • one-to-many:一對多
  • many-to-many:多對多

一對一(One to One)

一筆資料只會對應到最多一筆資料。

例:在一個購物網站裡,一個使用者只會有一個購物車,該購物車也只會被一個使用者所擁有。

注意,這裡說的是「購物車」、而不是「訂單」。

一對多(One to Many)

一筆資料 A 會對應到多筆資料 B,但資料 B 反過來卻只會對應到一筆資料 A。

例:在一個購物網站的一個商品分類裡會有多個商品,而一個商品只會屬於一個分類。

多對多(Many to Many)

一筆資料 A 會對應到多筆資料 B,而一筆資料 B 也會對應到多筆資料 A。

例:一個使用者會參與多個活動,而一個活動也會有多個使用者參與。

辨識資料之間的關係

資料之間的關係會根據應用程式的需求而不同。要如何辨識關係的種類呢?最基本的思考方式,是詢問在目前應用程式需求的情境下:

  • 資料 A 是否有多筆資料 B?
  • 資料 B 是否有多筆資料 A?

如果兩個問題都是 NO,代表資料 A 和 B 是一對一的關係。

如果其中一個是 NO,而另一個是 YES,那麼就是一對多的關係,看哪個資料是多的那方。

如果兩個問題都是 YES,那麼就是多對多的關係。

現在,你已經認識了關聯式資料庫的三種關係,也學會怎麼判斷了!有了「關係」的認知之後,你就可以開始著手設計資料庫啦!

主鍵 (Primary Key)

主鍵 (Primary Key) 指的是代表一個資料表 (table) 裡的一筆資料具備唯一性(Uniqueness)的屬性,而每個資料表一定要有一個 primary key 的欄位。

唯一性 (Uniqueness)

唯一性使得該屬性能獨一無二地代表一筆資料,不能讓其他同樣的屬性有一樣的值;在一個「人」的屬性裡,姓名、血型、年齡和地址都不具備唯一性,例:能代表學校學生資料唯一性的屬性,是學生證號碼、信箱和駕照號碼。

持有性 (Availability)

雖然主鍵的重點是唯一性,但有些 Record 可能不具備那個屬性的值,那麼該屬性依舊無法作為主鍵,這就是持有性(Availability)。例:駕照號碼這個屬性雖然具備唯一性,但有些學生可能沒有駕照,故不滿足持有性,無法作為主鍵。

外鍵 (Foreign Key)

「外鍵 (Foreign Key)」的功能是用來建立資料之間的關係,並且,外鍵一定是其他資料表的主鍵。

你可以在資料表上增加一個 attribute 欄位當做外鍵(如下圖 photos table 的 album_id),並將它與有關聯的資料表主鍵連接起來。

至於外鍵的取名,通常會讓人能看得出來和另一個資料表的關係。例:透過 album_id 可以找到在特定 album 的所有 photo。

8 週養成工程師業界實戰能力,最接近業界實踐的課程,有效完成技能與求職準備

SQL 語法入門

文章前半部介紹了如何應用 SQL 查詢與管理資料、與關聯式資料庫的相關概念。由於 SQL 是大部分數據分析相關職位必備與重要的能力之一,故接下來文章的後半段,要介紹 SQL 語法與使用時機,加強大家在進行數據分析任務時的能力。

在 SQL 裡的語法分成四個部分:

  • 定義資料庫(Table、Field、Data Type)
  • 修改資料庫
  • 讀取資料庫的資料(Select)
  • 修改資料庫的資料

 SQL 語法屬於「讀取資料庫資料」的語法(Select),在讀取資料會使用 products table 作示範。

SQL 語法 - SELECT

Select 的基本語法必須包含 SELECTFROMSELECT 指定想選擇的 attribute,而 FROM 指定想選擇的 Table。

注意:SELECT、FROM、WHERE、IN、LIKE、BETWEEN、AND、OR 等語法大寫是慣例寫法,讓大家比較容易看出語法和內容的差異,即便使用小寫的 select 和 from 也不會出錯。

週年慶打折問題

要最快暸解這些運算子,就來實際操作一次計算運算子吧!假設飲料店老闆想要在週年慶時舉辦全店 20% off 的折扣活動,那麼你可能會想到上一單元教的 UPDATE 指令:

UPDATE `drinks`

SET `price` = `price` * 0.8;

不過,直接修改資料有一個缺點:如果週年慶結束了,我們還要將價格改回來,有點麻煩!這時候我們便可以請 SELECT 來做計算,而不用去修改真正的資料:

SELECT `name`, `price`, (`price` * 0.8) AS `discount_price`

FROM `drinks`;

這個例子有一個有趣的地方是,我們創造出了一個原本不存在的欄位,叫作 discount_price。SELECT 的好處就是他不會直接更動資料,卻能顯示我們想要檢視的資料表。

注意:SELECT 回傳的都是資料表。

在這裡我們用了 AS 這個保留字,用途是將欄位取一個方便查看的名稱,如果沒有 AS 的話,這個欄位的名稱會是 (price * 0.8) 整個字串。用 AS 可以增加資料表的可讀性。

週年慶打折限制

做好了全店八折的功能後,精打細算的老闆又宣布:「打折的品項只限定三十元以上的飲料」別慌了手腳,我們現在可以使用比較運算子:

SELECT `name`, `price`, (`price` * 0.8) AS `discount_price`

FROM `drinks`

WHERE `price` >= 30;

多個條件下的打折限制

假設我們想要打折的品項是三十元到四十元的飲料,則我們可以使用 AND 運算子將兩個條件串起來:

SELECT `name`, `price`, (`price` * 0.8) AS `discount_price`

FROM `drinks`

WHERE `price` >= 30 AND `price` <= 40;

或是我們也可以使用 BETWEEN 來選擇一個數值範圍:

SELECT `name`, `price`, (`price` * 0.8) AS `discount_price`

FROM `drinks`

WHERE `price` BETWEEN 30 AND 40;

關鍵字搜尋

當我今天想要搜尋愛玉冰茶,如果我使用的是等號「=」,那我必定要輸入 name = 愛玉冰茶 一字不漏才能得到搜尋結果。但在實務中,我們大多會採用關鍵字搜尋的功能,只需要部分的關鍵字就能搜尋到這筆資料,而這個功能就用到 LIKE 運算子來執行:

SELECT `name`, `price`

FROM `drinks`

WHERE `name` LIKE '%茶%';

在這個例子中,我們可以找到所有名字裡包含「茶」的飲料。百分比符號「%」的意思是「任意字元」(包括沒有字元)。所以這個 WHERE 的意思是我要找「前面有任意字元的茶,且後面也有任意字元」的資料喔!(就是一串文字中,只要有茶出現即可)

想學習更多SQL應用方法?掌握 SQL 後你可以...

  • 不再仰賴同事,更專業地分析洞察
    直接進入資料庫提取資料,跨表單情抓取出需要的資料、進行分析。
  • 精準理解使用者行為,驗證假設
    活用數據資料庫,了解使用者行為、改善銷售流程。
  • 有效優化流程、提升效率
    簡化 Excel 的手動處理,有效分析大量營運資料,找到優化機會。

SQL 易學難精,常學會了語法,卻不知如何使用。SQL 14 天從語法開始,逐步練功,輔以助教引導,再透過企業案例深化應用能力。

SQL 入門課程: 14天訓練從語法到真實企業案例