relational-database和MySQL概述

引言

无论是电商订单、个人博客内容还是企业核心业务数据,relational-database始终是现代应用持久化存储的基石。而在众多relational-database中,MySQL凭借开源免费、高性能、生态成熟的优势,在Web开发及Python项目中占据绝对主导地位。本文将从零开始,用通俗易懂的方式带你掌握relational-database的核心概念、MySQL的基础操作,并通过实际代码演示如何用Python连接数据库,为后续的数据库开发之旅打好基础。

1. relational-database核心基础

1.1 什么是relational-database?

relational-database建立在关系模型之上,核心思想是把数据组织成二维表格(表),表与表之间通过“关系”连接起来。你可以把它想象成一个结构化的Excel工作簿:每个工作表就是一张表,每一行代表一条完整记录,每一列代表一个字段。

更具体地说,它具备以下几个关键特征:

  • 表存数据:每个表对应现实世界的一类对象,比如“员工表”“部门表”。
  • 行列明确:每一行是一条完整记录(如“张三这个员工”),每一列是对象的一个属性(如“张三的邮箱”)。
  • 唯一标识:每张表都有主键,保证记录不重复、能精准定位。
  • 表间关联:通过外键串联不同表的数据,减少冗余存储。
  • 数据约束:通过规则(如“邮箱不能为空”“薪资必须大于零”)保证数据的准确性和完整性。

1.2 可靠的保障:ACID特性

relational-database能够胜任银行转账、订单支付这类对数据一致性要求极高的场景,核心原因就在于它严格遵循ACID四大特性:

特性大白话解释
原子性操作要么全部完成,要么全部失败——转账时不会出现“扣了钱但余额没增加”的情况。
一致性操作前后数据都符合业务规则——转账前后两人账户总金额不变。
隔离性多个操作同时进行互不干扰——两人同时抢购最后一件库存,不会出现超卖。
持久性操作完成后数据永久保存——即使服务器重启,订单记录也不会丢失。

1.3 什么时候选关系型?什么时候选非关系型?

为了帮助你根据实际需求做出选择,这里做一个简单对比:

对比维度relational-database(MySQL/Oracle)非relational-database(MongoDB/Redis)
数据结构固定表结构,适合结构化数据灵活的JSON/键值对,适合非结构化数据
扩展方式主要靠升级服务器配置(垂直扩展)主要靠增加服务器数量(水平扩展)
事务支持强事务支持,适用于敏感业务事务支持有限或仅支持简单事务
查询能力支持复杂关联查询关联查询能力较弱
典型场景银行、电商、企业ERP社交内容存储、高并发缓存

2. 热门选择:MySQL快速入门

2.1 为什么选择MySQL?

  • 开源免费:个人或小团队使用Community版完全够用,符合GPL协议。
  • 跨平台:Windows、Linux、macOS均可轻松部署。
  • 生态丰富:Python、Java、Go等主流语言都有成熟驱动,文档和社区支持完善。
  • 性能卓越:默认的InnoDB引擎支持事务、行级锁和高并发,读写性能出色。

2.2 常用存储引擎

MySQL支持多种存储引擎,新手只需记住:绝大部分场景首选InnoDB

-- 查看所有支持的存储引擎
SHOW ENGINES;

-- 查看当前默认引擎
SELECT @@default_storage_engine;

不同引擎的特点对比如下:

引擎特点适用场景
InnoDB支持事务、外键、行级锁,崩溃恢复能力强几乎所有的常规业务场景(默认引擎)
MyISAM读取速度极快,支持全文搜索,但不支持事务和外键只读或读多写少的场景,如博客文章归档
Memory数据存储在内存中,读写极快,但断电即丢失临时表、热点数据缓存

3. 本地environment-setup

下面只介绍社区版的快速安装方法,生产环境建议进一步参考官方文档加强安全配置。

3.1 Windows安装(推荐MySQL Installer)

  1. 访问MySQL官网下载页面
  2. 下载mysql-installer-community(无需注册Oracle账号,点击下方“No thanks, just start my download.”即可)
  3. 运行安装程序,选择Server only(或通过Custom手动选择组件)
  4. 按照提示设置root密码、端口(默认3306)
  5. 安装完成后,打开命令行输入mysql -u root -p,输入密码验证是否成功

3.2 Ubuntu/Debian安装(一行命令起步)

# 更新包列表
sudo apt update

# 安装MySQL Server
sudo apt install mysql-server -y

# 安全配置(必做!)
sudo mysql_secure_installation

# 验证安装
sudo mysql -u root -p

3.3 基本连接命令

# 本地连接(root用户)
mysql -u root -p

# 连接到指定数据库
mysql -u root -p -D company_db

# 连接远程服务器(替换hostname和username)
mysql -h 192.168.1.100 -u app_user -p

4. 数据库与表的基础操作

接下来,我们创建一个公司管理系统的数据库练手,逐步掌握建库、建表和表结构修改。

4.1 数据库操作

-- 创建数据库(指定字符集,支持中文和emoji)
CREATE DATABASE IF NOT EXISTS company_db
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

-- 使用指定数据库
USE company_db;

-- 查看所有数据库
SHOW DATABASES;

-- 删除数据库(谨慎操作!)
DROP DATABASE IF EXISTS old_test_db;

4.2 表操作(创建部门表和员工表)

先创建被关联的部门表,再创建员工表并建立外键关联:

-- 先创建被关联的部门表
CREATE TABLE departments (
    dept_id INT AUTO_INCREMENT PRIMARY KEY, -- 主键,自增
    dept_name VARCHAR(100) UNIQUE NOT NULL, -- 部门名唯一且不能为空
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- 自动记录创建时间
);

-- 再创建员工表(关联部门表)
CREATE TABLE employees (
    emp_id INT AUTO_INCREMENT PRIMARY KEY,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    salary DECIMAL(10, 2) NOT NULL CHECK (salary > 0), -- 薪资必须大于0
    hire_date DATE NOT NULL,
    dept_id INT, -- 外键,关联部门表的dept_id
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- 自动更新修改时间
    
    -- 建立索引,加速查询
    INDEX idx_emp_email (email),
    INDEX idx_emp_dept (dept_id),
    
    -- 建立外键约束
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
        ON DELETE SET NULL -- 部门删除时,员工的dept_id设为NULL
        ON UPDATE CASCADE -- 部门dept_id修改时,同步更新员工dept_id
);

-- 查看表结构
DESCRIBE employees;

-- 修改表结构(例如增加手机号列)
ALTER TABLE employees ADD COLUMN phone VARCHAR(20);

5. 基础SQL:数据增删改查

5.1 插入数据(INSERT)

-- 插入单个部门
INSERT INTO departments (dept_name) 
VALUES ('技术部');

-- 批量插入部门
INSERT INTO departments (dept_name)
VALUES ('产品部'), ('财务部'), ('运营部');

-- 插入单个员工
INSERT INTO employees (first_name, last_name, email, salary, hire_date, dept_id)
VALUES ('张', '三', 'zhangsan@tech.com', 15000.00, '2023-01-01', 1);

-- 批量插入员工
INSERT INTO employees (first_name, last_name, email, salary, hire_date, dept_id)
VALUES 
    ('李', '四', 'lisi@tech.com', 18000.00, '2023-03-15', 1),
    ('王', '五', 'wangwu@product.com', 12000.00, '2023-05-20', 2);

5.2 查询数据(SELECT)

-- 基本查询:查询技术部所有员工的姓名、邮箱、薪资,并按薪资降序排列
SELECT first_name, last_name, email, salary
FROM employees
WHERE dept_id = 1
ORDER BY salary DESC;

-- 关联查询:查询每个员工及其所属部门名称
SELECT 
    e.first_name, 
    e.last_name, 
    d.dept_name
FROM employees e
LEFT JOIN departments d ON e.dept_id = d.dept_id;

-- 聚合查询:查询每个部门的平均薪资和人数,只显示人数大于1的部门
SELECT 
    d.dept_name,
    COUNT(e.emp_id) AS emp_count,
    AVG(e.salary) AS avg_salary
FROM departments d
LEFT JOIN employees e ON d.dept_id = e.dept_id
GROUP BY d.dept_id
HAVING COUNT(e.emp_id) > 1;

6. Python快速对接MySQL

Python操作MySQL有两种主流方式:原生PyMySQL(轻量直观,适合快速对接)和SQLAlchemy ORM(面向对象,适合复杂项目)。这里先介绍最基础的PyMySQL用法。

6.1 原生PyMySQL(入门首选)

先安装依赖:

pip install pymysql

示例代码(包含安全的上下文管理器和参数化查询):

import pymysql
from contextlib import contextmanager

# 数据库连接配置(请替换为你的实际密码)
DB_CONFIG = {
    "host": "localhost",
    "user": "root",
    "password": "your_password",
    "database": "company_db",
    "charset": "utf8mb4"
}

@contextmanager
def get_db_conn():
    """上下文管理器:自动处理提交、回滚和关闭连接"""
    conn = None
    try:
        conn = pymysql.connect(**DB_CONFIG)
        yield conn
        conn.commit()
    except Exception as e:
        if conn:
            conn.rollback()
        raise e
    finally:
        if conn:
            conn.close()

# 示例:查询技术部的所有员工
def get_tech_employees():
    with get_db_conn() as conn:
        with conn.cursor(pymysql.cursors.DictCursor) as cursor:
            sql = """
                SELECT first_name, last_name, salary 
                FROM employees 
                WHERE dept_id = %s
            """
            cursor.execute(sql, (1,))  # 参数化查询,防止SQL注入
            return cursor.fetchall()

# 运行测试
print(get_tech_employees())

相关教程

数据库是练出来的!基于本文的公司管理系统数据库,你可以尝试以下练习: 1. 添加更多员工和部门 2. 将产品部所有员工的薪资上浮10% 3. 查找薪资最高的3名员工

总结

本文从relational-database的核心概念出发,介绍了MySQL的特点、安装和基本操作,最后通过Python代码演示了如何与数据库交互。掌握这些内容后,你已经具备了Python数据库开发的入门基础。

后续如果需要深入学习,可以继续关注这些方向:

  • 复杂SQL查询与子查询
  • SQLAlchemy ORM的高级用法
  • 数据库性能优化与索引设计
  • 数据库安全、备份与恢复