# SQL 語法 ## 建立資料庫 ```=sql CREATE DATABASE IF NOT EXISTS test DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; ``` 1. `CREATE DATABASE IF NOT EXISTS test` `CREATE DATABASE` 建立一個資料庫。 `IF NOT EXISTS` 檢查資料庫是否已存在。如果資料庫已存在,就不會重複建立,避免發生錯誤。 `test` 新資料庫的名稱。 2. `DEFAULT CHARACTER SET utf8mb4` 設定資料庫的預設字符集為 `utf8mb4`。 `utf8mb4` 是一種字符集,支持更多的 Unicode 字符,例如表情符號(emoji)。這比傳統的 `utf8` 覆蓋範圍更廣。 3. `COLLATE utf8mb4_general_ci` 設定資料庫的預設排序規則為 `utf8mb4_general_ci`。 排序規則決定字符串的比較和排序方式: `general` 表示使用一般排序規則。 `ci` 表示大小寫不敏感(case-insensitive),即 "A" 和 "a" 被視為相同。 ## 使用 ```=sql USE test; ``` 切換到指定的資料庫 `test` ## 建立表格 ```=sql CREATE TABLE users ( id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, username varchar(32) NOT NULL, password varchar(32) NOT NULL, sex BOOLEAN DEFAULT TRUE, phone int(11) NOT NULL UNIQUE, email varchar(32) NOT NULL UNIQUE, address varchar(32) ) ENGINE=InnoDB AUTO_INCREMENT=1; ``` ::: success 不需要重複寫: 如果 CREATE DATABASE 中已經指定了 CHARACTER SET 和 COLLATE,新建的資料表會繼承資料庫的這些預設設定,除非你特別需要更改表格的編碼規則。 ::: 1. `CREATE TABLE users` 建立一個名為 `users` 的資料表,用來儲存使用者資訊。 欄位說明 `id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY`: `int(11)` 是整數類型,長度 11。 `NOT NULL` 此欄為不能為空。 `AUTO_INCREMENT` 讓此欄位值自動遞增。 `PRIMARY KEY` 是主鍵,唯一標識每位使用者。 2. `username varchar(32) NOT NULL`: `varchar(32)` 字串型態,最大長度為 32 字元,不可為空。 ::: warning 注意:password 實務中不建議直接儲存密碼明文,應使用哈希函數(如 bcrypt)加密後儲存。 ::: 3. `sex BOOLEAN DEFAULT TRUE`: `BOOLEAN` 是布林值,`TRUE(1)` `FALSE(0)` `DEFAULT TRUE` 預設值為 TRUE,自己定義男性(1)女性(0)。 4. `phone int(11) NOT NULL UNIQUE`: `UNIQUE` 唯一,當其他列有重複資訊他會報錯。 5. `address varchar(32)`: 沒有寫 `NOT NULL` 代表可以為空。 6. `ENGINE=InnoDB AUTO_INCREMENT=1`: `ENGINE=InnoDB` 使用 InnoDB 引擎,支持事務與外鍵。 `AUTO_INCREMENT=1` 自動遞增起始值設定為 1。 ## 新增 ```=sql INSERT INTO users (username, password, sex, phone, email, address) VALUES ('張三', 'password123', TRUE, 0912345678, 'zhangsan@gmail.com', '台北市中正區第一街'), ('李四', 'password456', FALSE, 0987654321, 'lisi@example.com', ''); ``` `INSERT INTO users` 表示將資料插入到名為 `users` 的資料表中。 `VALUES` 這部分開始列出要插入的資料,每一組資料用一對括號包住,並用逗號分隔各欄位的值。 ## 修改 ```=sql UPDATE users SET email = 'zhangsan_new@gmail.com', address = '台北市中正區第二街' WHERE username = '張三'; ``` `UPDATE users` 表示更新 `users` 表格。 `WHERE username = '張三'` 指定更新條件,僅更新 `username` 為「張三」的資料。 ## 刪除 ```=sql DELETE FROM users WHERE id = 1; ``` `DELETE FROM users` 這部分指示 SQL 刪除 `users` 資料表中的資料行。 `WHERE id = 1` 指定刪除條件 id 欄位值為 1 的資料行。 ## 搜尋 ```=sql SELECT * FROM users; ``` `*` 代表所有 這樣會顯示 users 表格中的所有資料行和所有欄位。 ```=sql SELECT username, email FROM users; ``` 這樣只會顯示 `username` 和 `email` 欄位的資料。 ```=sql SELECT * FROM users WHERE username = '張三'; ``` 這樣會顯示 `username` 為「張三」的用戶資料。 ```=sql SELECT * FROM users WHERE sex = TRUE AND address LIKE '%台北市%'; ``` 這樣會顯示符合兩個條件的資料行:性別為男性且地址中包含「台北市」。 `LIKE` 用來執行模糊匹配,並且可以在字串中找到特定的模式或子字串。 `%` 是一個通配符,表示任意數量的字符。所以這個條件會匹配所有 address 欄位中包含「台北市」的資料行,不管「台北市」前後有沒有其他文字。 ## 函數 newid() ## 附錄 ### 常用資料庫資料型態 1. INT (整數) 2. CHAR (1~255字元字串) 3. VARCHAR (不超過255字元不定長度字串) 4. TEXT (不定長度字串最多65535字元) ### 建立資料庫觀念 1. 先判斷每個欄位的型態 2. 判斷是不是唯一 (UNIQUE) 3. 判斷可否為空 (NOT NULL) 4. 給定初始值 (例:DEFAULT TRUE) ### php範例 ```=php <?php session_start(); $servername = "localhost"; // MySQL位置 $username = "root"; // 帳號登入 $dbname = "test"; // 資料庫位置 // 連接 $conn = new mysqli($servername, $username, '', $dbname); // ‘’為密碼,root預設沒有密碼所以空著 // 設置字符集編碼 $conn->set_charset("utf8"); // 查詢資料庫 $sql = "SELECT * FROM users"; // SQL語法 $result = $conn->query($sql); // 執行SQL指令 if ($result->num_rows > 0) { // 輸出資料 while ($row = $result->fetch_assoc()) { echo "id: " . $row["id"] . " - Name: " . $row["username"] . "<br>"; } } else { echo "沒資料"; } // 關閉連線 $conn->close() ?> ```