初識 SQL -- 操作邏輯

還不認識資料庫的時候聽人提起,總是有一種高大尚不可隨便碰觸的感覺XD,懷抱著戰戰兢兢的心情開始學習後,嗯?怎麼好像似曾相識?看起來好像…跟 excel 有點像XD,不過,實際上資料庫(database, db)是結構化的資訊或資料集合,通常是以電子方式儲存在伺服器中,db 也很耳熟…dragon ball…(夠了)


SQL,結構式查詢語言

SQL 是用來在關聯式資料庫中儲存和處理資料的程式語言。關聯式資料庫以表格形式儲存資訊,列和欄代表不同的資料屬性和資料值之間的各種關係(看起來像 excel)。另外可以使用 SQL 陳述式來創建資料、查詢資料、更新資料和刪除資料,也就是 CRUD。而一個伺服器(server)可以有很多資料庫(db),一個資料庫可以有很多資料表(table)。


SQL 的組成

在前言中我提到 SQL 的資料長的很像 excel,是因為關聯式資料庫的結構就是欄與列的組合,一個資料庫就類似於一個 excel 檔案,一個資料庫中可以存放很多資料表(table),相當於 excel 的 sheet。工程師就在多個資料庫和資料表之間建立關聯,以優化資料儲存空間。


CRUD

CRUD 是四個操作的縮寫,分別是

  • Create: 創建資料,建立資料庫、資料表、加入欄位、寫入內容等。
  • Read: 查詢資料,提取資料、篩選資料、搜尋關鍵字、處理計算資料等。
  • Update: 更新資料,修改資料、替換資料等。
  • Delete: 刪除資料。

Create 創建

首先要認識到建立資料時要設定該資料的類型,可分成:

  • 文字類:char(n)、varchar(n)、varchar(max)、text etc.
  • 數字類:integer、float、real、numeric etc.
  • 日期時間類:datetime、date、time etc.
  • 二進位檔案:image、varbinary(n)、blob etc.
  • 布林值:Boolean

另外,除了資料類型,還可以預設資料的身份,常見可分成:

  • PK: primary key 主鍵,每個 table 只會有一個 PK,會自動建立 index,通常是 ID,就像是 table 的身分證一樣,等於同時設定了 NN 和 UNIQUE
  • FK: foreign key 外來鍵
  • NN: not null 非空值
  • UQ/U: unique 唯一索引
  • AI: auto increment 自動增加
  • UN: unsigned 無符號整數(非負數)

好,終於要開始講 C 的資料處理寫法了:


table 追加欄位

1
2
ALTER TABLE 資料表名稱
ADD COLUMN 新欄位名稱 VARCHAR(100);

table 刪除欄位

1
2
ALTER TABLE 資料表名稱
DROP COLUMN 欄位名稱;

寫入欄位名稱

1
2
3
4
INSERT INTO 資料表名稱
(title)
VALUE
('hi我是什麼欄位');

新增部分欄位用逗號隔開


Read 查詢

Read 不只查詢,還包括許多處理及計算資料的方法:

撈出所有資料

1
2
SELECT *
FROM 資料表名稱;

選取部分欄位

1
2
SELECT 欄位名稱, 欄位名稱
FROM 資料表名稱;

篩選資料

1
2
3
SELECT *
FROM 資料表名稱
WHERE 欄位名稱 = 內容 and 內容;

選擇空白資料

1
2
3
SELECT *
FROM 資料表名稱
WHERE 欄位名稱 is NULL;

搜尋關鍵字(%代表前後文)

1
2
3
SELECT *
FROM 資料表名稱
WHERE 欄位名稱 like "%關鍵字%";

查詢區間

1
2
3
SELECT *
FROM 資料表名稱
WHERE 欄位名稱 BETWEEN 10 AND 25;

複合資料

1
2
3
SELECT *
FROM 資料表名稱
WHERE 欄位名稱 IN ("S", "A");

1
2
3
SELECT *
FROM 資料表名稱
WHERE 欄位名稱 is NOT "S";

複合資料(非)

1
2
3
SELECT *
FROM 資料表名稱
WHERE 欄位名稱 NOT IN ("S", "A");

接下來是計算:

計算欄位總數

1
2
3
SELECT COUNT(*)
FROM 資料表名稱
WHERE 欄位名稱 = "A";

加總

1
2
3
SELECT SUM(age)
FROM 資料表名稱
WHERE 欄位名稱 = "A" AND != NULL;

平均

1
2
3
SELECT AVG(age)
FROM 資料表名稱
WHERE 欄位名稱 = "A" AND != NULL ;

最大值、最小值

1
2
3
4
5
SELECT MAX(age)
FROM 資料表名稱

SELECT MIN(age)
FROM 資料表名稱

分組

1
2
3
SELECT 欄位名稱, SUM(age), AVG(age)
FROM 資料表名稱
GROUP BY 欄位名稱

挑掉重複的資料

1
SELECT DISTINCT (欄位名稱) FROM 資料表名稱;

反向排序(預設為正向)

1
2
3
SELECT *
FROM 資料表名稱
ORDER by 欄位名稱 DESC;

限量

1
2
3
SELECT *
FROM 資料表名稱
LIMIT 3

join 交集

t1 為左邊資料,並以左邊資料為主

1
2
3
4
SELECT *
FROM t1
LEFT JOIN t2
on t1.username = t2.name

Update 更新

1
2
3
UPDATE 資料表名稱
SET 欄位 = 10
WHERE 欄位 = 25;

SET 為修改內容,WHERE 則是指定誰

更新多個欄位

1
2
3
UPDATE 資料表名稱
SET 欄位 = 10, 欄位 = "A", 欄位 = 5
WHERE 欄位 = 25;

Delete 刪除

1
2
DELETE FROM 資料表名稱
WHERE 欄位 = "C";
dark
sans