1. 引言
在数据存储领域,数据库主要分为关系型数据库和非关系型数据库两大类。本文将从数据类型、SQL语法、典型产品等多个维度,对这两类数据库进行系统梳理。
2. 关系型数据库
关系型数据库以表格形式组织数据,表与表之间存在关联关系,是传统企业应用中最主流的数据库类型。
2.1 核心特征
- 表结构:数据以行和列组成的二维表存储。
- 表间关联:通过主键和外键建立表与表之间的关联关系。
- SQL语法:使用结构化查询语句(SQL)进行数据操作,各数据库基本一致,仅存在细微差异。
2.2 典型数据表
以电商系统为例,关系型数据库通常包含以下核心数据表:
- 用户表:存储用户基本信息。
- 用户收货地址表:存储用户的收货地址信息,与用户表关联。
- 用户订单表:存储用户订单信息,与用户表关联。
- 用户订单详情表:存储订单中的商品明细,与订单表关联。
2.3 主要产品
关系型数据库主要有以下几类典型产品:
- 大型数据库:包括 Oracle 和 SqlServer,主要面向企业级应用。
- 轻量级数据库:MySql 是应用最广泛的开源关系型数据库。
- 轻量级文件数据库:sqlite 以单文件形式存储,适合嵌入式和小型应用场景。
3. 非关系型数据库
非关系型数据库又称 NoSQL(Not Only SQL),主要面向海量数据和灵活多变的业务需求,不再局限于传统的表结构。
3.1 核心特征
- 灵活存储:不再使用固定的表结构,数据模型更加灵活。
- 海量数据:更适合处理大规模、高并发的数据场景。
- 弹性扩展:支持水平扩展,适应业务快速增长。
3.2 主要类型
- 文档数据库:以文档形式存储数据,典型代表是 MongoDB。
- 内存数据库:数据存储在内存中,读写速度极快,典型代表是 Redis。
4. MySQL 安装与配置
MySQL 是应用最广泛的开源关系型数据库,下面介绍在 Ubuntu 环境下的安装、启动、登录与远程连接配置。
4.1 安装方式
安装 MySQL 主要有以下两种方式:
- 使用 MySQL 官方镜像:通过 wget 下载官方 apt 配置包并安装,再执行 apt update 和 apt install mysql-server。
- 直接使用 Ubuntu 镜像:在 Ubuntu 软件源中直接执行 apt install mysql-server 安装。
使用官方镜像安装的具体命令如下:
bash
wget https://dev.mysql.com/get/mysql-apt-config_0.8.40-1_all.deb
sudo dpkg -i mysql-apt-config_0.8.40-1_all.deb
sudo apt update
apt install mysql-server
4.2 启动服务
安装完成后,可通过以下命令启动 MySQL 服务:
bash
systemctl start mysql
# 或
service mysql start
如需指定配置文件启动,可使用 mysqld 命令并指定配置文件路径:
bash
mysqld --defaults-file=/etc/mysql/my.cnf
4.3 登录数据库
使用以下命令登录 MySQL 数据库:
bash
mysql -u root -p
在 Ubuntu 环境下,也可以直接使用 Ubuntu 的 root 用户免密登录到 MySQL。
4.4 远程连接配置
如需允许远程连接,需要进行以下配置:
- 修改配置文件:编辑 /etc/mysql/mysql.conf.d/mysqld.cnf,将 bind_address 设置为 0.0.0.0。
- 重启服务:执行 systemctl restart mysql 或 service mysql restart 使配置生效。
- 开放用户权限:将目标用户的 host 设置为 "%",允许从任意主机连接。
- 配置云安全组:在阿里云、腾讯云等平台设置防火墙模板或安全组,放行 MySQL 端口。
5. SQL 语句详解
SQL(Structured Query Language)是操作关系型数据库的标准语言,主要分为 DDL、DML 和 DCL 三大类型。
5.1 SQL 类型
- DDL(数据定义语言):用于数据库与表的创建、修改和删除,主要包括 Create、Alter、Drop。
- DML(数据操作语言):用于数据的增删改查(CURD),主要包括 select、insert、update、delete。
- DCL(数据控制语言):用于用户与权限管理,用户操作包括 Create、Alter、Drop,权限操作包括 Grant、Revoke。
5.2 数据库相关操作
查看所有数据库:
sql
show databases;
创建数据库(可指定字符集):
sql
create database qiku character set utf8;
create database qiku;
create database if not exists qiku character set utf8;
查看当前数据库(只有选择数据库以后才能操作表):
sql
select database();
切换数据库:
sql
use 数据库名;
删除数据库:
sql
drop database 数据库名;
修改数据库编码:
sql
alter database 数据库名 character set utf8;
5.3 数据操作(CURD)
查找(Read):查询所有数据,大表效率低下,慎用。
sql
select * from 表名;
插入(Create):全列插入,按顺序写入每一个列的值,values 后可以插入多行。
sql
insert into 表名 values (值1, 值2, ...);
缺省插入,利用特殊列(有默认值、自增长),values 后可以插入多行。
sql
insert into 表名 (列1, 列2, ...) values (值1, 值2, ...);
insert into 表名 set 列1=值1, 列2=值2, ...;
修改(Update):
sql
update 表名 set 列1=值1, 列2=值2, ... where 条件;
删除(Delete):
sql
delete from 表名 where 条件;
5.4 数据表相关操作
查看已经选择的数据库的所有表:
sql
show tables;
创建表,常用约束包括 primary key(主键)、not null(非空)、auto_increment(自增长):
sql
create table 表名 (
列名 类型 约束1 约束2 ...,
列名 类型 约束1 约束2 ...
);
修改表结构:
sql
alter table 表名 add 列名 类型 约束...;
alter table 表名 change 原列名 新列名 类型 约束...;
alter table 表名 drop 列名;
alter table 表名 rename 新表名;
查看表描述:
sql
desc 表名;
删除表:
sql
drop table 表名;
5.5 用户与权限
创建用户,主机可指定为 %(所有主机均可访问)或具体 IP(如 192.168.13.13):
sql
create user '用户名'@'主机' identified by '123456';
修改密码:
sql
alter user '用户名'@'主机' identified by '123456';
删除用户:
sql
drop user '用户名'@'主机';
分配权限:
sql
grant 权限1, ... on qiku.* to '用户名'@'主机';
取消权限:
sql
revoke 权限1, ... on qiku.* from '用户名'@'主机';
6. 约束详解
约束用于限制表中数据的合法性和完整性,是保证数据质量的重要手段。下面介绍 MySQL 中常用的约束类型及其用法。
6.1 主键约束(primary key)
主键约束用于唯一确定表中的每一行数据,要求字段值必须存在且内容不重复。一个表通常只能有一个主键,但可以由多个字段共同组成组合主键。
例如,在用户权限表中,Host 与 User 两个字段可以共同组成 User 表的主键。
6.2 非空约束(not null)
非空约束要求字段值不能为空,适用于必须填写内容的列。
6.3 默认值(default)
默认值约束用于在插入数据时未显式指定该列值时,自动填入预设的默认值。例如:
sql
default 100
default '男'
6.4 唯一约束(Unique)
唯一约束要求字段值不能存在重复项,保证数据的唯一性。
6.5 自增长(auto_increment)
自增长约束会自动维护最大的增长值,每次插入数据时自动加 1,常用于主键列。
6.6 检查约束(check)
检查约束用于限制字段值的取值范围,例如:
sql
check (age > 0)
6.7 外键约束(foreign key)
外键约束用于建立表与表之间的关联关系,保证数据引用的完整性。外键关联通常包含以下操作:
- 创建表时设置外键:在建表语句中直接定义外键。
- 给已有表设置外键:通过 alter table 语句为已有表添加外键。
- 删除外键:通过 alter table 语句删除外键。
创建表时设置外键的语法如下:
sql
create table 表名 (
...,
primary key (id),
constraint fk_表_列 foreign key (列) references 表(列)
on delete cascade on update cascade
);
给已有表设置外键的语法如下:
sql
alter table 表名 add constraint fk_表_列 foreign key (列) references 表(列)
on delete cascade on update cascade;
删除外键的语法如下:
sql
alter table 表名 drop foreign key 外键名;
7. 数据类型详解
数据类型用于定义表中每一列可以存储的数据种类和范围,是建表时的重要基础。MySQL 的数据类型主要分为数字、字符串和日期时间三大类。
7.1 数字类型
数字类型用于存储整数和小数,常用类型及存储大小如下:
- int:占用 4 字节,是最常用的整数类型。
- BIGINT:占用 8 字节,适合存储较大的整数。
- MEDIUMINT:占用 3 字节,介于小整数和普通整数之间。
- SMALLINT:占用 2 字节,适合存储较小的整数。
- TINYINT:占用 1 字节,取值范围为 -128 到 127,适合存储布尔值或小范围状态。
- FLOAT:占用 4 字节,单精度浮点数。
- DOUBLE:占用 8 字节,双精度浮点数。
- DECIMAL(M,D):定点数,M 表示总位数,D 表示有效小数位数,适合存储金额等需要精确计算的数值。
7.2 字符串类型
字符串类型用于存储文本数据,常用类型如下:
- VARCHAR(m):可变长度字符串,存储空间取决于实际内容长度,适合存储长度不固定的文本。
- CHAR(M):定长字符串,无论实际内容多长都占用固定空间,适合存储长度固定的数据。
- TEXT:用于存储较长的文本内容。
- ENUM('A','B'):枚举类型,只能从预设的取值列表中选择一个值。
7.3 日期时间类型
日期时间类型用于存储日期和时间数据,常用类型如下:
- Date:存储日期,格式为年-月-日。
- time:存储时间,格式为时:分:秒。
- DateTime:存储日期和时间,格式为年-月-日 时:分:秒。
- timestamp:时间戳类型,常用于记录数据的创建时间和修改时间。
使用 timestamp 记录创建时间时,可设置默认值为当前时间:
sql
default current_timestamp
使用 timestamp 记录修改时间时,可在数据更新时自动刷新为当前时间:
sql
default current_timestamp on update current_timestamp
8. 查询详解
查询是 SQL 中使用最频繁的操作,下面从查询所有、部分列、条件、聚合函数、分页、排序、分组与过滤等方面系统介绍查询语法。
8.1 查询所有
查询表中所有数据,大表效率低下,慎用:
sql
select * from 表名;
8.2 查询部分列
只查询指定列,可指定表名限定列,也可使用别名:
sql
select 列名, ... from 表名;
select 表.列名, ... from 表名;
select 列名 as 别名, ... from 表名;
8.3 条件查询(where)
where 用于筛选满足条件的记录,常用运算符如下:
- 比较运算符:=、!=、<>、<、<=、>、>=。
- 逻辑运算符:and、or、not。
- 空判断:is null、is not null。
- 范围:字段 between a and b、字段 in (a, b, c)。
- 模糊查询:字段 like '黄%'、字段 like '黄_',其中 % 代表任意个字符,_ 代表一个字符。
8.4 聚合函数
聚合函数用于对一组数据进行统计计算,常用函数如下:
- max:求最大值。
- min:求最小值。
- avg:求平均值。
- sum:求和。
- count:统计个数。
8.5 分页(limit)
limit 用于限制查询返回的行数,实现分页效果:
sql
limit n; -- 前 n 个
limit start, count; -- start 开始索引,从 0 开始,取 count 个
limit (n-1)*m, m; -- 每页显示 m 个,查询第 n 页内容
8.6 排序(order by)
order by 用于对查询结果排序,asc 升序,desc 降序:
sql
order by 列名 asc/desc; -- 单条件
order by 列名1 asc, 列名2 asc, ...; -- 多条件
8.7 分组(group by)与过滤(having)
group by 用于按指定列分组统计,having 针对分组结果进行过滤:
sql
select count(*), 列名 from 表名 group by 列名;
select count(*), 列名 from 表名 group by 列名 having count(*) > 5;
9. MongoDB 安装与配置
MongoDB 是典型的文档型数据库,数据以文档形式存储,无固定结构,适合海量数据和灵活多变的业务需求。下面介绍在 Ubuntu 环境下通过官方源安装 MongoDB 8.0 并启动服务的方法。
9.1 导入官方 GPG 密钥
首先安装依赖工具并导入 MongoDB 官方 GPG 密钥:
bash
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
9.2 添加 MongoDB APT 源
将 MongoDB 8.0 的 APT 源写入系统源列表:
bash
echo "deb [ arch=amd64,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
9.3 更新并安装
更新软件源并安装 MongoDB 社区版:
bash
sudo apt-get update
sudo apt-get install -y mongodb-org
9.4 启动服务
使用 mongod 命令并指定配置文件启动 MongoDB 服务:
bash
mongod --config /etc/mongod.conf
10. Redis 安装与配置
Redis 是典型的内存数据库,以键值对形式存储数据,读写速度极快,适合缓存、会话管理等场景。下面介绍在 Ubuntu 环境下安装、启动、连接 Redis 以及常用数据类型和配置项。
10.1 安装与启动
通过 apt 安装 Redis 服务端:
bash
apt install redis-server
使用 redis-server 命令并指定配置文件启动 Redis 服务:
bash
redis-server /etc/redis/redis.cnf
使用 redis-cli 连接 Redis 服务:
bash
redis-cli
10.2 字符串类型
字符串是 Redis 中最基础的数据类型,常用操作如下:
- 设置键值对:set k v、mset k1 v1 ...。
- 获取键对应的值:get k、mget k1 k3 ...。
- 自增自减:incr 使值加 1,incrby key n 按指定步长增加;decr 使值减 1,decrby key n 按指定步长减少。
- 长度:strlen 获取值的长度。
10.3 键的操作
- 查看所有键:key *。
- 查看类型:type key 查看键对应的值的类型。
- 删除键值对:del key。
- 判断是否存在:exists key。
- 查看存活时间:ttl key,返回 -2 表示键不存在,-1 表示永久有效。
- 设置有效期:expire key seconds。
10.4 列表
- 插入:lpush 从左侧插入,rpush 从右侧插入。
- 删除:lpop 从左侧删除,rpop 从右侧删除。
- 长度:llen 获取列表元素个数。
- 范围查询:lrange key start stop 获取指定索引范围内的元素,其中 0 和 -1 表示全部元素。
10.5 哈希
- 设置字段与值:hset、hmset。
- 获取字段对应的值:hget、hmget。
- 字段个数:hlen。
- 获取所有字段与值:hgetall key。
- 删除指定字段:hdel key field。
- 判断字段是否存在:hexists key field。
10.6 集合
集合中的元素无序且不重复,常用操作如下:
- 添加元素:sadd。
- 删除元素:srem。
- 查看所有成员:smembers。
- 判断是否为成员:sismember。
- 集合运算:sinter 求交集,sunion 求并集,sdiff 求差集。
10.7 有序集合
有序集合中的每一个元素都有一个权重,通过权重实现排序,常用操作如下:
- 插入:zadd。
- 删除:zrem。
- 个数:zcard。
- 按权重排序查询:zrange 使用索引,zrangebyscore 根据权重返回。
- 返回元素对应的权重:zscore。
10.8 常用配置
- database:默认数据库个数,默认为 16。
- bind_ip:设置为 0.0.0.0 以支持远程连接。
- port:监听端口,默认为 6379。
- daemonize:设置为 yes 以守护进程方式运行。
- loglevel:日志级别,默认为 notice。
- logfile:日志文件路径,如 /var/log/redis/redis-server.log。
- save:保存策略,例如 save 900 1 表示 900 秒内有 1 个 key 被更改则写入磁盘。
- AOF 持久化:通过 appendonly 和 appendfsync 配置。
- dbfilename:数据库文件名,默认为 dump.rdb。
- 主从复制:replicaof 指定主节点地址,格式为 replicaof <masterip> <masterport>;masterauth 配置主机密码。
- requirepass:设置本机访问密码,如 requirepass foobared。
- maxclients:最大连接数,如 maxclients 10000。
- maxmemory:最大内存限制。