MySQL 客戶端連線
# Windows (WAMP 範例)
cd C:\wamp\bin\mysql\mysql5.5.8\bin
mysql.exe -h localhost -u root -p
# 登入後設定編碼避免中文亂碼
SET NAMES utf8mb4;
參數說明:-h 主機、-u 使用者、-p 密碼(建議不帶密碼讓終端機提示輸入,避免歷史紀錄洩露)。
資料庫管理
| 操作 | SQL 指令 |
| 建立資料庫 | CREATE DATABASE db_name CHARSET utf8mb4; |
| 刪除資料庫 | DROP DATABASE db_name; |
| 列出資料庫 | SHOW DATABASES; |
| 切換資料庫 | USE db_name; |
常用資料型別
| 分類 | 型別 | 說明 |
| 整數 | TINYINT | 1 位元組 (-128~127) |
| SMALLINT | 2 位元組 |
| MEDIUMINT | 3 位元組 |
| INT | 4 位元組(最常用) |
| BIGINT | 8 位元組 |
| 浮點數 | FLOAT | 單精度 4 位元組 |
| DOUBLE | 雙精度 8 位元組 |
| 字串 | CHAR(n) | 固定長度,最多 255 字元,適合 MD5、手機號 |
| VARCHAR(n) | 可變長度,最多 65,535 位元組,通用文字 |
| 日期時間 | DATE | YYYY-MM-DD |
| TIME | HH:MM:SS |
| DATETIME | YYYY-MM-DD HH:MM:SS(推薦) |
資料表操作
建立資料表範例
CREATE TABLE user_info (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(20) NOT NULL,
email VARCHAR(100) UNIQUE,
age TINYINT UNSIGNED DEFAULT 0,
balance DECIMAL(10,2) DEFAULT 0.00,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
欄位屬性關鍵字:
AUTO_INCREMENT:自動遞增(通常搭配 PRIMARY KEY)
PRIMARY KEY:主鍵,唯一識別每列
NOT NULL:禁止空值
DEFAULT value:預設值
UNIQUE:值唯一
UNSIGNED:無負號(整數型別)
查看表結構
DESC user_info;
SHOW CREATE TABLE user_info;
CRUD 核心操作
INSERT 新增
-- 指定欄位(推薦,順序可互換)
INSERT INTO user_info (username, email, age) VALUES ('Alice', 'alice@example.com', 25);
-- 多筆批次插入(高效能)
INSERT INTO user_info (username, email) VALUES
('Bob', 'bob@example.com'),
('Cindy', 'cindy@example.com');
SELECT 查詢
-- 基礎查詢
SELECT id, username, email FROM user_info WHERE age > 20;
-- 排序與分頁
SELECT * FROM user_info ORDER BY created_at DESC LIMIT 0, 10; -- 第 1 頁
SELECT * FROM user_info ORDER BY created_at DESC LIMIT 10, 10; -- 第 2 頁
-- 聚合函數
SELECT COUNT(*) AS total, AVG(age) AS avg_age FROM user_info;
UPDATE 修改
UPDATE user_info SET age = 26, balance = 100.50 WHERE username = 'Alice';
-- 避免無 WHERE 導致全表更新!
DELETE 刪除
DELETE FROM user_info WHERE id = 5;
-- 條件刪除
DELETE FROM user_info WHERE age > 60 AND balance = 0;
WHERE 條件組合技巧
| 邏輯 | SQL | 說明 |
| AND | age > 20 AND balance > 100 | 同時滿足 |
| OR | age < 18 OR is_vip = 1 | 滿足任一 |
| IN | status IN (1,2,3) | 集合包含 |
| BETWEEN | created_at BETWEEN '2024-01-01' AND '2024-12-31' | 範圍(含邊界) |
| LIKE | username LIKE 'A%' | 模糊比對,% 任意長度,_ 單字元 |
| IS NULL | email IS NULL | 空值判斷 |
PHP 連線範例
<?php
$host = '127.0.0.1';
$db = 'my_db';
$user = 'root';
$pass = 'password';
$charset = 'utf8mb4';
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
try {
$pdo = new PDO($dsn, $user, $pass, $options);
echo "連線成功";
} catch (PDOException $e) {
die("連線失敗: " . $e->getMessage());
}
// 預備語句防 SQL 注入
$stmt = $pdo->prepare('SELECT * FROM user_info WHERE username = ?');
$stmt->execute(['Alice']);
$user = $stmt->fetch();
?>
最佳實踐提醒
- 永遠使用預備語句,杜絕 SQL 注入。
- 欄位明確列出,避免
SELECT * 暴露敏感欄位、增加網路傳輸。
- 索引優化:
WHERE、JOIN、ORDER BY 涉及欄位建立索引。
- 編碼統一 utf8mb4:支援 Emoji 與完整 Unicode。
- 避免在迴圈執行 SQL:改用批次
INSERT 或 IN 查詢。