MariaDB 教程
什么是 MariaDB?
MariaDB 是 MySQL 数据库管理系统的一个分支。它由其原始开发者创建。这款 DBMS 工具为小型和企业级任务提供数据处理能力。
MariaDB 是 MySQL 的一个改进版本。它内置了众多强大的功能,并在可用性、安全性和性能方面有许多改进,这些都是在 MySQL 中找不到的。
以下是 MariaDB 的特点:
- 它在 GPL、BSD 或 LGPL 许可证下运行。
- MariaDB 支持一种流行且标准的查询语言。
- 它拥有多种存储引擎,包括可以与其他关系型数据库管理系统集成的高性能引擎。
- 它提供了 Galera 集群技术。
- MariaDB 支持 PHP,一种流行的 Web 开发语言。
- MariaDB 可以在不同的操作系统上运行,并支持多种编程语言。
- MariaDB 附带了 MySQL 中没有的额外命令。MySQL 的一些特性对 DBMS 的性能有负面影响。这些特性在 MariaDB 中已被替换。
MariaDB vs. MySQL
以下是 MariaDB 与 MySQL 之间的一些关键区别
参数 | MariaDB | MySQL |
---|---|---|
更多存储引擎选项 | MariaDB 有 12 种新的存储引擎,这些在 MySQL 中是找不到的。 | 与 MariaDB 相比,它的存储选项更少。 |
速度提升 | 与 MySQL 相比,MariaDB 显示出更快的速度。它拥有众多用于优化速度的功能。这些功能包括派生视图/表、子查询、执行控制、磁盘访问和优化器控制。 | 与 MariaDB 相比,MySQL 的速度较慢。它仅依赖少数几个功能进行速度优化,例如哈希索引。 |
更快的缓存/索引 | 使用 MariaDB 的内存存储引擎,一个 INSERT 语句的完成速度比标准 MySQL 快 24%。 | MySQL 的内存存储引擎比 MariaDB 的慢。 |
更大更快的连接池 | MariaDB 附带一个先进的线程池,能够运行得更快,并支持高达 200,000+ 的连接。 | MySQL 提供的线程池一次无法支持高达 200,000 个连接。 |
改进的复制 | 在 MariaDB 中,复制可以更安全、更快地完成。更新速度也比传统 MySQL 快 2 倍。 | MySQL 的社区版允许静态数量的线程连接。MySQL 的企业版则带有线程功能。 |
新功能/扩展 | MariaDB 带有新功能和扩展,包括 JSON、WITH 和 KILL 语句。 | MySQL 中不提供新的 MariaDB 功能。 |
缺失的功能 | MariaDB 缺少 MySQL 企业版提供的一些功能。为了解决这个问题,它提供了替代的开源插件。因此,MariaDB 用户能够享受到与 MySQL 企业版用户相同的功能。 | MySQL 的企业版使用专有代码。只有 MySQL 企业版的用户才能访问此代码。 |
如何安装 MariaDB
作为独立应用程序安装
为了使用 MariaDB,您需要将其安装在您的计算机上。
可以按照以下步骤进行安装
步骤 1) 打开以下 URL
从链接 https://downloads.mariadb.org/ 下载安装文件
步骤 2) 双击文件以开始安装
下载完成后,打开文件
步骤 3) 点击“下一步”按钮
在弹出的窗口中,点击“下一步”按钮
步骤 4) 接受许可协议
然后点击“下一步”按钮
步骤 5) 选择 MariaDB Server
选择要安装的功能,然后点击“下一步”
步骤 6) 输入密码
在下一个窗口中,您需要为 root 用户更改密码。
- 输入密码并通过重新输入相同的密码来确认。如果您想允许从远程机器访问,请激活必要的复选框。
- 完成后,点击“下一步”按钮。
步骤 7) 输入名称并选择端口号
在下一个窗口中,输入实例名称,选择端口号,并设置必要的大小。点击“下一步”按钮
步骤 8) 点击下一步
在下一个窗口中,只需点击“下一步”按钮。
步骤 9) 点击安装
通过点击“安装”按钮启动安装。
步骤 10) 显示进度条
将显示一个进度条,显示安装进度
步骤 11) 点击完成按钮
安装完成后,您将看到“完成”按钮。点击该按钮关闭窗口
步骤 12) 恭喜!
您现在已经在您的计算机上安装了 MariaDB。
使用命令提示符
现在您已在计算机上安装了 MariaDB,是时候启动并开始使用它了。这可以通过 MariaDB 命令提示符完成。
请按照以下步骤操作
步骤 1) 点击“开始”,选择“所有程序”,然后点击 MariaDB...
步骤 2) 选择 MariaDB 命令提示符。
步骤 3) MariaDB 命令提示符将启动。现在是时候登录了。您应该以 root 用户身份登录,并使用您在安装 MariaDB 期间设置的密码。在命令提示符中输入以下命令
MySQL -u root -p
步骤 4) 输入密码并按回车键。您应该已登录,如下所示
您现在已登录到 MariaDB。
数据类型
MariaDB 支持以下数据类型
- 字符串数据类型
- 数值数据类型
- 日期/时间数据类型
- 大对象数据类型
字符串数据类型
这些包括以下内容
字符串数据类型 | 描述 |
---|---|
char(size) | size 表示要存储的字符数。它最多存储 255 个字符。固定长度字符串。 |
varchar(size) | size 表示要存储的字符数。它最多存储 255 个字符。可变长度字符串。 |
text(size) | size 表示要存储的字符数。它最多存储 255 个字符。固定长度字符串。 |
binary(size) | size 表示要存储的字符数。它最多存储 255 个字符。固定大小字符串。 |
数字数据类型
它们包括以下内容
数字数据类型 | 描述 |
---|---|
bit | 一个非常小的整数值,相当于 tinyint(1)。有符号值的范围在 -128 和 127 之间。无符号值的范围在 0 和 255 之间。 |
int(m) | 一个标准的整数值。有符号值的范围在 -2147483648 到 2147483647 之间。无符号值的范围在 0 到 4294967295 之间。 |
float(m, d) | 一个单精度浮点数。 |
double(m,d) | 一个双精度浮点数。 |
float(p) | 一个浮点数。 |
日期/时间数据类型
这些包括以下内容
日期/时间数据类型 | 描述 |
---|---|
Date | 以 'yyyy-mm-dd' 格式显示。值的范围在 '1000-01-01' 和 '9999-12-31' 之间。 |
Datetime | 以 'yyyy-mm-dd hh:mm:ss' 格式显示。值的范围在 '1000-01-01 00:00:00' 和 '9999-12-31 23:59:59' 之间。 |
timestamp(m) | 以 'yyyy-mm-dd hh:mm:ss' 格式显示。值的范围在 '1970-01-01 00:00:01' UTC 和 '2038-01-19 03:14:07' UTC 之间。 |
时间管理 | 以 'hh:mm:ss' 格式显示。值的范围在 '-838:59:59' 和 '838:59:59' 之间。 |
大对象数据类型 (LOB)
它们包括以下内容
大对象数据类型 | 描述 |
---|---|
tinyblob | 其最大大小为 255 字节。 |
blob(size) | 最大大小为 65,535 字节。 |
mediumblob | 其最大大小为 16,777,215 字节。 |
longtext | 它以 4GB 为最大大小。 |
创建数据库和表
要在 MariaDB 中创建一个新的数据库,您应该拥有仅授予 root 用户和管理员的特殊权限。
要创建一个新的数据库,您应该使用 CREATE DATABASE 命令,其语法如下
CREATE DATABASE DatabaseName;
在这种情况下,您需要创建一个名为 Demo 的数据库。
启动 MariaDB 命令提示符,并以 root 用户身份登录,输入以下命令
mysql -u root -p
输入 root 密码并按回车键。您将被登录。
现在,运行以下命令
CREATE DATABASE Demo;
您已经创建了一个名为 Demo 的数据库。最好确认一下数据库是否创建成功。您只需通过运行以下命令来显示可用数据库的列表
SHOW DATABASES;
以上输出显示 Demo 数据库在列表中,因此数据库已成功创建。
MariaDB 选择数据库
为了能够使用或操作特定的数据库,您必须从可用数据库列表中选择它。选择数据库后,您可以执行诸如在该数据库中创建表之类的任务。
要选择一个数据库,您应该使用 USE 命令。它采用以下语法
USE database_name;
您需要使用 Demo 数据库。您可以通过运行以下命令来选择它
USE Demo;
上图显示 MariaDB 命令提示符已从 none 更改为已选定数据库的名称。
您现在可以继续在 Demo 数据库中创建表了。
MariaDB – 创建表
要创建一个表,您必须已经选择了一个数据库。可以使用 CREATE TABLE 语句创建表。以下是该命令的语法
CREATE TABLE tableName (columnName columnType);
您可以将其中一列设置为主键。此列不应允许空值。
我们将在 Demo 数据库中创建两个表,Book 表和 Price 表。每个表将有两列。
让我们从创建包含 id 和 name 两列的 Book 表开始。运行以下命令
CREATE TABLE Book( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(100) NOT NULL, PRIMARY KEY (id));
PRIMARY KEY 约束已用于将 id 列设置为此表的主键。AUTO_INCREMENT 属性将为插入到表中的每条新记录自动将 id 列的值加 1。所有列都不允许空值。
现在,创建第二个表,Price 表
CREATE TABLE Price( id INT NOT NULL AUTO_INCREMENT, price float NOT NULL, PRIMARY KEY (id));
id 列已被设为该表的主键。
显示表
既然您已经创建了这两个表,最好确认一下这些表是否创建成功。您可以通过运行以下命令来显示数据库中包含的表列表
SHOW TABLES;
上面的截图显示,这两个表已在 Demo 数据库中成功创建。
显示表结构
要查看任何特定表的结构,您可以使用 DESCRIBE 命令,通常缩写为 DESC。它采用以下语法
DESC TableName;
例如,要查看名为 Book 的表的结构,您可以运行以下命令;
DESC Book;
该表有两列。要查看 Price 表的结构,您可以运行以下命令
DESC Price;
CRUD 和子句
INSERT
要向 MariaDB 表中插入数据,您应该使用 INSERT INTO 语句。此命令采用以下语法
INSERT INTO tableName (column_1, column_2, ... ) VALUES (value1, value2, ... ), (value1, value2, ... ), ...;
上面的语法显示,您必须指定要插入数据的表列以及您需要插入的数据。
让我们向 Book 表中插入一条记录
INSERT INTO book (id, name) VALUES(1, 'MariaDB Book');
您已向表中插入了一条记录。向 Price 表中插入一条记录
INSERT INTO price (id, price) VALUES(1, 200);
记录已创建。
SELECT
SELECT 语句帮助我们查看或看到数据库表的内容。例如,要查看 Book 表的内容,您需要运行以下命令
SELECT * from book;
现在,查看 Price 表的内容
SELECT * from price;
插入多条记录
我们可以一次性向 MariaDB 表中插入多条记录。为了演示这一点,请运行以下示例
INSERT INTO book (id, name) VALUES (2,'MariaDB Book2'), (3,'MariaDB Book3'), (4,'MariaDB Book4'), (5,'MariaDB Book5');
您可以查询该表以检查记录是否已成功插入
SELECT * FROM book;
记录已成功插入。通过运行此示例向 Price 表中插入多条记录
INSERT INTO price (id, price) VALUES (2, 250), (3, 220), (4, 190), (5, 300);
让我们确认一下记录是否已成功创建
SELECT * FROM price;
UPDATE
UPDATE 命令帮助我们更改或修改已插入表中的记录。您可以将其与 WHERE 子句结合使用,以指定要更新的记录。以下是语法
UPDATE tableName SET field=newValue, field2=newValue2,... [WHERE ...]
UPDATE 命令也可以与 SET、WHERE、LIMIT 和 ORDER BY 等子句结合使用。您很快就会看到这一点
考虑名为 Price 的表,其中包含以下记录
我们来把 id 为 1 的书的价格从 200 改为 250
UPDATE price SET price = 250 WHERE id = 1;
命令成功运行。您现在可以查询该表以查看更改是否生效
上面的截图显示更改已实现。考虑 Book 表,其中包含以下记录
让我们把名为 Book 的书的名称改为 MariaDB Book1。请注意,这本书的 id 为 1。以下是此操作的命令
UPDATE book SET name = “MariaDB Book1” WHERE id = 1;
检查更改是否已实施
上面的截图显示更改已成功实施。
在上面的示例中,我们一次只更改了一列。但是,我们可以一次性更改多列。让我们用一个例子来演示这一点。
让我们使用包含以下数据的 Price 表
我们来更改 id 为 5 的书的 id 和价格。我们将把它的 id 改为 6,价格改为 6。运行以下命令
UPDATE price SET id = 6, price = 280 WHERE id = 5;
现在,查询该表以检查更改是否成功
更改成功。
删除
当我们需要从表中删除一条或多条记录时,我们使用 DELETE 命令。以下是该命令的语法
DELETE FROM tableName [WHERE condition(s)] [ORDER BY exp [ ASC | DESC ]] [LIMIT numberRows];
考虑 Price 表,其中包含以下记录
我们需要从表中删除最后一条记录。它的 id 是 6,价格是 280。让我们删除这条记录
DELETE FROM price WHERE id = 6;
命令成功运行。让我们查询该表以确认删除是否成功
输出显示记录已成功删除。
Where
WHERE 子句帮助我们指定需要进行更改的确切位置。它与 INSERT、SELECT、UPDATE 和 DELETE 等语句一起使用。考虑包含以下数据的 Price 表
假设我们需要查看价格低于 250 的记录。我们可以运行以下命令
SELECT * FROM price WHERE price < 250;
所有价格低于 250 的记录都已返回。
WHERE 子句可以与 AND 语句结合使用。假设我们需要查看 Price 表中所有价格低于 250 且 id 大于 3 的记录。我们可以运行以下命令
SELECT * FROM price WHERE id > 3 AND price < 250;
只返回了一条记录。原因是它必须满足所有指定的条件,即 id 大于 3 且价格低于 250。如果违反了这些条件中的任何一个,则该记录将不会被返回。
该子句也可以与 OR 命令结合使用。让我们用 OR 替换我们之前命令中的 AND,看看我们会收到什么样的输出
SELECT * FROM price WHERE id > 3 OR price < 250;
我们现在得到 2 条记录,而不是 1 条。这是因为,要使一条记录合格,它只需要满足指定的条件之一。
Like
此子句用于在访问需要精确匹配的表数据时指定数据模式。它可以与 INSERT、UPDATE、SELECT 和 DELETE 语句结合使用。
您应该将您正在寻找的数据模式传递给该子句,它将返回 true 或 false。以下是可以与该子句一起使用的通配符
- %: 用于匹配 0 个或多个字符。
- _: 用于匹配单个字符。
这是 LIKE 子句的语法
SELECT field_1, field_2,... FROM tableName1, tableName2,... WHERE fieldName LIKE condition;
让我们演示如何使用带有 % 通配符的子句。我们将使用包含以下记录的 Book 表
我们需要查看所有名称以 M 开头的记录。我们可以运行以下命令
SELECT name FROM book WHERE name LIKE 'M%';
所有记录都已返回,因为它们的名称都以字母 M 开头。要查看所有以 4 结尾的名称,您可以运行以下命令
SELECT name FROM book WHERE name LIKE '%4';
只返回了一个名字,因为它是唯一一个满足条件的。
我们也可以用通配符包围搜索模式
SELECT name FROM book WHERE name LIKE '%DB%';
除了 % 通配符,LIKE 子句还可以与 _ 通配符一起使用。这是下划线通配符,它只会查找单个字符。
让我们使用包含以下记录的 Price 表
我们来检查价格为 1_0 的记录。我们运行以下命令
SELECT * FROM price WHERE price LIKE '1_0';
它返回了价格为 190 的记录。我们也可以尝试另一种模式
SELECT * FROM price WHERE price LIKE '_2_';
我们可以将 LIKE 子句与 NOT 运算符一起使用。这将返回所有不符合指定模式的记录。例如
让我们使用包含以下记录的 Price 表
我们来找出所有价格不是以 2 开头的记录
SELECT * FROM price WHERE price NOT LIKE '2%';
只有一条记录不符合指定的模式。
Order By
该子句帮助我们按升序或降序对记录进行排序。我们将其与 SELECT 语句一起使用,如下所示
SELECT expression(s) FROM tables [WHERE condition(s)] ORDER BY exp [ ASC | DESC ];
我们可以使用这个子句而不添加 ASC 或 DESC 部分。例如
我们将使用包含以下记录的 Price 表
对该表运行以下命令
SELECT * FROM price WHERE price LIKE '2%.' ORDER BY price;
在上面的命令中,我们按价格排序。记录已按价格升序排列。这意味着当我们不指定顺序时,默认按升序排序。
让我们运行带有 DESC 选项的子句
SELECT * FROM price WHERE price LIKE '2%' ORDER BY price DESC;
记录已按我们指定的价格降序排序。
让我们使用 ORDER BY 子句和 ASC 属性
SELECT * FROM price WHERE price LIKE '2%.' ORDER BY price ASC;
记录已按价格升序排序。这与我们使用 ORDER BY 子句时不带 ASC 或 DESC 属性时类似。
DISTINCT
这个子句帮助我们在从表中选择记录时消除重复项。这意味着它帮助我们获得唯一的记录。其语法如下所示
SELECT DISTINCT expression(s) FROM tableName [WHERE condition(s)];
为了演示这一点,我们将使用包含以下数据的 Price 表
当我们从表中选择价格列时,得到以下结果
SELECT price FROM Price;
我们有两条价格为 250 的记录,造成了重复。我们需要只有唯一的记录。我们可以使用 DISTINCT 子句来过滤这些记录,如下所示
SELECT DISTINCT price FROM Price;
现在上面的输出中没有任何重复项。
From
FROM 子句用于从数据库表中获取数据。它在连接表时也很有用。以下是该命令的语法
SELECT columnNames FROM tableName;
要查看 book 表的内容,请运行以下命令
SELECT * FROM price;
该子句可以帮助您仅从数据库表中获取单个列。例如
SELECT price FROM Price;
高级任务
存储过程
过程是一个可以向其传递参数的 MariaDB 程序。过程不返回值。要创建一个过程,我们使用 CREATE PROCEDURE 命令。
为了演示如何创建和调用一个过程,我们将创建一个名为 myProcedure() 的过程,它帮助我们从 book 表中选择 name 列。以下是该过程
DELIMITER $ CREATE PROCEDURE myProcedure() BEGIN SELECT name FROM book; END; ;
该过程已创建。我们只是将 SELECT 语句包含在过程的 BEGIN 和 END 子句中。
现在,我们可以通过其名称调用该过程,如下所示
CALL myProcedure();
该过程在被调用时返回 book 表的 name 列。
我们可以创建一个接受参数的过程。例如,我们需要选择书的名称,并使用书的 id 进行筛选。我们可以为此创建以下过程
DELIMITER $ CREATE PROCEDURE myProcedure2(book_id int) BEGIN SELECT name FROM book WHERE id = book_id; END; ;
上面,我们创建了一个名为 myProcedure2() 的过程。这个过程接受一个名为 book_id 的整数参数,这是我们需要查看其名称的书的 id。要查看 id 为 3 的书的名称,我们可以如下调用该过程
CALL myProcedure2(3);
函数
与过程不同,我们必须向函数传递参数,并且函数必须返回一个值。要在 MariaDB 中创建一个函数,我们使用 CREATE FUNCTION 语句。该语句采用以下语法
CREATE [ DEFINER = { CURRENT-USER | username } ] FUNCTION function-name [(parameter datatype [, parameter datatype]) ] RETURNS datatype [LANGUAGE SQL | DETERMINISTIC | NOT DETERMINISTIC | {CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA} | SQL SECURITY {DEFINER | INVOKER} | COMMENT 'comment' BEGIN declaration-section executable-section END;
以上参数说明如下
参数 | 描述 |
---|---|
DEFINER 子句 | 此参数是可选的。如果您不指定它,定义者将成为创建该函数的用户。如果需要指定不同的定义者,请包含 DEFINER 子句,其中 user_name 将是该函数的定义者。 |
function_name | 要分配给 MariaDB 中此函数的名称。 |
parameter | 传递给函数的参数。在创建函数期间,所有参数都被视为 IN 参数 (而不是 OUT/INOUT 参数)。 |
return_datatype | 函数返回值的类型。 |
LANGUAGE SQL | 它影响可移植性,但不影响函数。 |
DETERMINISTIC | 当给定一定数量的参数时,该函数将只返回一个结果。 |
NOT DETERMINISTIC | 当给定一定数量的参数时,该函数可能会返回不同的结果。 |
CONTAINS SQL | 通知 MariaDB 此函数包含 SQL。数据库不会验证这是否为真。 |
NO SQL | 此子句未使用,对您的函数没有影响。 |
READS SQL DATA | 告诉 MariaDB 该函数将使用 SELECT 语句读取数据,但不会修改数据。 |
MODIFIES SQL DATA | 告诉 MariaDB 该函数将使用 INSERT、DELETE、UPDATE 和其他 DDL 语句来修改 SQL 数据。 |
declaration-section | 这是应该声明局部变量的地方。 |
executable-section | 函数代码应该添加到这里。 |
这是一个 MariaDB 函数的例子
DELIMITER // CREATE FUNCTION sumFunc (x INT ) RETURNS INT DETERMINISTIC BEGIN DECLARE sum INT; SET sum = 0; label1: WHILE sum <= 3000 DO SET sum = sum + x; END WHILE label1; RETURN sum; END; // DELIMITER ;
然后我们可以如下调用上述函数
select sumFunc(1000);
该命令将返回以下内容
一旦你用完一个函数,最好删除它。这很简单,你只需要调用 DROP FUNCTION 语句,它有以下语法
DROP FUNCTION function_name;
例如,要删除名为 myFunc 的函数,我们可以运行以下命令
DROP FUNCTION myFunc;
JOIN
当您需要一次从多个表中检索数据时,请使用 MariaDB JOINS。这意味着 JOIN 作用于两个或多个表。MariaDB 支持以下三种类型的 JOINS
- INNER/SIMPLE JOIN(内连接/简单连接)
- LEFT OUTER JOIN/LEFT JOIN(左外连接/左连接)
- RIGHT OUTER JOIN/RIGHT JOIN(右外连接/右连接)
让我们逐一讨论它们
INNER JOIN
内连接返回连接条件为真的表中的所有行。其语法如下
SELECT columns FROM table-1 INNER JOIN table-2 ON table-1.column = table-2.column;
例如
我们将使用我们的两个表,books 和 book。
book 表有以下数据
Price 表包含以下数据
目标是将 Book 表中的 name 列和 Price 表中的 price 列连接成一个单独的表。这可以通过内连接实现,如下所示
SELECT book.name, price.price FROM book INNER JOIN price ON book.id = price.id;
该命令返回以下内容
LEFT OUTER JOIN
此连接返回左表中的所有行,以及右表中连接条件为真的行。其语法如下
SELECT columns FROM table-1 LEFT [OUTER] JOIN table-2 ON table-1.column = table-2.column;
OUTER 关键字被放在方括号内,因为它是可选的。
例如
SELECT book.name, price.price FROM book LEFT JOIN price ON book.id = price.id;
该命令返回以下内容
上表中的最后一条记录在左侧没有匹配的值。这就是为什么它被替换为 NULL。
RIGHT OUTER JOIN
此连接返回右侧表中的所有行,以及另一表中连接条件为真的行。其语法如下
SELECT columns FROM table-1 RIGHT [OUTER] JOIN table-2 ON table-1.column = table-2.column;
OUTER 关键字被放在方括号内,因为它是可选的。
例如
SELECT book.name, price.price FROM book RIGHT JOIN price ON book.id = price.id;
该命令返回以下内容
原因在于右表中的所有行都与另一表中的行匹配。如果某些行不匹配,我们会在第一列中看到 NULL 值。