---
# System prepended metadata

title: SQL 語法
tags: [公開發佈, 資料庫]

---

# 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()
?>
```