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