-- 標準語法
INSERT INTO table_name (col1, col2, col3) VALUES (val1, val2, val3);
-- 批量插入(高效)
INSERT INTO users (name, email) VALUES
('Alice', 'alice@test.com'),
('Bob', 'bob@test.com'),
('Carol', 'carol@test.com');
-- 查詢結果插入
INSERT INTO archive_users SELECT * FROM users WHERE created_at < '2023-01-01';
-- 忽略重複鍵
INSERT IGNORE INTO users (id, name) VALUES (1, 'Test');
-- 衝突更新
INSERT INTO users (id, name, cnt) VALUES (1, 'Test', 1)
ON DUPLICATE KEY UPDATE cnt = cnt + 1;
mysql -u root -p
USE testdb;
INSERT INTO tutorials (title, author, created_at) VALUES
('Learn PHP', 'John', NOW()),
('Learn MySQL', 'Abdul', NOW()),
('Java Tutorial', 'Sanjay', '2023-05-06');
要點:
'val' 或雙引號 "val"NOW() 返回當前 datetime,自增列無需指定-> 為提示符換行標識,非 SQL 一部分<?php
$host = 'localhost'; $user = 'root'; $pass = 'pass'; $db = 'testdb';
$mysqli = new mysqli($host, $user, $pass, $db);
if ($mysqli->connect_errno) die('Connect failed: ' . $mysqli->connect_error);
$title = $_POST['title'] ?? '';
$author = $_POST['author'] ?? '';
$date = $_POST['date'] ?? date('Y-m-d');
// 預處理防注入
$stmt = $mysqli->prepare('INSERT INTO tutorials (title, author, created_at) VALUES (?, ?, ?)');
$stmt->bind_param('sss', $title, $author, $date);
if ($stmt->execute()) {
echo 'Inserted ID: ' . $stmt->insert_id;
} else {
echo 'Error: ' . $stmt->error;
}
$stmt->close();
$mysqli->close();
?>
安全要點:
prepare() + bind_param() 完全防 SQL 注入magic_quotes_gpc 避免雙重轉義(PHP 5.4+ 已移除)-- 基礎查詢 SELECT col1, col2 FROM table WHERE condition ORDER BY col2 DESC LIMIT 10; -- 聚合統計 SELECT COUNT(*), SUM(amount), AVG(price), MAX(date), MIN(id) FROM orders; -- 分組聚合 SELECT category, COUNT(*) AS cnt, AVG(price) AS avg_price FROM products GROUP BY category HAVING cnt > 5; -- 多表連接 SELECT u.name, o.order_no, o.amount FROM users u LEFT JOIN orders o ON u.id = o.user_id WHERE o.status = 'paid';
mysql -u root -p -e "SELECT * FROM tutorials LIMIT 5;" testdb # 垂直顯示 mysql -u root -p -e "SELECT * FROM tutorials LIMIT 1\G" testdb # 導出 CSV mysql -u root -p --batch --raw -e "SELECT * FROM tutorials" testdb | sed 's/\t/,/g' > out.csv
<?php
$mysqli = new mysqli('localhost', 'root', 'pass', 'testdb');
$sql = 'SELECT id, title, author, created_at FROM tutorials ORDER BY created_at DESC LIMIT 20';
$result = $mysqli->query($sql);
if ($result) {
// 關聯數組遍歷
while ($row = $result->fetch_assoc()) {
echo "ID: {$row['id']}
";
echo "Title: {$row['title']}
";
echo "Author: {$row['author']}
";
echo "Date: {$row['created_at']}
";
}
$result->free(); // 釋放結果集內存
} else {
echo 'Query failed: ' . $mysqli->error;
}
$mysqli->close();
?>
fetch 方法對比:
| 方法 | 返回類型 | 索引方式 |
|---|---|---|
fetch_assoc() | 關聯數組 | 字段名 |
fetch_array(MYSQLI_ASSOC) | 關聯數組 | 字段名 |
fetch_array(MYSQLI_NUM) | 數字數組 | 0-based 索引 |
fetch_object() | 對象 | 屬性訪問 |
WHERE id > last_id LIMIT 10 (游標分頁)$result->free() 或 mysqli_free_result() 防止內存洩漏LOAD DATA INFILE 導入大數據