ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

三大数据库从入门到实战

三大数据库从入门到实战 一、MySQL —— 关系型数据库的基石1.1 版本选择MySQL主要分为两个版本版本特点适用场景企业版Enterprise收费只包含稳定功能提供官方技术支持大型企业生产环境社区版Community免费包含新版本测试功能个人学习、中小型项目具体版本方面5.7经典版本维护旧项目时需要使用8.0进阶版本新开发项目首选重要提醒MySQL 8.0社区版已于2026年4月正式结束生命周期End-of-Life不再提供公开的安全更新和漏洞修复。官方推荐升级到MySQL 8.4 LTS首个长期支持版本提供5年支持周期至2031年。如果你正在启动新项目建议直接选择8.4 LTS。1.2 安装Ubuntu环境方式一使用官方APT源安装推荐# 下载官方配置包 wget https://dev.mysql.com/get/mysql-apt-config_0.8.40-1_all.deb # 配置APT源 sudo dpkg -i mysql-apt-config_0.8.40-1_all.deb # 更新并安装 sudo apt update sudo apt install mysql-server方式二直接使用Ubuntu镜像源sudo apt install mysql-server1.3 服务管理与登录# 启动MySQL服务 sudo systemctl start mysql # 或 sudo service mysql start # 登录数据库root用户可直接免密登录 mysql -u root -p1.4 远程连接配置# 修改配置文件 sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf # 将 bind_address 改为 0.0.0.0 bind_address 0.0.0.0 # 重启服务 sudo systemctl restart mysql # 开放用户远程访问权限在MySQL中执行 UPDATE user SET host % WHERE user root; FLUSH PRIVILEGES;如果使用阿里云、腾讯云等云服务器还需要在安全组/防火墙中开放3306端口。二、MySQL 核心SQL语句2.1 数据库操作DDL-- 查看所有数据库 SHOW DATABASES; -- 创建数据库指定字符集 CREATE DATABASE qiku CHARACTER SET utf8; -- 或安全创建存在则不创建 CREATE DATABASE IF NOT EXISTS qiku CHARACTER SET utf8; -- 查看当前使用的数据库 SELECT DATABASE(); -- 切换数据库 USE qiku; -- 修改数据库编码 ALTER DATABASE qiku CHARACTER SET utf8; -- 删除数据库 DROP DATABASE qiku;2.2 数据表操作-- 查看当前数据库所有表 SHOW TABLES; -- 创建表 CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, -- 主键自增长 name VARCHAR(50) NOT NULL, -- 非空 age INT DEFAULT 0, -- 默认值 email VARCHAR(100) UNIQUE -- 唯一约束 ); -- 查看表结构 DESC users; -- 修改表添加列 ALTER TABLE users ADD phone VARCHAR(20); -- 修改表修改列 ALTER TABLE users CHANGE name username VARCHAR(50); -- 修改表删除列 ALTER TABLE users DROP phone; -- 修改表重命名 ALTER TABLE users RENAME TO members; -- 删除表 DROP TABLE users;2.3 数据操作DML - CRUD插入数据Create-- 全列插入按顺序写入所有列的值 INSERT INTO users VALUES (1, 张三, 25, zhangsanemail.com); -- 缺省插入指定列自增长列和默认列可省略 INSERT INTO users (name, age, email) VALUES (李四, 30, lisiemail.com); -- 批量插入 INSERT INTO users (name, age, email) VALUES (王五, 28, wangwuemail.com), (赵六, 22, zhaoliuemail.com); -- 使用SET方式插入 INSERT INTO users SET name小明, age18, emailxiaomingemail.com;查询数据Read-- 查询所有数据大表慎用 SELECT * FROM users; -- 查询部分列 SELECT id, name, age FROM users; -- 带别名查询 SELECT name AS 姓名, age AS 年龄 FROM users; -- 条件查询 SELECT * FROM users WHERE age 20; SELECT * FROM users WHERE name ! 张三; SELECT * FROM users WHERE age BETWEEN 20 AND 30; SELECT * FROM users WHERE name IN (张三, 李四); -- 模糊查询 SELECT * FROM users WHERE name LIKE 张%; -- 以张开头 SELECT * FROM users WHERE name LIKE 张_; -- 张加一个字 -- 空值判断 SELECT * FROM users WHERE email IS NULL; SELECT * FROM users WHERE email IS NOT NULL; -- 聚合函数 SELECT COUNT(*) FROM users; -- 统计总数 SELECT MAX(age), MIN(age), AVG(age), SUM(age) FROM users; -- 分组 过滤 SELECT age, COUNT(*) FROM users GROUP BY age HAVING COUNT(*) 1; -- 排序 SELECT * FROM users ORDER BY age DESC; -- 降序 -- 分页每页10条第2页 SELECT * FROM users LIMIT 10 OFFSET 10; -- 或 SELECT * FROM users LIMIT 10, 10;更新数据Update-- 更新指定条件的数据 UPDATE users SET age 26 WHERE name 张三; -- 批量更新 UPDATE users SET age age 1 WHERE age 30;删除数据Delete-- 删除指定条件的数据 DELETE FROM users WHERE id 5; -- 删除所有数据慎用 DELETE FROM users;2.4 用户与权限管理DCL-- 创建用户 CREATE USER lxy% IDENTIFIED BY 123456; -- % 表示任意主机 CREATE USER lxy192.168.13.13 IDENTIFIED BY 123456; -- 修改密码 ALTER USER lxy% IDENTIFIED BY newpassword; -- 分配权限授予 qiku 数据库的所有权限 GRANT ALL PRIVILEGES ON qiku.* TO lxy%; -- 取消权限 REVOKE ALL PRIVILEGES ON qiku.* FROM lxy%; -- 查看权限 SHOW GRANTS FOR lxy%; -- 删除用户 DROP USER lxy%; -- 刷新权限 FLUSH PRIVILEGES;2.5 SQL语言分类速查分类全称包含命令作用DDL数据定义语言CREATE, ALTER, DROP定义数据库和表结构DML数据操作语言SELECT, INSERT, UPDATE, DELETE数据的增删改查CRUDDCL数据控制语言GRANT, REVOKE用户与权限管理三、MySQL 进阶知识3.1 约束Constraints约束关键字说明主键约束PRIMARY KEY唯一标识一行不可为空、不可重复非空约束NOT NULL列值不能为空默认值DEFAULT未指定值时使用默认值唯一约束UNIQUE列值不能重复自增长AUTO_INCREMENT自动1递增检查约束CHECK(age 0)限制值的范围外键约束FOREIGN KEY表与表之间的关联-- 创建表时设置外键 CREATE TABLE orders ( id INT PRIMARY KEY AUTO_INCREMENT, user_id INT, amount DECIMAL(10,2), CONSTRAINT fk_orders_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE ON UPDATE CASCADE ); -- 给已有表添加外键 ALTER TABLE orders ADD CONSTRAINT fk_orders_user FOREIGN KEY (user_id) REFERENCES users(id); -- 删除外键 ALTER TABLE orders DROP FOREIGN KEY fk_orders_user;3.2 数据类型速查分类类型字节说明整数TINYINT1-128 ~ 127SMALLINT2MEDIUMINT3INT4最常用BIGINT8浮点FLOAT4单精度DOUBLE8双精度DECIMAL(M,D)变长M总位数D小数位字符串CHAR(M)定长固定长度VARCHAR(M)变长可变长度最常用TEXT变长长文本ENUM(A,B)枚举日期DATE日期TIME时间DATETIME日期时间TIMESTAMP时间戳创建时间与更新时间自动维护CREATE TABLE logs ( id INT PRIMARY KEY AUTO_INCREMENT, content TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );3.3 关联关系与关联查询三种关联关系关系说明外键位置案例一对一一个对应一个任意一方用户表 ↔ 用户详情表一对多一个对应多个多方用户表 ↔ 订单表多对多多个对应多个第三张表文章表 ↔ 标签表关联查询示例-- 内连接只返回匹配的数据 SELECT u.name, o.amount FROM users u INNER JOIN orders o ON u.id o.user_id; -- 左外连接返回左表所有数据 SELECT u.name, o.amount FROM users u LEFT JOIN orders o ON u.id o.user_id; -- 右外连接 SELECT u.name, o.amount FROM users u RIGHT JOIN orders o ON u.id o.user_id;3.4 备份与恢复# 备份数据库为SQL文件 mysqldump -uroot -p qiku qiku.sql # 恢复数据库 mysql -uroot -p qiku qiku.sql四、MongoDB —— 文档型数据库4.1 什么是MongoDBMongoDB是一个文档型数据库数据以JSON-like 文档的形式存储无固定结构非常适合存储灵活多变的数据。与MySQL的对比MySQL有固定的表结构Schema必须先定义后使用MongoDB无固定结构同一集合中的文档可以有不同字段4.2 安装Ubuntu# 1. 导入官方GPG密钥 sudo apt-get install gnupg curl curl -fsSL https://pgp.mongodb.com/server-8.0.asc | \ sudo gpg -o /usr/share/keyrings/mongodb-server-8.0.gpg --dearmor # 2. 添加MongoDB APT源Ubuntu 22.04 echo deb [ archamd64,arm64 signed-by/usr/share/keyrings/mongodb-server-8.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/8.0 multiverse | sudo tee /etc/apt/sources.list.d/mongodb-org-8.0.list # 3. 更新并安装 sudo apt-get update sudo apt-get install -y mongodb-org4.3 启动与连接# 启动MongoDB mongod --config /etc/mongod.conf # 连接MongoDB mongosh4.4 MongoDB 8.0 新特性MongoDB 8.0 在性能上有了显著提升Advanced TCMalloc新的内存分配器采用每CPU缓存策略减少内存碎片在高负载下保持稳定性能复制协议重构majority写关注不再等待Secondary完成数据应用显著降低写入延迟Secondary并行应用Oplog的拉取与应用解耦并行同步吞吐量大幅提升重分片性能提升reshardCollection大幅加速支持基于相同分片键优化分布五、Redis —— 内存数据库5.1 什么是RedisRedis是一个基于内存的键值对数据库以极快的读写速度著称。适合存储缓存数据、Session、计数器等高频访问的数据。核心特点数据存储在内存中读写速度极快支持多种数据类型字符串、列表、哈希、集合、有序集合支持数据持久化RDB AOF支持主从复制、哨兵、集群5.2 安装与启动# 安装 sudo apt install redis-server # 启动 redis-server /etc/redis/redis.conf # 连接 redis-cli5.3 Redis 数据类型与操作字符串String# 设置键值对 SET name 张三 MSET name 张三 age 25 city 北京 # 获取值 GET name MGET name age city # 自增/自减 INCR views # 1 INCRBY views 10 # 10 DECR views # -1 DECRBY views 5 # -5 # 获取长度 STRLEN name键Key操作# 查看所有键 KEYS * # 查看键的类型 TYPE name # 删除键 DEL name # 检查键是否存在 EXISTS name # 查看键的剩余存活时间秒 TTL name # -2 不存在-1 永久 # 设置过期时间秒 EXPIRE name 60列表List# 左侧/右侧插入 LPUSH list a b c RPUSH list d e # 左侧/右侧弹出 LPOP list RPOP list # 获取列表长度 LLEN list # 获取指定范围元素0 -1 表示全部 LRANGE list 0 -1 LRANGE list 0 2哈希Hash# 设置字段 HSET user:id1001 name 张三 HMSET user:id1001 age 25 city 北京 # 获取字段 HGET user:id1001 name HMGET user:id1001 name age city # 获取所有字段和值 HGETALL user:id1001 # 获取字段数量 HLEN user:id1001 # 删除字段 HDEL user:id1001 city # 检查字段是否存在 HEXISTS user:id1001 name集合Set—— 无序、不重复# 添加元素 SADD fruits apple banana orange # 删除元素 SREM fruits banana # 获取所有成员 SMEMBERS fruits # 检查是否为成员 SISMEMBER fruits apple # 交集 SINTER set1 set2 # 并集 SUNION set1 set2 # 差集 SDIFF set1 set2有序集合Sorted Set—— 带权重排序# 添加元素权重在前 ZADD rank 100 张三 90 李四 85 王五 # 删除元素 ZREM rank 李四 # 获取元素个数 ZCARD rank # 按权重排序使用索引 ZRANGE rank 0 -1 # 升序 ZREVRANGE rank 0 -1 # 降序 # 按权重范围返回 ZRANGEBYSCORE rank 80 100 # 获取元素对应的权重 ZSCORE rank 张三5.4 Redis 配置详解配置文件位置/etc/redis/redis.conf# 数据库数量默认16个 databases 16 # 绑定IP0.0.0.0 允许远程连接 bind 0.0.0.0 # 端口 port 6379 # 守护进程模式后台运行 daemonize yes # 日志级别 loglevel notice # 日志文件 logfile /var/log/redis/redis-server.log # RDB持久化策略N秒内M个key变化则保存 save 900 1 # 900秒内至少1个key变化 save 300 10 # 300秒内至少10个key变化 save 60 10000 # 60秒内至少10000个key变化 # RDB文件名 dbfilename dump.rdb # AOF持久化 appendonly yes appendfsync everysec # 每秒同步一次 # 主从复制 replicaof masterip masterport masterauth password # 密码认证 requirepass foobared # 最大连接数 maxclients 10000 # 最大内存 maxmemory 4gb六、Python 操作数据库pymysqlimport pymysql # 1. 建立连接 conn pymysql.connect( hostlocalhost, userroot, password123456, databaseqiku, charsetutf8 ) # 2. 建立游标 cursor conn.cursor() # 3. 执行SQL参数化防止SQL注入 sql INSERT INTO users (name, age, email) VALUES (%s, %s, %s) cursor.execute(sql, (小明, 18, xiaomingemail.com)) # 批量插入 data [(小红, 20, xiaohongemail.com), (小刚, 22, xiaogangemail.com)] cursor.executemany(sql, data) # 查询数据 cursor.execute(SELECT * FROM users) result cursor.fetchone() # 获取一条 results cursor.fetchmany(5) # 获取多条 all_results cursor.fetchall() # 获取全部 # 移动游标 cursor.scroll(-1, relativerelative) # 相对移动 cursor.scroll(0, absoluteabsolute) # 绝对移动 # 4. 提交事务 conn.commit() # 5. 关闭游标和连接 cursor.close() conn.close()
返回列表