---
# System prepended metadata

title: MySQL 是什麼？

---

> 此篇內容引用並改寫自 [[week9] 給自己看的 PHP 和 MySQL 溝通](https://www.coderbridge.com/@v61265/8921fe75187241afa37001cc1a139595?utm_source=coderbridge-com&utm_medium=indie_related_post_title&utm_campaign=Leetcode%20%E5%88%B7%E9%A1%8C%20pattern%20-%20Fast%20&%20Slow%20Pointer_[week9]%20%E7%B5%A6%E8%87%AA%E5%B7%B1%E7%9C%8B%E7%9A%84%20PHP%20%E5%92%8C%20MySQL%20%E6%BA%9D%E9%80%9A_@v61265)

# MySQL 是什麼？
MySQL 是一種關聯式資料庫。

## 關聯式資料庫
+ 儲存格式為 table （資料表）
+ 資料表之間互相關聯（共用 id 、學號等等）
+ 結構穩定，但相對彈性低
+ 常見如 MySQL、PostgreSQL、Microsoft SQL Server、SQLite
## 非關聯式資料庫
又叫 NoSQL
+ 用不同型態儲存，因此資料可放的型態也更多元（例如陣列）
+ 結構較不明顯，因此彈性更高
+ 常見如 mongodb。

## phpMyAdmin
本文使用的系統 MariaDB 是 MySQL 的分支，我們可以選擇使用 CLI 和資料庫溝通，也可以用 GUI 例如 phpmyadmin 。

## 基礎語法
基礎語法以大寫表示，但實際執行時小寫也可以， 資料表（table name）的反引號可以省略。

### 新增資料：
``` sql
INSERT INTO `資料表名稱` (欄位名稱1, 欄位名稱2, 欄位名稱3, ...)
VALUES (欄位值1, 欄位值2, 欄位值3, ...);
```
範例：
``` sql
INSERT INTO comments (nickname, username, content)
VALUES ('Leonardo', 'leo123456', 'Hi, my name is Leo.');
```

### 選取資料

一次選取所有欄位：
``` sql
SELECT * FROM 資料表名稱 WHERE 條件;
```

選取特定欄位：

``` sql
SELECT 欄位名稱1, 欄位名稱2 ... FROM 資料表名稱 WHERE 條件;
```

範例：

``` sql
SELECT * FROM students ORDER BY grades DESC;
```
註：
1. WHERE 條件為自定義條件可加可不加，若有多個條件可用 AND 或 OR 連接
2. ORDER BY 為自定義條件可加可不加，ASC 為升冪; DESC 為降冪

### 更新資料
``` sql
UPDATE 資料表名稱
SET 欄位名稱1 = 欄位值2, 欄位名稱2 = 欄位值2, ...
WHERE 條件;
```

範例：
``` sql
UPDATE students
SET gender = 0, grades = 88
WHERE id = 1;
```
註：若更新資料沒設定條件則會影響所有被選取欄位

### 刪除資料
``` sql
DELETE FROM 資料表名稱 WHERE 條件;
```
範例：
``` sql
DELETE FROM students WHERE id = 6;
```

# PHP 和資料庫連線：MySQLi
``` php
<?php
$conn = new mysqli(主機名稱, 使用者名稱, 密碼, 資料庫名稱);

// 錯誤處理
if ($conn->connect_error) {
    die('資料庫連線錯誤:' . $conn->connect_error);
}
?>
```

範例：
``` php
<?php
$localhost = 'localhost';
$user_name = 'wei';
$password = '1234';
$db_name = 'week9';

$conn = new mysqli($localhost, $user_name, $password, $db_name);

// 錯誤處理
if ($conn->connect_error) {
    die('資料庫連線錯誤:' . $conn->connect_error);
}

//設定檔案格式與時區
$conn->query('SET NAMES UTF8');
$conn->query('SET time_zone = "+8:00"');
?>
```
## PHP 筆記
+ PHP 語法以 `<?php` 開頭，以 `?>` 結尾
+ 連接字串使用點點 `.`，對比 JavaScript `+`
+ 存取物件屬性使用 `->`，對比 JavaScript `.`
+ 變數以錢符號 `$` 開頭，PHP 沒有創建變數宣告直接賦值即可
+ 若想在函式內使用全域變數，需先在變數前加上 global

### 常用函式
+ `exit()`：同 `die()`，輸出一個消息並且退出當前腳本。
+ `isset()`：檢查是否有此變數，回傳布林值（對isset來說，把變數值設為 NULL 等於變數不存在，因此會回傳 false）
+ `empty()`：檢查是否有值，回傳布林值
