关系型数据库与非关系型数据库详解

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:最大内存限制。
相关推荐
崖边看雾1 小时前
MySQL——SQL 经典练习题:学生选课成绩查询(附详细注释)
大数据·数据库·sql·mysql
众壹新能源科技1 小时前
经营口径与运维口径不一致时,发电量报表怎么对账
运维·数据库·人工智能
jyOverQ1 小时前
MySQL 索引为什么能加快查询?B+Tree 到底是什么?
数据库·mysql
天天进步20151 小时前
Pixelle-Video 源码解析 #17:TTS 语音生成:Edge-TTS、Index-TTS 如何接入?
前端·数据库
鸽芷咕1 小时前
异构数据同步,凭什么敢说数据不丢?——拆解金仓KFS的全周期一致性校验
数据库
海浪仙人掌2 小时前
账龄分析的定义是什么?账龄分析有什么作用?
数据库
ACP广源盛139246256732 小时前
M6/M5 Pro Mac mini 端侧 AI 落地@ACP#IX6024 PCIe2.0 交换芯片在轻量化 AI 服务中的机会与应用场景
大数据·数据库·人工智能·嵌入式硬件·macos·开源
ly76892 小时前
深入解析 MySQL 间隙锁:从加锁规则到死锁案例
数据库·mysql·死锁·间隙锁·next-key lock·事务隔离
LRL_2 小时前
7x24小时不停机:基于 Apache SeaTunnel 实现 Oracle to Oracle 实时 CDC 同步全实战
数据库·oracle·apache