一些基礎常見的 SQL 語法。
創建#
創建資料庫#
創建使用的是「CREATE」語法:
1CREATE DATABASE `資料庫名稱`;
創建資料表及欄位#
由於要先指定資料庫才能使用裡面的資料表,所以先選擇資料庫:
1USE `資料庫名稱`;
之後創建資料表,創建格式如下:
1CREATE TABLE `資料表名稱`(
2 `欄位1名稱` 資料型態(長度) 屬性1 屬性2...,
3 `欄位2名稱` 資料型態(長度) 屬性1 屬性2...,
4 ...
5);
範例#
1CREATE TABLE `資料表名稱`(
2 `id` int AUTO_INCREMENT PRIMARY KEY,
3 `phone` char(10),
4 `name` varchar(20) DEFAULT 'Anonymous',
5 `age` int(3) NOT NULL
6);
語法說明#
欄位格式為「欄位名稱 資料類別(長度) 屬性1 屬性2...」。每筆資料以「,」區隔。
欄位「
id」為「int」表示「整數」,範圍為「-2,147,483,648~2,147,483,647」。
屬性 「PRIMARY KEY」則表示主鍵,同時加上「AUTO_INCREMENT」使其能在新增一筆新資料時,自動累加 id 以確保資料筆之間的 id 值唯一。欄位「
phone」為「char」表示「字元」,最大字元長度為「255」。在後方有「(10)」則限制其長度為 10 。(ps. 若長度不足10 則會自動補足 10,總之在儲存上佔用的容量是固定的)而「
name」欄位同樣是字元,但寫作「varchar」,最大字元長度為「65535」,差別在於資料儲存上,varchar(20)指的是若字元長度不足 20 ,則只會佔用資料的字元長度大小,相較於「char」更為彈性,通常建議使用這個類別而非「char」。
屬性「DEFAULT」意思為「預設」。在新增資料筆時,若沒有指定該欄位的情況下,會自動寫入預設值,舉上述例子,當沒有指定「name」欄位寫入時,該欄位將自動寫入「Anonymous」。最後的「
age」欄位屬性「NOT NULL」表示該欄位不能為空值。
若要表示該資料可以為空,則使用「NULL」屬性。
若沒有特別指定,則使用系統預設,通常為「NULL」屬性。
(ps.id雖然沒有該屬性,但PRIMARY KEY屬性本身就自帶NOT NULL了)
另外,你也可以將欄位格式寫好後,在最後才將其定義為主鍵:
1CREATE TABLE `資料表名稱` (
2 `id` int AUTO_INCREMENT,
3 ...
4 PRIMARY KEY(`id`)
5);
新增#
想要在資料表內新增資料筆,則需要用到「INSERT」語法:
1INSERT INTO `資料表名稱`(`欄位1`, `欄位2`,...)
2VALUES (欄位1的值, 欄位2的值...);
填寫值的順序是對應前面欄位順序的。
這邊要特別注意的是,兩行之間並沒有「,」或「;」區隔。
本質上它算是一行,只是為了提高可讀性,所以習慣寫作兩行或以上。
(ps. 另外,舉上述例子,我們不需要在新增時手動寫入「id」欄位,因為「AUTO_INCREMENT」會自動寫入。)
範例#
舉上述創建例子中的資料表為例:
1INSERT INTO `資料表名稱`(`phone`, `name`, `age`)
2VALUES ("0123456789", "新之助", 5);
會寫入以下資料:
| id | phone | name | age |
|---|---|---|---|
| 1 | 0123456789 | 新之助 | 5 |
再寫入一筆,但這次只指定必要的欄位「age」:
1INSERT INTO `資料表名稱`(`age`)
2VALUES (19);
目前資料為:
| id | phone | name | age |
|---|---|---|---|
| 1 | 0123456789 | 新之助 | 5 |
| 2 | NULL | Anonymous | 19 |
- 由於
id欄位的「AUTO_INCREMENT」屬性,所以自動累加上一筆資料的id。 - 欄位
phone並未指定,而又不存在預設值,因此為NULL (空值)。 - 欄位
name並未指定,但存在預設值「Anonymous」,因此寫入預設值。 - 欄位
age指定為19。
但如果這麼寫:
1INSERT INTO `資料表名稱`(`name`, `phone`)
2VALUES ("小葵", "0987654321");
會發生什麼事情?
答案是噴一個錯誤 - Field 'age' doesn't have a default value
還記得剛剛創建資料表時,設置了 age 欄位為「NOT NULL」屬性嗎?
而在此並未給予 age 值,而 age 又不存在「DEFAULT」預設值,因此出錯。