在資料函式庫系統中,資料型別的選擇和使用至關重要,直接影響資料的儲存效率和查詢效能。本文將會詳細說明布林值和二進位資料的儲存方式,並比較不同資料函式庫系統的實作差異。此外,還會探討 SQL 中各種操作和函式的用法,包含邏輯運算子、比較運算子、數學函式、字串函式、日期函式以及處理空值的相關函式,搭配實際案例說明,讓讀者能更有效地運用 SQL 進行資料操作和分析。理解這些核心概念,有助於開發者設計更優良的資料函式庫結構,並撰寫更高效的 SQL 查詢陳述式,提升整體資料函式庫應用程式的效能和穩定性。

資料型別與操作詳解

在資料函式倉管理系統中,正確理解和使用資料型別是至關重要的。本篇文章將探討布林資料、二進位資料以及相關的操作和函式。

布林資料型別

布林資料型別用於儲存邏輯值 TRUE 和 FALSE。不同的資料函式庫系統對布林型別的支援有所不同。

布林型別的支援

  • MySQL、PostgreSQL 和 SQLite 支援布林資料型別,可以直接建立布林欄位。
CREATE TABLE my_table (
    my_boolean_column BOOLEAN
);
INSERT INTO my_table VALUES (TRUE), (FALSE), (1);
SELECT * FROM my_table;

不支援布林型別的處理方式

  • Oracle 和 SQL Server 沒有原生布林型別,但可以透過其他型別來模擬:
    • Oracle:使用 CHAR(1) 儲存 ‘T’ 或 ‘F’,或使用 NUMBER(1) 儲存 1 或 0。
    • SQL Server:使用 BIT 型別,儲存 1、0 或 NULL。

外部檔案儲存

對於影像、檔案等大型檔案,有兩種常見的儲存方式:

方法一:儲存檔案路徑

  • 推薦用於大檔案(>1MB),例如 iPhone 照片通常幾 MB。
  • 將檔案儲存在檔案系統中,並在資料函式庫中儲存路徑。
CREATE TABLE my_table (
    file_path VARCHAR(100)
);
INSERT INTO my_table VALUES ('/Users/images/img_001.jpg');

方法二:以二進位值儲存

  • 適合小檔案,直接儲存在資料函式庫中,方便備份。
  • 需要將檔案轉換為二進位格式,並儲存在 BLOB 欄位中。

二進位與十六進位資料

二進位資料是電腦可讀的原始資料,通常以十六進位格式呈現給使用者。

十六進位表示法

  • 將二進位資料轉換為 16 進位表示(0-9, A-F)。
  • 不同資料函式庫系統對十六進位的表示法支援不同:
    • MySQL:支援 X’AF12’、x’AF12’ 和 0xAF12。
    • PostgreSQL:支援 X’AF12’ 和 x’AF12’。
    • SQL Server 和 SQLite:支援 0xAF12。

二進位資料型別

用於儲存二進位資料的欄位型別,在不同資料函式庫系統中有不同的名稱:

常見二進位型別

  • MySQL、Oracle 和 SQLite:使用 BLOB。
  • PostgreSQL:使用 BYTEA。
  • SQL Server:使用 VARBINARY。
CREATE TABLE my_table (
    my_binary_column BLOB
);
INSERT INTO my_table VALUES ('a'), ('aaa'), ('ae$ iou');
SELECT * FROM my_table;

資料函式庫系統對二進位型別的支援比較

| 資料函式庫系統 | 二進位型別 | |



-|



-| | MySQL | BLOB | | Oracle | BLOB, RAW | | PostgreSQL | BYTEA | | SQL Server | VARBINARY | | SQLite | BLOB |

操作與函式詳解

SQL 中的操作和函式用於執行計算、比較和資料轉換。

運算子與函式的區別

  • 運算子(如 +, =, OR)用於執行運算或比較。
  • 函式(如 UPPER(), YEAR())接受輸入並傳回結果。

常見操作與函式範例

-- 調整員工薪資
SELECT name, pay_rate + 5 AS new_pay_rate
FROM employees
WHERE UPPER(title) = 'ANALYST'
OR YEAR(start_date) BETWEEN 2016 AND 2018;

本篇文章詳細介紹了布林資料、二進位資料的儲存方式,以及相關的操作和函式。正確理解和應用這些概念,將有助於提升資料函式庫設計和操作的效率與準確性。透過實際範例和不同資料函式庫系統的比較,希望能為讀者提供實用的參考和指引。

SQL 操作與函式詳解

SQL 語言中包含了豐富的操作與函式,用於資料的查詢、運算及處理。本文將重點介紹 SQL 中的操作與函式,包括邏輯運算、比較運算、數學運算及各種實用函式。

邏輯運算

邏輯運算是用於修改條件表示式,結果為 TRUEFALSENULL。常見的邏輯運算包括 ANDORNOT

SELECT *
FROM employees
WHERE start_date IS NOT NULL
AND (title = 'analyst' OR pay_rate < 25);

在上述範例中,查詢條件結合了多個邏輯運算,需注意使用括號明確運算順序。

邏輯運算描述
AND當兩個條件皆為 TRUE 時傳回 TRUE,否則傳回 FALSENULL
OR當至少一個條件為 TRUE 時傳回 TRUE,否則傳回 FALSENULL
NOT對條件結果取反,若條件為 FALSE 則傳回 TRUE,反之亦然

邏輯運算範例

假設有一個名為 name 的欄位,使用 NOT 運算的結果如下表所示:

| name | name IN ('Henry', 'Harper') | name NOT IN ('Henry', 'Harper') | |


|








-|









| | Henry | TRUE | FALSE | | Lily | FALSE | TRUE | | NULL | NULL | NULL |

比較運算

比較運算是用於判斷資料之間的關係,結果同樣為 TRUEFALSENULL。比較運算可分為符號運算與關鍵字運算。

符號比較運算

| 運算子號 | 描述 | |



|


| | = | 等於測試 | | !=, <> | 不等於測試 | | < | 小於測試 | | <= | 小於等於測試 | | > | 大於測試 | | >= | 大於等於測試 |

關鍵字比較運算

| 關鍵字 | 描述 | |


-|


| | BETWEEN | 檢查值是否在指定範圍內 | | EXISTS | 檢查子查詢是否有結果 | | IN | 檢查值是否在指定列表中 | | IS NULL | 檢查值是否為空值 | | LIKE | 檢查值是否符合簡單模式 |

常見比較運算範例

  1. BETWEEN 範例:查詢年齡介於 35 至 44 之間的資料。

    SELECT *
    FROM my_table
    WHERE age BETWEEN 35 AND 44;
    
  2. EXISTS 範例:查詢同時存在於員工表與客戶表的資料。

    SELECT e.id, e.name
    FROM employees e
    WHERE EXISTS (SELECT *
                  FROM customers c
                  WHERE c.email = e.email);
    

數學與字串函式

SQL 提供了豐富的內建函式,包括聚合函式、數值函式、字串函式及日期函式等。

聚合函式

| 函式名稱 | 功能描述 | |



|



| | COUNT() | 統計資料筆數 | | SUM() | 總和計算 | | AVG() | 平均值計算 | | MIN() | 最小值查詢 | | MAX() | 最大值查詢 |

字串函式範例

SELECT CONCAT('Hello', ' ', 'World') AS greeting;
-- 結果:Hello World

日期函式範例

SELECT CURRENT_DATE AS today_date;
-- 結果:目前日期

Null 相關函式

處理空值(Null)是資料函式庫操作中的常見需求,SQL 提供如 COALESCE() 等函式來處理空值問題。

SELECT COALESCE(column_name, 'default_value') AS result
FROM table_name;

SQL 操作與函式詳解

比對操作

SQL 提供多種比對操作,用於篩選資料表中符合特定條件的資料列。

IN 操作

IN 操作用於檢查某個值是否在給定的值列表中。以下範例查詢特定員工的資料:

SELECT *
FROM employees
WHERE e.id IN (10001, 10032, 10057);

此查詢傳回 id100011003210057 的員薪水料。

NOT IN 操作

NOT IN 操作則用於檢查某個值是否不在給定的值列表中。以下範例查詢未使用過休假的員工:

SELECT e.id
FROM employees e
WHERE e.id NOT IN (SELECT v.emp_id FROM vacations v);

注意: 若子查詢中的欄位包含 NULL 值,NOT IN 操作將不會傳回任何資料列。建議在這種情況下使用 NOT EXISTS 操作:

SELECT e.id
FROM employees e
WHERE NOT EXISTS (SELECT * FROM vacations v WHERE v.emp_id = e.id);

IS NULL 操作

IS NULLIS NOT NULL 操作用於檢查某個值是否為 NULL。以下範例查詢沒有長官經理的員工:

SELECT *
FROM employees
WHERE manager IS NULL;

反之,若要查詢有長官經理的員工,可以使用 IS NOT NULL

SELECT *
FROM employees
WHERE manager IS NOT NULL;

LIKE 操作

LIKE 操作用於比對簡單的模式。百分號 % 是萬用字元,代表零個或多個字元。以下範例查詢包含特定字串的資料列:

SELECT *
FROM my_table
WHERE txt LIKE '%you%';

在 MySQL、SQL Server 和 SQLite 中,模式比對不區分大小寫;而在 Oracle 和 PostgreSQL 中,則區分大小寫。

若要比對以特定字串開頭的資料列,可以使用以下查詢:

SELECT *
FROM my_table
WHERE txt LIKE 'You%';

若要搜尋包含特殊字元 % 的資料列,需要使用 ESCAPE 關鍵字:

SELECT *
FROM my_table
WHERE txt LIKE '%!%%' ESCAPE '!';

此查詢將傳回包含 % 字元的資料列。

數學運算

SQL 中的數學運算包括基本的算術運算,如加法、減法、乘法和除法。以下範例計算員工的每週薪水:

SELECT salary / 52 AS weekly_pay
FROM my_table;

常見的數學運算子號包括:

運算子號描述
+加法
-減法
*乘法
/除法
% (或 MOD 在 Oracle 中)取餘數

在 PostgreSQL、SQL Server 和 SQLite 中,整數除法會傳回整數結果。若要得到小數結果,可以將其中一個運算元轉換為小數或浮點數:

SELECT 15 / 2.0;  -- 傳回 7.5

或者使用 CAST 函式進行型別轉換:

-- PostgreSQL 和 SQL Server
SELECT CAST(15 AS DECIMAL) / CAST(2 AS DECIMAL);

-- SQLite
SELECT CAST(15 AS REAL) / CAST(2 AS REAL);

聚合函式

聚合函式對多行資料進行計算並傳回單一值。常見的聚合函式包括:

函式描述
COUNT()計算值的數量
SUM()計算某欄位的總和
AVG()計算某欄位的平均值
MIN()取得某欄位的最小值
MAX()取得某欄位的最大值

聚合函式通常用於統計分析,例如計算資料表的總行數或平均值:

SELECT COUNT(*) AS total_rows, AVG(age) AS average_age
FROM my_table;

在包含聚合函式和非聚合欄位的查詢中,非聚合欄位必須出現在 GROUP BY 子句中,以確保結果的正確性:

SELECT region, MIN(age), MAX(age)
FROM my_table
GROUP BY region
HAVING MIN(age) < 18;

不同的資料函式庫系統對於未正確使用 GROUP BY 的查詢處理方式不同,有些會傳回錯誤,有些則可能傳回不準確的結果。因此,建議始終檢查查詢結果以確保其正確性。

數值函式與字串函式在SQL中的應用

在SQL查詢中,數值函式和字串函式是兩種非常重要的工具,能夠幫助開發者有效地處理和操作資料函式庫中的資料。本文將探討數值函式和字串函式的使用方法,並提供實際的範例來說明其在不同資料函式倉管理系統(RDBMS)中的應用。

數值函式

數值函式主要用於對數字資料進行各種數學運算。以下是一些常見的數值函式:

1. 基本數學運算

  • ABS: 取得數字的絕對值。

    SELECT ABS(-5);
    

    結果:5

  • SIGN: 判斷數字的正負號,回傳-1(負數)、0(零)或1(正數)。

    SELECT SIGN(-5);
    

    結果:-1

2. 指數與對數運算

  • POWER: 將一個數字提升到指定的冪次。

    SELECT POWER(5, 2);
    

    結果:25

  • SQRT: 計算數字的平方根。

    SELECT SQRT(25);
    

    結果:5

  • EXP: 計算e的指定次方。

    SELECT EXP(2);
    

    結果:7.38905609893065

  • LOG: 計算指定底數的對數。不同RDBMS中,LOG函式的用法可能有所不同。

    -- MySQL, PostgreSQL
    SELECT LOG(2, 10);
    -- SQL Server
    SELECT LOG(10, 2);
    

3. 隨機數生成

不同RDBMS生成隨機數的方法有所不同:

  • MySQL, SQL Server: 使用RAND()函式。

    SELECT RAND();
    
  • Oracle: 使用DBMS_RANDOM.VALUEDBMS_RANDOM.RANDOM

    SELECT DBMS_RANDOM.VALUE FROM dual;
    
  • PostgreSQL: 使用RANDOM()函式。

    SELECT RANDOM();
    
  • SQLite: 使用RANDOM()函式,但結果範圍不同。

    SELECT RANDOM();
    

#### 內容解密:

上述範例展示瞭如何在不同資料函式庫系統中生成隨機數。每個系統都有其特定的函式來實作這一功能,開發者需要根據所使用的RDBMS選擇適當的方法。

4. 四捨五入與截斷

  • CEIL/CEILING: 將數字無條件進位到最接近的整數。

    SELECT CEIL(98.7654);
    

    結果:99

  • FLOOR: 將數字無條件捨去到最接近的整數。

    SELECT FLOOR(98.7654);
    

    結果:98

  • ROUND: 對數字進行四捨五入,可以指定小數位數。

    SELECT ROUND(98.7654, 2);
    

    結果:98.77

  • TRUNC/TRUNCATE: 將數字截斷到指定的小數位數。

    SELECT TRUNC(98.7654, 2);
    

    結果:98.76

#### 內容解密:

這些函式在處理財務資料或需要精確控制小數位數的場合非常有用。開發者可以根據需求選擇合適的函式來進行數字處理。

資料型別轉換

在比較不同資料型別的資料時,可能需要進行型別轉換。CAST函式是SQL中用於轉換資料型別的標準方法。

SELECT *
FROM my_table
WHERE CAST(str_col AS DECIMAL) > 3;

#### 內容解密:

此範例展示瞭如何將字串欄位轉換為十進位制數字,以便進行比較。正確的資料型別轉換能夠避免查詢錯誤,並確保結果的正確性。

字串函式

字串函式主要用於處理文字資料。以下是一些常見的字串函式:

#### 字串長度計算:

使用LENGTH函式(在SQL Server中為LEN)來取得字串的長度。

SELECT LENGTH(name)
FROM my_table;

#### 篩選特定長度的字串:

SELECT *
FROM my_table
WHERE LENGTH(name) < 10;

#### 使用Plantuml圖表展示字串處理流程:

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title SQL資料型別與操作函式詳解

package "資料庫架構" {
    package "應用層" {
        component [連線池] as pool
        component [ORM 框架] as orm
    }

    package "資料庫引擎" {
        component [查詢解析器] as parser
        component [優化器] as optimizer
        component [執行引擎] as executor
    }

    package "儲存層" {
        database [主資料庫] as master
        database [讀取副本] as replica
        database [快取層] as cache
    }
}

pool --> orm : 管理連線
orm --> parser : SQL 查詢
parser --> optimizer : 解析樹
optimizer --> executor : 執行計畫
executor --> master : 寫入操作
executor --> replica : 讀取操作
cache --> executor : 快取命中

master --> replica : 資料同步

note right of cache
  Redis/Memcached
  減少資料庫負載
end note

@enduml

此圖示展示了根據字串長度篩選資料的流程。