Hello World

知识库
知识库文档
/tech-stacks/mariadb/examples/Hello World.md

文档

目标

通过 MariaDB CLI 和 Python 驱动完成数据库创建、CRUD 操作,体验 MariaDB 与 MySQL 的命令兼容性。

💡 MariaDB 的客户端命令、SQL 语法与 MySQL 完全相同,所有 MySQL 工具(mysql、mysqldump 等)均适用于 MariaDB。

环境准备

mysql -u root -p
# 或 Docker:
docker exec -it mariadb-dev mysql -u root -proot123

第一步:CLI 操作

-- 创建数据库(MariaDB 独有:支持 OR REPLACE)
CREATE OR REPLACE DATABASE hello_mariadb CHARACTER SET utf8mb4;
USE hello_mariadb;

-- 创建表(体验 MariaDB CHECK 约束)
CREATE TABLE employees (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    department VARCHAR(50),
    salary DECIMAL(10,2) CHECK(salary > 0),
    hire_date DATE DEFAULT (CURRENT_DATE),
    INDEX idx_dept (department)
);

-- 插入
INSERT INTO employees (name, department, salary) VALUES
    ('张三', '技术部', 15000.00),
    ('李四', '市场部', 12000.00),
    ('王五', '技术部', 18000.00),
    ('赵六', '人事部', 10000.00);

-- 查询
SELECT * FROM employees ORDER BY salary DESC;

-- MariaDB 独有:EXCEPT(差集)
SELECT department FROM employees WHERE department = '技术部';

-- 聚合
SELECT department, COUNT(*) AS cnt, AVG(salary) AS avg_sal
FROM employees
GROUP BY department
HAVING cnt >= 1
ORDER BY avg_sal DESC;

-- 窗口函数(MariaDB 10.2+ 支持)
SELECT name, department, salary,
    RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dept_rank
FROM employees;

第二步:Python 操作

pip install mariadb  # 推荐使用 MariaDB 官方 Connector
import mariadb
import sys

try:
    conn = mariadb.connect(
        host="localhost",
        user="root",
        password="root123",
        database="hello_mariadb"
    )
except mariadb.Error as e:
    print(f"连接错误: {e}")
    sys.exit(1)

cur = conn.cursor()

# 创建表
cur.execute("""
    CREATE TABLE IF NOT EXISTS products (
        id INT AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(100) NOT NULL,
        price DECIMAL(8,2) CHECK(price >= 0),
        category VARCHAR(30),
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    )
""")

# 批量插入
products = [
    ("机械键盘", 299.00, "外设"),
    ("无线鼠标", 89.00, "外设"),
    ("显示器", 1999.00, "显示"),
]
cur.executemany(
    "INSERT INTO products (name, price, category) VALUES (?, ?, ?)",
    products
)
conn.commit()

# 查询 + 参数化
cur.execute(
    "SELECT name, price FROM products WHERE price > ? ORDER BY price DESC",
    (100,)
)
for name, price in cur.fetchall():
    print(f"{name}: ¥{price}")

# 事务
try:
    cur.execute("UPDATE products SET price = price * 0.9 WHERE category = ?", ("外设",))
    cur.execute("SELECT ROW_COUNT()")
    updated = cur.fetchone()[0]
    print(f"打折影响 {updated} 行")
    conn.commit()
except:
    conn.rollback()

cur.close()
conn.close()

第三步:使用 RETURNING 子句(MariaDB 独有)

-- MariaDB 10.5+ 支持 RETURNING
INSERT INTO products (name, price, category)
VALUES ('USB Hub', 49.00, '外设')
RETURNING id, name, created_at;
-- 直接返回新插入行的数据,无需再 SELECT

预期输出

# CLI 窗口函数
name   | department | salary  | dept_rank
-------|------------|---------|-----------
王五   | 技术部     | 18000.00| 1
张三   | 技术部     | 15000.00| 2
李四   | 市场部     | 12000.00| 1
赵六   | 人事部     | 10000.00| 1

# Python
显示器: ¥1999.00
机械键盘: ¥299.00
打折影响 2

信息

路径
/tech-stacks/mariadb/examples/Hello World.md
更新时间
2026/5/31