還不認識資料庫的時候聽人提起,總是有一種高大尚不可隨便碰觸的感覺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 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";
|