MariaDB – 快速指南

MariaDB – 快速指南


MariaDB – 简介

数据库应用程序与主应用程序分开存在并存储数据集合。每个数据库都使用一个或多个 API 来创建、访问、管理、搜索和复制其包含的数据。

数据库还使用非关系数据源,例如对象或文件。然而,数据库证明是大型数据集的最佳选择,大型数据集会受到其他数据源检索和写入缓慢的影响。

关系数据库管理系统或 RDBMS 将数据存储在各种表中。这些表之间的关系是使用主键和外键建立的。

RDBMS 提供以下功能 –

  • 它们使您能够实现具有表、列和索引的数据源。

  • 它们确保跨多个表的行的引用的完整性。

  • 它们会自动更新索引。

  • 他们在操作或从表中获取数据时解释 SQL 查询和操作。

RDBMS 术语

在我们开始讨论 MariaDB 之前,让我们回顾一些与数据库相关的术语。

  • 数据库– 数据库是由包含相关数据的表组成的数据源。

  • 表格– 表格,即电子表格,是包含数据的矩阵。

  • Column – 一列,表示数据元素,是一种保存一种类型数据的结构;例如,发货日期。

  • Row – 行是对相关数据进行分组的结构;例如,客户的数据。它也称为元组、条目或记录。

  • 冗余– 该术语是指将数据存储两次以加速系统。

  • 主键– 这是指唯一的识别值。该值不能在一个表中出现两次,并且只有一行与之关联。

  • 外键– 外键用作两个表之间的链接。

  • 复合键– 复合键或复合键是指多列的键。由于一列缺乏独特的品质,它指的是多列。

  • 索引– 索引实际上与一本书的索引相同。

  • 引用完整性– 该术语是指确保所有外键值指向现有行。

MariaDB 数据库

MariaDB 是 MySQL 的原始开发人员创建的流行的 MySQL 分支。它源于对 MySQL 被 Oracle 收购的担忧。它为小型数据处理任务和企业需求提供支持。它旨在成为 MySQL 的直接替代品,只需要简单地卸载 MySQL 和安装 MariaDB。MariaDB 提供与 MySQL 相同的功能以及更多功能。

MariaDB 的主要特点

MariaDB 的重要特性是 –

  • 所有 MariaDB 都在 GPL、LGPL 或 BSD 之下。

  • MariaDB 包括多种存储引擎,包括高性能存储引擎,用于处理其他 RDBMS 数据源。

  • MariaDB 使用标准且流行的查询语言。

  • MariaDB 可在多种操作系统上运行并支持多种编程语言。

  • MariaDB 提供对 PHP 的支持,PHP 是最流行的 Web 开发语言之一。

  • MariaDB 提供 Galera 集群技术。

  • MariaDB 还提供了许多 MySQL 中不可用的操作和命令,并消除/替换了对性能产生负面影响的功能。

入门

在开始本教程之前,请确保您具有 PHP 和 HTML 的一些基本知识,特别是我们的 PHP 和 HTML 教程中讨论的材料。

本指南侧重于在 PHP 环境中使用 MariaDB,因此我们的示例对 PHP 开发人员最有用。

如果您不熟悉或需要复习,我们强烈建议您查阅我们的 PHP 教程。

MariaDB – 安装

MariaDB 的所有下载都位于官方 MariaDB 基金会网站下载部分。单击指向所需版本的链接,将显示多个操作系统、体系结构和安装文件类型的下载列表。

在 LINUX/UNIX 上安装

如果您对 Linux/Unix 系统有深入了解,只需下载源代码即可构建您的安装。我们推荐的安装方式是使用分发包。MariaDB 为以下 Linux/Unix 发行版提供软件包 –

  • 红帽/CentOS/Fedora
  • Debian/Ubuntu

以下发行版在其存储库中包含 MariaDB 包 –

  • openSUSE
  • 拱形Linux
  • 魔法师
  • 薄荷
  • Slackware

按照以下步骤在 Ubuntu 环境中安装 –

步骤 1 – 以 root 用户身份登录。

步骤 2 – 导航到包含 MariaDB 包的目录。

第 3 步– 使用以下代码导入 GnuPG 签名密钥 –

sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db

第 4 步– 将 MariaDB 添加到sources.list文件。打开文件,并添加以下代码 –

sudo add-apt-repository 'deb http://ftp.osuosl.org/pub/mariadb/repo/5.5/ubuntuprecise main'

步骤 5 – 使用以下内容刷新系统 –

sudo apt-get update

第 6 步– 使用以下命令安装 MariaDB –

sudo apt-get install mariadb-server

在 Windows 上安装

找到并下载自动安装文件 (MSI) 后,只需双击该文件即可开始安装。安装向导将引导您完成安装的每一步和任何必要的设置。

通过从命令提示符启动安装来测试安装。导航到安装位置,通常在目录中,然后在提示符下键入以下内容 –

mysqld.exe --console

如果安装成功,您将看到与启动相关的消息。如果这没有出现,您可能有权限问题。确保您的用户帐户可以访问该应用程序。图形客户端可用于 Windows 环境中的 MariaDB 管理。如果您发现命令行不舒服或很麻烦,请务必尝试使用它们。

测试安装

执行一些简单的任务来确认 MariaDB 的功能和安装。

使用管理实用程序获取服务器状态

使用 mysqladmin 二进制文件查看服务器版本。

[root@host]# mysqladmin --version

它应该显示版本、发行版、操作系统和体系结构。如果您没有看到该类型的输出,请检查您的安装是否存在问题。

使用客户端执行简单命令

调出 MariaDB 的命令提示符。这应该将您连接到 MariaDB 并允许执行命令。输入一个简单的命令如下 –

mysql> SHOW DATABASES;

安装后

MariaDB安装成功后,设置root密码。全新安装将有一个空白密码。输入以下内容以设置新密码 –

mysqladmin -u root password "[enter your password here]";

输入以下内容以使用您的新凭据连接到服务器 –

mysql -u root -p
Enter password:*******

在 Windows 上升级

如果您的 Windows 系统上已经安装了 MySQL,并且想要升级到 MariaDB;不要卸载 MySQL 并安装 MariaDB。这会导致与现有数据库发生冲突。您必须改为安装 MariaDB,然后使用 Windows 安装文件中的升级向导。

MySQL my.cnf 文件的选项应该适用于 MariaDB。但是,MariaDB 具有许多在 MySQL 中没有的功能。

考虑 my.cnf 文件中的以下冲突 –

  • MariaDB 默认使用 Aria 存储引擎存储临时文件。如果您有很多临时文件,如果您不使用 MyISAM 表,请修改密钥缓冲区大小。

  • 如果您的应用程序频繁连接/断开连接,请更改线程缓存大小。

  • 如果使用超过 100 个连接,请使用线程池。

兼容性

MySQL 和 MariaDB 本质上是相同的。但是,有足够的差异会在升级中产生问题。MariaDB 知识库中查看更多这些主要差异

MariaDB – 管理

在尝试运行 MariaDB 之前,首先确定其当前状态,正在运行或已关闭。启动和停止 MariaDB 有三个选项 –

  • 运行 mysqld(MariaDB 二进制文件)。
  • 运行 mysqld_safe 启动脚本。
  • 运行 mysql.server 启动脚本。

如果您将 MariaDB 安装在非标准位置,则可能需要在脚本文件中编辑位置信息。只需在脚本中添加“停止”参数即可停止 MariaDB。

如果您想在 Linux 下自动启动它,请将启动脚本添加到您的init系统中。每个发行版都有不同的程序。请参阅您的系统文档。

创建用户帐户

使用以下代码创建一个新用户帐户 –

CREATE USER 'newusername'@'localhost' IDENTIFIED BY 'userpassword';

此代码在没有权限的情况下向用户表添加一行。您还可以选择使用哈希值作为密码。使用以下代码授予用户权限 –

GRANT SELECT, INSERT, UPDATE, DELETE ON database1 TO 'newusername'@'localhost';

其他权限几乎包括 MariaDB 中所有可能的命令或操作。创建用户后,执行“FLUSH PRIVILEGES”命令以刷新授权表。这允许使用用户帐户。

配置文件

在 Unix/Linux 上构建后,应编辑配置文件“/etc/mysql/my.cnf”以如下所示 –

# Example mysql config file.
# You can copy this to one of:
# /etc/my.cnf to set global options,
# /mysql-data-dir/my.cnf to get server specific options or
# ~/my.cnf for user specific options.

#

# One can use all long options that the program supports.
# Run the program with --help to get a list of available options

# This will be passed to all mysql clients
[client]
#password = my_password
#port = 3306
#socket = /tmp/mysql.sock

# Here is entries for some specific programs
# The following values assume you have at least 32M ram

# The MySQL server
[mysqld]
#port = 3306
#socket = /tmp/mysql.sock
temp-pool

# The following three entries caused mysqld 10.0.1-MariaDB (and possibly other
   versions) to abort...
# skip-locking
# set-variable = key_buffer = 16M
# set-variable = thread_cache = 4

loose-innodb_data_file_path = ibdata1:1000M
loose-mutex-deadlock-detector
gdb

######### Fix the two following paths

# Where you want to have your database
data = /path/to/data/dir

# Where you have your mysql/MariaDB source + sql/share/english
language = /path/to/src/dir/sql/share/english

[mysqldump]
quick
MariaDB
8
set-variable = max_allowed_packet=16M
[mysql]
no-auto-rehash

[myisamchk]
set-variable = key_buffer = 128M

编辑“data=”和“language=”行以匹配您的环境。

文件修改后,导航到源目录并执行以下操作 –

./scripts/mysql_install_db --srcdir = $PWD --datadir = /path/to/data/dir --
   user = $LOGNAME

如果您将 datadir 添加到配置文件,则省略“$PWD”变量。确保在运行 MariaDB 10.0.1 版时使用“$LOGNAME”。

管理命令

查看以下使用 MariaDB 时将经常使用的重要命令列表 –

  • USE [database name] – 设置当前的默认数据库。

  • SHOW DATABASES – 列出服务器上当前的数据库。

  • SHOW TABLES – 列出所有非临时表。

  • SHOW COLUMNS FROM [表名] – 提供与指定表有关的列信息。

  • SHOW INDEX FROM TABLENAME [表名] – 提供与指定表相关的表索引信息。

  • SHOW TABLE STATUS LIKE [表名]\G – – 为表提供有关非临时表的信息,以及出现在 LIKE 子句之后的模式用于获取表名。

MariaDB – PHP 语法

MariaDB 与各种编程语言和框架(如 PHP、C#、JavaScript、Ruby on Rails、Django 等)有着良好的合作关系。由于其简单性和历史足迹,PHP 仍然是所有可用语言中最受欢迎的。本指南将重点介绍与 MariaDB 合作的 PHP。

PHP 提供了一系列用于处理 MySQL 数据库的函数。这些函数执行诸如访问它或执行操作之类的任务,并且它们与 MariaDB 完全兼容。只需像调用任何其他 PHP 函数一样调用这些函数。

您将用于 MariaDB 的 PHP 函数符合以下格式 –

mysql_function(value,value,...);

函数的第二部分指定了它的动作。本指南中使用的两个功能如下 –

mysqli_connect($connect);
mysqli_query($connect,"SQL statement");

以下示例演示了 PHP 调用 MariaDB 函数的一般语法 –

<html>
   <head>
      <title>PHP and MariaDB</title>
   </head>

   <body>
      <?php
         $retval = mysql_function(value, [value,...]);
      
         if( !$retval ) {
            die ( "Error: Error message here" );
         }
         // MariaDB or PHP Statements
      ?>
   </body>
</html>

在下一节中,我们将使用 PHP 函数检查基本的 MariaDB 任务。

MariaDB – 连接

与 MariaDB 建立连接的一种方法是在命令提示符下使用 mysql 二进制文件。

MYSQL 二进制

查看下面给出的示例。

[root@host]# mysql -u root -p

Enter password:******

上面给出的代码连接到 MariaDB 并提供用于执行 SQL 命令的命令提示符。输入代码后,应出现一条欢迎消息,表示连接成功,并显示版本号。

Welcome to the MariaDB monitor. Commands end with ; or \g. 
Your MariaDB connection id is 122323232 
Server version: 5.5.40-MariaDB-log
  
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.  
mysql> 

该示例使用 root 访问权限,但任何具有权限的用户当然都可以访问 MariaDB 提示并执行操作。

通过exit命令断开与 MariaDB 的连接,如下所示 –

mysql> exit

PHP 连接脚本

另一种连接和断开 MariaDB 的方法是使用 PHP 脚本。PHP 提供了用于打开数据库连接mysql_connect()函数。它使用五个可选参数,并在连接成功后返回一个 MariaDB 链接标识符,或者在连接不成功时返回 false。它还提供用于关闭数据库连接mysql_close()函数,该函数使用单个参数。

句法

查看以下 PHP 连接脚本语法 –

connection mysql_connect(server,user,passwd,new_link,client_flag);

参数说明如下 –

Sr.No 参数及说明
1

server

此可选参数指定运行数据库服务器的主机名。它的默认值是“localhost:.3036”。

2

user

此可选参数指定访问数据库的用户名。它的默认值是服务器的所有者。

3

passwd

此可选参数指定用户的密码。其默认值为空。

4

new_link

此可选参数指定在第二次使用相同参数而不是新连接调用mysql_connect()时,将返回当前连接的标识符。

5

client flags

此可选参数使用以下常量值的组合 –

  • MYSQL_CLIENT_SSL – 它使用 ssl 加密。

  • MYSQL_CLIENT_COMPRESS – 它使用压缩协议。

  • MYSQL_CLIENT_IGNORE_SPACE – 它允许在函数名称后有空格。

  • MYSQL_CLIENT_INTERACTIVE – 它允许在关闭连接之前不活动的交互式超时秒。

查看下面给出的 PHP 断开连接脚本语法 –

bool mysql_close ( resource $link_identifier );

如果省略该资源,则最近打开的资源将关闭。它在成功关闭时返回 true 或 false 值。

尝试使用以下示例代码连接 MariaDB 服务器 –

<html>
   <head>
      <title>Connect to MariaDB Server</title>
   </head>

   <body>
      <?php
         $dbhost = 'localhost:3036';
         $dbuser = 'guest1';
         $dbpass = 'guest1a';
         $conn = mysql_connect($dbhost, $dbuser, $dbpass);
      
         if(! $conn ) {
            die('Could not connect: ' . mysql_error());
         }
         
         echo 'Connected successfully';
         mysql_close($conn);
      ?>
   </body>
</html>

成功连接后,您将看到以下输出 –

mysql> Connected successfully

MariaDB – 创建数据库

在 MariaDB 中创建或删除数据库需要通常仅授予 root 用户或管理员的权限。在这些帐户下,您有两个创建数据库的选项 – mysqladmin 二进制文件和 PHP 脚本。

mysqladmin 二进制文件

以下示例演示如何使用 mysqladmin 二进制文件创建名为Products的数据库

[root@host]# mysqladmin -u root -p create PRODUCTS
Enter password:******

PHP 创建数据库脚本

PHP 使用mysql_query函数来创建 MariaDB 数据库。该函数使用两个参数,一个是可选的,成功时返回“true”值,否则返回“false”值。

句法

查看以下创建数据库脚本语法 –

bool mysql_query( sql, connection );

参数说明如下 –

S.No 参数及说明
1

sql

此必需参数包含执行操作所需的 SQL 查询。

2

connection

如果未指定,此可选参数使用最近使用的连接。

尝试以下示例代码来创建数据库 –

<html>
   <head>
      <title>Create a MariaDB Database</title>
   </head>

   <body>
      <?php
         $dbhost = 'localhost:3036';
         $dbuser = 'root';
         $dbpass = 'rootpassword';
         $conn = mysql_connect($dbhost, $dbuser, $dbpass);
      
         if(! $conn ) {
            die('Could not connect: ' . mysql_error());
         }

         echo 'Connected successfully<br />';
         $sql = 'CREATE DATABASE PRODUCTS';
         $retval = mysql_query( $sql, $conn );
      
         if(! $retval ) {
            die('Could not create database: ' . mysql_error());
         }

         echo "Database PRODUCTS created successfully\n";
         mysql_close($conn);
      ?>
   </body>
</html>

成功删除后,您将看到以下输出 –

mysql> Database PRODUCTS created successfully 
mysql> SHOW DATABASES; 
+-----------------------+ 
| Database              | 
+-----------------------+ 
| PRODUCTS              | 
+-----------------------+  

MariaDB – 删除数据库

在 MariaDB 中创建或删除数据库需要特权,通常只授予 root 用户或管理员。在这些帐户下,您有两个删除数据库的选项:mysqladmin 二进制文件和 PHP 脚本。

请注意,删除的数据库是不可恢复的,因此在执行此操作时要小心。此外,用于删除的 PHP 脚本不会在删除前提示您确认。

mysqladmin 二进制文件

以下示例演示如何使用 mysqladmin 二进制文件删除现有数据库 –

[root@host]# mysqladmin -u root -p drop PRODUCTS
Enter password:******
mysql> DROP PRODUCTS
ERROR 1008 (HY000): Can't drop database 'PRODUCTS'; database doesn't exist

PHP 删除数据库脚本

PHP 使用mysql_query函数删除 MariaDB 数据库。该函数使用两个参数,一个是可选的,成功时返回“true”值,否则返回“false”值。

句法

查看以下删除数据库脚本语法 –

bool mysql_query( sql, connection );

参数说明如下 –

Sr.No 参数及说明
1

sql

此必需参数包含执行操作所需的 SQL 查询。

2

connection

如果未指定,此可选参数使用最近使用的连接。

尝试以下用于删除数据库的示例代码 –

<html>
   <head>
      <title>Delete a MariaDB Database</title>
   </head>

   <body>
      <?php
         $dbhost = 'localhost:3036';
         $dbuser = 'root';
         $dbpass = 'rootpassword';
         $conn = mysql_connect($dbhost, $dbuser, $dbpass);
      
         if(! $conn ) {
            die('Could not connect: ' . mysql_error());
         }
         echo 'Connected successfully<br />';
         
         $sql = 'DROP DATABASE PRODUCTS';
         $retval = mysql_query( $sql, $conn );
         
         if(! $retval ){
            die('Could not delete database: ' . mysql_error());
         }

         echo "Database PRODUCTS deleted successfully\n";
         mysql_close($conn);
      ?>
   </body>
</html>

成功删除后,您将看到以下输出 –

mysql> Database PRODUCTS deleted successfully 

MariaDB – 选择数据库

连接到 MariaDB 后,您必须选择要使用的数据库,因为可能存在许多数据库。有两种方法可以执行此任务:从命令提示符或通过 PHP 脚本。

命令提示符

在命令提示符下选择数据库时,只需使用 SQL 命令“use”

[root@host]# mysql -u root -p

Enter password:******

mysql> use PRODUCTS;

Database changed

mysql> SELECT database();  
+-------------------------+ 
| Database                | 
+-------------------------+ 
| PRODUCTS                | 
+-------------------------+ 

选择数据库后,所有后续命令都将对所选数据库进行操作。

注意– 所有名称(例如,数据库、表、字段)都区分大小写。确保命令符合正确的情况。

PHP 选择数据库脚本

PHP 提供了用于数据库选择mysql_select_db函数。该函数使用两个参数,一个是可选的,成功选择时返回“真”值,失败时返回“假”值。

句法

查看以下选择数据库脚本语法。

bool mysql_select_db( db_name, connection );

参数说明如下 –

S.No 参数及说明
1

db_name

此必需参数指定要使用的数据库的名称。

2

connection

如果未指定,此可选参数使用最近使用的连接。

尝试以下示例代码来选择数据库 –

<html>
   <head>
      <title>Select a MariaDB Database</title>
   </head>

   <body>
      <?php
         $dbhost = 'localhost:3036';
         $dbuser = 'guest1';
         $dbpass = 'guest1a';
         $conn = mysql_connect($dbhost, $dbuser, $dbpass);
      
         if(! $conn ) {
            die('Could not connect: ' . mysql_error());
         }
         echo 'Connected successfully';
         
         mysql_select_db( 'PRODUCTS' );
         mysql_close($conn);
      ?>
   </body>
</html>

成功选择后,您将看到以下输出 –

mysql> Connected successfully 

MariaDB – 数据类型

良好的字段定义对于优化数据库至关重要。理想的方法要求您专门使用所需类型和大小的字段。例如,如果您将只使用一个 5 个字符宽的字段,则不要定义一个 20 个字符宽的字段。鉴于存储在字段中的数据类型,字段(或列)类型也称为数据类型。

MariaDB 数据类型可分为数值、日期和时间以及字符串值。

数字数据类型

MariaDB 支持的数字数据类型如下 –

  • TINYINT – 此数据类型表示落在 -128 到 127 的有符号范围内和 0 到 255 的无符号范围内的小整数。

  • BOOLEAN – 此数据类型将值 0 与“false”相关联,将值 1 与“true”相关联。

  • SMALLINT – 此数据类型表示 -32768 到 32768 的有符号范围和 0 到 65535 的无符号范围内的整数。

  • MEDIUMINT – 此数据类型表示 -8388608 到 8388607 的有符号范围和 0 到 16777215 的无符号范围内的整数。

  • INT(also INTEGER) – 此数据类型表示正常大小的整数。标记为无符号时,范围为 0 到 4294967295。有符号时(默认设置),范围为 -2147483648 到 2147483647。当列设置为 ZEROFILL(无符号状态)时,其所有值都在前面加上零以放置INT 值中的 M 位数字。

  • BIGINT – 此数据类型表示 9223372036854775808 到 9223372036854775807 的有符号范围内的整数,以及 0 到 18446744073709551615 的无符号范围内的整数。

  • DECIMAL(也是 DEC、NUMERIC、FIXED)- 这种数据类型表示精确的定点数,M 指定其数字,D 指定小数点后的数字。M 值不加“-”或小数点。如果 D 设置为 0,则不会出现小数或小数部分,并且值将在 INSERT 时四舍五入到最接近的 DECIMAL。允许的最大位数为 65,小数位数的最大值为 30。M 省略的默认值为 10,D 省略的默认值为 0。

  • FLOAT – 此数据类型表示值为 0 的小浮点数或以下范围内的数字 –

    • -3.402823466E+38 到 -1.175494351E-38

    • 1.175494351E-38 到 3.402823466E+38

  • DOUBLE(也是REALDOUBLE PRECISION) – 此数据类型表示值为 0 或以下范围内的正常大小的浮点数 –

    • -1.7976931348623157E+308 到 -2.2250738585072014E-308

    • 2.2250738585072014E-308 到 1.7976931348623157E+308

  • BIT – 此数据类型表示位字段,其中 M 指定每个值的位数。省略M时,默认为1。位值可以应用“b'[value]’”,其中value代表0s和1s中的位值。零填充自动从左边开始全长;例如,“10”变为“0010”。

日期和时间数据类型

MariaDB 支持的日期和时间数据类型如下 –

  • DATE – 此数据类型表示“1000-01-01”到“9999-12-31”的日期范围,并使用“YYYY-MM-DD”日期格式。

  • TIME – 此数据类型表示“-838:59:59.999999”到“838:59:59.999999”的时间范围。

  • DATETIME – 此数据类型表示范围“1000-01-01 00:00:00.000000”到“9999-12-31 23:59:59.999999”。它使用“YYYY-MM-DD HH:MM:SS”格式。

  • TIMESTAMP – 此数据类型表示“YYYY-MM-DD HH:MM:DD”格式的时间戳。它主要用于详细说明数据库修改的时间,例如插入或更新。

  • YEAR – 此数据类型以 4 位格式表示年份。四位数格式允许 1901 到 2155 和 0000 范围内的值。

字符串数据类型

MariaDB 支持的字符串类型值如下 –

  • 字符串文字– 此数据类型表示用引号括起来的字符序列。

  • CHAR – 此数据类型表示包含指定长度空格的右填充、固定长度的字符串。M 表示 0 到 255 范围内字符的列长,默认值为 1。

  • VARCHAR – 此数据类型表示可变长度字符串,M 范围(最大列长度)为 0 到 65535。

  • BINARY – 此数据类型表示二进制字节字符串,M 作为以字节为单位的列长度。

  • VARBINARY – 此数据类型表示可变长度的二进制字节字符串,其中 M 作为列长度。

  • TINYBLOB – 此数据类型表示最大长度为 255 (28 – 1) 个字节的 blob 列。在存储中,每个都使用一个一字节长度的前缀来指示值中的字节数量。

  • BLOB – 此数据类型表示最大长度为 65,535 (216 – 1) 字节的 blob 列。在存储中,每个都使用一个两字节长度的前缀来指示值中的字节数量。

  • MEDIUMBLOB – 此数据类型表示最大长度为 16,777,215(224– 1) 字节。在存储中,每个都使用一个三字节长度的前缀来指示值中的字节数量。

  • LONGBLOB – 此数据类型表示最大长度为 4,294,967,295(232– 1) 字节。在存储中,每个都使用一个四字节长度的前缀,指示值中的字节数量。

  • TINYTEXT – 此数据类型表示最大长度为 255(28– 1) 字符。在存储中,每个都使用一个一字节长度的前缀来指示值中的字节数量。

  • TEXT – 此数据类型表示最大长度为 65,535(216– 1) 字符。在存储中,每个都使用一个两字节长度的前缀来指示值中的字节数量。

  • MEDIUMTEXT – 此数据类型表示最大长度为 16,777,215(224– 1) 字符。在存储中,每个都使用一个三字节长度的前缀来指示值中的字节数量。

  • LONGTEXT – 此数据类型表示最大长度为 4,294,967,295 或 4GB(232– 1) 字符。在存储中,每个都使用一个四字节长度的前缀,指示值中的字节数量。

  • ENUM – 此数据类型表示一个字符串对象,其中只有一个列表中的值。

  • SET – 此数据类型表示具有列表中零个或多个值的字符串对象,最多 64 个成员。SET 值在内部显示为整数值。

MariaDB – 创建表

在本章中,我们将学习如何创建表。在创建表之前,首先确定其名称、字段名称和字段定义。

以下是表创建的一般语法 –

CREATE TABLE table_name (column_name column_type);

查看应用于在 PRODUCTS 数据库中创建表的命令 –

databaseproducts_ tbl(
   product_id INT NOT NULL AUTO_INCREMENT,
   product_name VARCHAR(100) NOT NULL,
   product_manufacturer VARCHAR(40) NOT NULL,
   submission_date DATE,
   PRIMARY KEY ( product_id )
);

上面的示例使用“NOT NULL”作为字段属性,以避免由空值引起的错误。属性“AUTO_INCREMENT”指示 MariaDB 将下一个可用值添加到 ID 字段。关键字 primary key 将一列定义为主键用逗号分隔的多列可以定义一个主键。

创建表的两种主要方法是使用命令提示符和 PHP 脚本。

命令提示符

使用 CREATE TABLE 命令执行如下所示的任务 –

root@host# mysql -u root -p
Enter password:*******
mysql> use PRODUCTS;
Database changed
mysql> CREATE TABLE products_tbl(
   -> product_id INT NOT NULL AUTO_INCREMENT,
   -> product_name VARCHAR(100) NOT NULL,
   -> product_manufacturer VARCHAR(40) NOT NULL,
   -> submission_date DATE,
   -> PRIMARY KEY ( product_id )
   -> );
mysql> SHOW TABLES;
+------------------------+
| PRODUCTS               |
+------------------------+
| products_tbl           |
+------------------------+

确保所有命令都以分号结尾。

PHP 创建表脚本

PHP 提供了mysql_query()来创建表。它的第二个参数包含必要的 SQL 命令 –

<html>
   <head>
      <title>Create a MariaDB Table</title>
   </head>

   <body>
      <?php
         $dbhost = 'localhost:3036';
         $dbuser = 'root';
         $dbpass = 'rootpassword';
         $conn = mysql_connect($dbhost, $dbuser, $dbpass);
      
         if(! $conn ){
            die('Could not connect: ' . mysql_error());
         }
         echo 'Connected successfully<br />';
         
         $sql = "CREATE TABLE products_tbl( ".
            "product_id INT NOT NULL AUTO_INCREMENT, ".
            "product_name VARCHAR(100) NOT NULL, ".
            "product_manufacturer VARCHAR(40) NOT NULL, ".
            "submission_date DATE, ".
            "PRIMARY KEY ( product_id )); ";
      
         mysql_select_db( 'PRODUCTS' );
         $retval = mysql_query( $sql, $conn );
      
         if(! $retval ) {
            die('Could not create table: ' . mysql_error());
         }
         echo "Table created successfully\n";
         
         mysql_close($conn);
      ?>
   </body>
</html>

成功创建表后,您将看到以下输出 –

mysql> Table created successfully

MariaDB – 删除表

在本章中,我们将学习删除表。

表删除很容易,但请记住,所有删除的表都是不可恢复的。表删除的一般语法如下 –

DROP TABLE table_name ;

执行表删除有两个选项:使用命令提示符或 PHP 脚本。

命令提示符

在命令提示符下,只需使用DROP TABLE SQL 命令 –

root@host# mysql -u root -p
Enter password:*******
mysql> use PRODUCTS;
Database changed
mysql> DROP TABLE products_tbl

mysql> SELECT * from products_tbl
ERROR 1146 (42S02): Table 'products_tbl' doesn't exist

PHP 删除表脚本

PHP 提供mysql_query()用于删除表。只需将其第二个参数传递给适当的 SQL 命令 –

<html>
   <head>
      <title>Create a MariaDB Table</title>
   </head>

   <body>
      <?php
         $dbhost = 'localhost:3036';
         $dbuser = 'root';
         $dbpass = 'rootpassword';
         $conn = mysql_connect($dbhost, $dbuser, $dbpass);
         
         if(! $conn ) {
            die('Could not connect: ' . mysql_error());
         }
         echo 'Connected successfully<br />';
         
         $sql = "DROP TABLE products_tbl";
         mysql_select_db( 'PRODUCTS' );
         $retval = mysql_query( $sql, $conn );
      
         if(! $retval ) {
            die('Could not delete table: ' . mysql_error());
         }
         echo "Table deleted successfully\n";
         
         mysql_close($conn);
      ?>
   </body>
</html>

成功删除表后,您将看到以下输出 –

mysql> Table deleted successfully

MariaDB – 插入查询

在本章中,我们将学习如何在表中插入数据。

将数据插入表需要 INSERT 命令。命令的一般语法是 INSERT 后跟表名、字段和值。

查看下面给出的一般语法 –

INSERT INTO tablename (field,field2,...) VALUES (value, value2,...);

该语句要求对字符串值使用单引号或双引号。该语句的其他选项包括“INSERT…SET”语句、“INSERT…SELECT”语句和其他几个选项。

注意– 语句中出现的 VALUES() 函数仅适用于 INSERT 语句,如果在其他地方使用,则返回 NULL。

执行操作有两个选项:使用命令行或使用 PHP 脚本。

命令提示符

在提示符下,有多种方法可以执行选择操作。标准声明如下 –

belowmysql>
INSERT INTO products_tbl (ID_number, Nomenclature) VALUES (12345,“Orbitron 4000”);
mysql> SHOW COLUMNS FROM products_tbl;
+-------------+-------------+------+-----+---------+-------+
| Field       | Type        | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| ID_number   | int(5)      |      |     |         |       |
| Nomenclature| char(13)    |      |     |         |       |
+-------------+-------------+------+-----+---------+-------+

您可以插入多行 –

INSERT INTO products VALUES (1, “first row”), (2, “second row”);

您还可以使用 SET 子句 –

INSERT INTO products SELECT * FROM inventory WHERE status = 'available';

PHP 插入脚本

在 PHP 函数中使用相同的“INSERT INTO…”语句来执行操作。您将再次使用mysql_query()函数。

查看下面给出的示例 –

<?php
   if(isset($_POST['add'])) {
      $dbhost = 'localhost:3036';
      $dbuser = 'root';
      $dbpass = 'rootpassword';
      $conn = mysql_connect($dbhost, $dbuser, $dbpass);

      if(! $conn ) {
         die('Could not connect: ' . mysql_error());
      }

      if(! get_magic_quotes_gpc() ) {
         $product_name = addslashes ($_POST['product_name']);
         $product_manufacturer = addslashes ($_POST['product_name']);
      } else {
         $product_name = $_POST['product_name'];
         $product_manufacturer = $_POST['product_manufacturer'];
      }
      $ship_date = $_POST['ship_date'];
      $sql = "INSERT INTO products_tbl ".
         "(product_name,product_manufacturer, ship_date) ".
         "VALUES"."('$product_name','$product_manufacturer','$ship_date')";

      mysql_select_db('PRODUCTS');
      $retval = mysql_query( $sql, $conn );
      
      if(! $retval ) {
         die('Could not enter data: ' . mysql_error());
      }

      echo "Entered data successfully\n";
      mysql_close($conn);
   }
?>

成功插入数据后,您将看到以下输出 –

mysql> Entered data successfully

您还将与插入语句协作验证语句,例如检查以确保正确的数据输入。为此,MariaDB 包含了许多选项,其中一些是自动的。

MariaDB – 选择查询

在本章中,我们将学习如何从表中选择数据。

SELECT 语句检索选定的行。它们可以包括 UNION 语句、排序子句、LIMIT 子句、WHERE 子句、GROUP BY…HAVING 子句和子查询。

查看以下通用语法 –

SELECT field, field2,... FROM table_name, table_name2,... WHERE...

SELECT 语句提供了多个选项来指定所使用的表 –

  • 数据库名称.表名称

  • 表名.列名

  • database_name.table_name.column_name

所有 select 语句都必须包含一个或多个select 表达式选择表达式包含以下选项之一 –

  • 列名。

  • 使用运算符和函数的表达式。

  • 用于选择给定表中的所有列的规范“table_name.*”。

  • 字符“*”用于从 FROM 子句中指定的所有表中选择所有列。

命令提示符或 PHP 脚本可用于执行选择语句。

命令提示符

在命令提示符下,执行如下语句 –

root@host# mysql -u root -p password;
Enter password:*******
mysql> use PRODUCTS;
Database changed
mysql> SELECT * from products_tbl
+-------------+---------------+
| ID_number   | Nomenclature  |
+-------------+---------------+
| 12345       | Orbitron 4000 |
+-------------+---------------+

PHP 选择脚本

在 PHP 函数中使用相同的 SELECT 语句来执行操作。您将再次使用mysql_query()函数。查看下面给出的示例 –

<?php
   $dbhost = 'localhost:3036';
   $dbuser = 'root';
   $dbpass = 'rootpassword';
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);
   
   if(! $conn ) {
      die('Could not connect: ' . mysql_error());
   }

   $sql = 'SELECT product_id, product_name,product_manufacturer, ship_date FROM products_tbl';
   mysql_select_db('PRODUCTS');
   $retval = mysql_query( $sql, $conn );
   
   if(! $retval ) {
      die('Could not get data: ' . mysql_error());
   }

   while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
      echo "Product ID :{$row['product_id']} <br> ".
         "Name: {$row['product_name']} <br> ".
         "Manufacturer: {$row['product_manufacturer']} <br> ".
         "Ship Date : {$row['ship_date']} <br>".
         "--------------------------------<br>";
   }

   echo "Fetched data successfully\n";
   mysql_close($conn);
?>

成功检索数据后,您将看到以下输出 –

Product ID: 12345
Nomenclature: Orbitron 4000
Manufacturer: XYZ Corp
Ship Date: 01/01/17
----------------------------------------------
Product ID: 12346
Nomenclature: Orbitron 3000
Manufacturer: XYZ Corp
Ship Date: 01/02/17
----------------------------------------------
mysql> Fetched data successfully

最佳实践建议在每个 SELECT 语句之后释放游标内存。PHP为此提供了mysql_free_result()函数。查看其使用,如下所示 –

<?php
   $dbhost = 'localhost:3036';
   $dbuser = 'root';
   $dbpass = 'rootpassword';
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);
   
   if(! $conn ) {
      die('Could not connect: ' . mysql_error());
   }

   $sql = 'SELECT product_id, product_name, product_manufacturer, ship_date FROM products_tbl';
   mysql_select_db('PRODUCTS');
   $retval = mysql_query( $sql, $conn );

   if(! $retval ) {
      die('Could not get data: ' . mysql_error());
   }

   while($row = mysql_fetch_array($retval, MYSQL_NUM)) {
      echo "Product ID :{$row[0]} <br> ".
         "Name: {$row[1]} <br> ".
         "Manufacturer: {$row[2]} <br> ".
         "Ship Date : {$row[3]} <br> ".
         "--------------------------------<br>";
   }

   mysql_free_result($retval);
   echo "Fetched data successfully\n";
   mysql_close($conn);
?>

MariaDB – Where 子句

WHERE子句过滤各种语句,例如 SELECT、UPDATE、DELETE 和 INSERT。它们提出了用于指定操作的标准。它们通常出现在语句中的表名之后,并且它们的条件如下。WHERE 子句的功能本质上类似于 if 语句。

查看下面给出的 WHERE 子句的一般语法 –

[COMMAND] field,field2,... FROM table_name,table_name2,... WHERE [CONDITION]

请注意 WHERE 子句的以下品质 –

  • 它是可选的。

  • 它允许指定任何条件。

  • 它允许通过使用 AND 或 OR 运算符来指定多个条件。

  • 区分大小写仅适用于使用 LIKE 比较的语句。

WHERE 子句允许使用以下运算符 –

Operator
= !=
> <
>= <=

WHERE 子句可以在命令提示符或 PHP 脚本中使用。

命令提示符

在命令提示符下,只需使用标准命令 –

root@host# mysql -u root -p password;
Enter password:*******
mysql> use PRODUCTS;
Database changed
mysql> SELECT * from products_tbl WHERE product_manufacturer = 'XYZ Corp';
+-------------+----------------+----------------------+
| ID_number   | Nomenclature   | product_manufacturer |
+-------------+----------------+----------------------+
| 12345       | Orbitron 4000  | XYZ Corp             |
+-------------+----------------+----------------------+
| 12346       | Orbitron 3000  | XYZ Corp             |
+-------------+----------------+----------------------+
| 12347       | Orbitron 1000  | XYZ Corp             |
+-------------+----------------+----------------------+

查看使用AND条件的示例

SELECT *
FROM products_tbl
WHERE product_name = 'Bun Janshu 3000';
AND product_id <= 344;

此示例结合了 AND 和 OR 条件

SELECT *
FROM products_tbl
WHERE (product_name = 'Bun Janshu 3000' AND product_id < 344)
OR (product_name = 'Bun Janshu 3000');

使用 Where 子句的 PHP 脚本

采用的mysql_query()使用WHERE子句中的操作功能-

<?php
   $dbhost = 'localhost:3036';
   $dbuser = 'root';
   $dbpass = 'rootpassword';
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);
   
   if(! $conn ) {
      die('Could not connect: ' . mysql_error());
   }

   $sql = 'SELECT product_id, product_name, product_manufacturer, ship_date
      FROM products_tbl
      WHERE product_manufacturer = "XYZ Corp"';
   
   mysql_select_db('PRODUCTS');
   $retval = mysql_query( $sql, $conn );
   
   if(! $retval ) {
      die('Could not get data: ' . mysql_error());
   }

   while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
      echo "Product ID :{$row['product_id']} <br> ".
         "Name: {$row['product_name']} <br> ".
         "Manufacturer: {$row['product_manufacturer']} <br> ".
         "Ship Date: {$row['ship_date']} <br> ".
         "--------------------------------<br>";
   }

   echo "Fetched data successfully\n";
   mysql_close($conn);
?>

成功检索数据后,您将看到以下输出 –

Product ID: 12345
Nomenclature: Orbitron 4000
Manufacturer: XYZ Corp
Ship Date: 01/01/17
----------------------------------------------
Product ID: 12346
Nomenclature: Orbitron 3000
Manufacturer: XYZ Corp
Ship Date: 01/02/17
----------------------------------------------
Product ID: 12347
Nomenclature: Orbitron 1000
Manufacturer: XYZ Corp
Ship Date: 01/02/17
----------------------------------------------
mysql> Fetched data successfully

MariaDB – 更新查询

UPDATE命令修改现有通过改变值的字段。它使用 SET 子句指定要修改的列,并指定分配的新值。这些值可以是表达式或字段的默认值。设置默认值需要使用 DEFAULT 关键字。该命令还可以使用 WHERE 子句指定更新条件和/或 ORDER BY 子句以特定顺序更新。

查看以下通用语法 –

UPDATE table_name SET field=new_value, field2=new_value2,...
[WHERE ...]

从命令提示符或使用 PHP 脚本执行 UPDATE 命令。

命令提示符

在命令提示符下,只需使用标准的 commandroot –

root@host# mysql -u root -p password;
Enter password:*******
mysql> use PRODUCTS;
Database changed
mysql> UPDATE products_tbl
   SET nomenclature = 'Fiber Blaster 300Z' WHERE ID_number = 112;
mysql> SELECT * from products_tbl WHERE ID_number='112';
+-------------+---------------------+----------------------+
| ID_number   | Nomenclature        | product_manufacturer |
+-------------+---------------------+----------------------+
| 112         | Fiber Blaster 300Z  | XYZ Corp             |
+-------------+---------------------+----------------------+      

PHP 更新查询脚本

在 UPDATE 命令语句中使用mysql_query()函数 –

<?php
   $dbhost = ‘localhost:3036’;
   $dbuser = ‘root’;
   $dbpass = ‘rootpassword’;
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);

   if(! $conn ) {
      die(‘Could not connect: ‘ . mysql_error());
   }

   $sql = ‘UPDATE products_tbl
      SET product_name = ”Fiber Blaster 300z”
      WHERE product_id = 112’;

   mysql_select_db(‘PRODUCTS’);
   $retval = mysql_query( $sql, $conn );

   if(! $retval ) {
      die(‘Could not update data: ‘ . mysql_error());
   }

   echo “Updated data successfully\n”;
   mysql_close($conn);
?>

成功更新数据后,您将看到以下输出 –

mysql> Updated data successfully

MariaDB – 删除查询

DELETE 命令从指定的表中删除表行,并返回删除的数量。使用 ROW_COUNT() 函数访问删除的数量。WHERE 子句指定行,如果没有,则删除所有行。LIMIT 子句控制删除的行数。

在多行的 DELETE 语句中,它只删除满足条件的那些行;和 LIMIT 和 WHERE 子句是不允许的。DELETE 语句允许从不同数据库的表中删除行,但不允许从表中删除然后在子查询中从同一表中选择。

查看以下 DELETE 语法 –

DELETE FROM table_name [WHERE …]

从命令提示符或使用 PHP 脚本执行 DELETE 命令。

命令提示符

在命令提示符下,只需使用标准命令 –

root@host# mysql –u root –p password;
Enter password:*******
mysql> use PRODUCTS;
Database changed
mysql> DELETE FROM products_tbl WHERE product_id=133;
mysql> SELECT * from products_tbl WHERE ID_number='133';
ERROR 1032 (HY000): Can't find record in 'products_tbl'

PHP 删除查询脚本

在 DELETE 命令语句中使用mysql_query()函数 –

<?php
   $dbhost = 'localhost:3036';
   $dbuser = 'root';
   $dbpass = 'rootpassword';
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);
   
   if(! $conn ) {
      die('Could not connect: ' . mysql_error());
   }

   $sql = 'DELETE FROM products_tbl WHERE product_id = 261';
   mysql_select_db('PRODUCTS');
   $retval = mysql_query( $sql, $conn );

   if(! $retval ) {
      die('Could not delete data: ' . mysql_error());
   }

   echo "Deleted data successfully\n";
   mysql_close($conn);
?>

成功删除数据后,您将看到以下输出 –

mysql> Deleted data successfully
mysql> SELECT * from products_tbl WHERE ID_number='261';
ERROR 1032 (HY000): Can't find record in 'products_tbl'

MariaDB – 喜欢子句

WHERE 子句提供了一种在操作使用精确匹配时检索数据的方法。在需要具有共享特征的多个结果的情况下,LIKE子句适用于广泛的模式匹配。

LIKE 子句测试模式匹配,返回真或假。用于比较的模式接受以下通配符:“%”,匹配字符数(0 或更多);和“_”,匹配单个字符。“_”通配符仅匹配其集合中的字符,这意味着在使用另一个集合时将忽略拉丁字符。默认情况下,匹配项不区分大小写,需要额外设置区分大小写。

NOT LIKE 子句允许测试相反的条件,很像not运算符。

如果语句表达式或模式的计算结果为 NULL,则结果为 NULL。

查看下面给出的一般 LIKE 子句语法 –

SELECT field, field2,... FROM table_name, table_name2,...
WHERE field LIKE condition

在命令提示符或 PHP 脚本中使用 LIKE 子句。

命令提示符

在命令提示符下,只需使用标准命令 –

root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> SELECT * from products_tbl
   WHERE product_manufacturer LIKE 'XYZ%';
+-------------+----------------+----------------------+
| ID_number   | Nomenclature   | product_manufacturer |
+-------------+----------------+----------------------+
| 12345       | Orbitron 4000  | XYZ Corp             |
+-------------+----------------+----------------------+
| 12346       | Orbitron 3000  | XYZ Corp             |
+-------------+----------------+----------------------+
| 12347       | Orbitron 1000  | XYZ Corp             |
+-------------+----------------+----------------------+

PHP 脚本使用 Like 子句

使用的mysql_query()函数中使用LIKE子句声明

<?php
   $dbhost = 'localhost:3036';
   $dbuser = 'root';
   $dbpass = 'rootpassword';
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);
   
   if(! $conn ) {
      die('Could not connect: ' . mysql_error());
   }

   $sql = 'SELECT product_id, product_name, product_manufacturer, ship_date
      FROM products_tbl WHERE product_manufacturer LIKE "xyz%"';
   
   mysql_select_db('PRODUCTS');
   $retval = mysql_query( $sql, $conn );
   
   if(! $retval ) {
      die('Could not get data: ' . mysql_error());
   }

   while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
      echo "Product ID:{$row['product_id']} <br> ".
         "Name: {$row['product_name']} <br> ".
         "Manufacturer: {$row['product_manufacturer']} <br> ".
         "Ship Date: {$row['ship_date']} <br> ".
         "--------------------------------<br>";
   }
   
   echo "Fetched data successfully\n";
   mysql_close($conn);
?>

成功检索数据后,您将看到以下输出 –

Product ID: 12345
Nomenclature: Orbitron 4000
Manufacturer: XYZ Corp
Ship Date: 01/01/17
----------------------------------------------
Product ID: 12346
Nomenclature: Orbitron 3000
Manufacturer: XYZ Corp
Ship Date: 01/02/17
----------------------------------------------
Product ID: 12347
Nomenclature: Orbitron 1000
Manufacturer: XYZ Corp
Ship Date: 01/02/17
----------------------------------------------
mysql> Fetched data successfully

MariaDB – 按条款排序

ORDER BY子句,在之前的讨论中提到,排序语句的结果。它指定操作数据的顺序,并包括按升序 (ASC) 或降序 (DESC) 排序的选项。省略顺序指定时,默认顺序为升序。

ORDER BY 子句出现在各种语句中,例如 DELETE 和 UPDATE。它们总是出现在语句的末尾,而不是在子查询中或集合函数之前,因为它们对最终结果表进行操作。您也不能使用整数来标识列。

查看下面给出的 ORDER BY 子句的一般语法 –

SELECT field, field2,... [or column] FROM table_name, table_name2,...
ORDER BY field, field2,... ASC[or DESC]

在命令提示符或 PHP 脚本中使用 ORDER BY 子句。

命令提示符

在命令提示符下,只需使用标准命令 –

root@ host# mysql -u root -p password;
Enter password:*******
mysql> use PRODUCTS;
Database changed

mysql> SELECT * from products_tbl ORDER BY product_manufacturer ASC
+-------------+----------------+----------------------+
| ID_number   | Nomenclature   | product_manufacturer |
+-------------+----------------+----------------------+
| 56789       | SuperBlast 400 | LMN Corp             |
+-------------+----------------+----------------------+
| 67891       | Zoomzoom 5000  | QFT Corp             |
+-------------+----------------+----------------------+
| 12347       | Orbitron 1000  | XYZ Corp             |
+-------------+----------------+----------------------+

使用 Order By Clause 的 PHP 脚本

在使用 ORDER BY 子句的语句中再次使用mysql_query()函数 –

<?php
   $dbhost = 'localhost:3036';
   $dbuser = 'root';
   $dbpass = 'rootpassword';
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);
   
   if(! $conn ) {
      die('Could not connect: ' . mysql_error());
   }

   $sql = 'SELECT product_id, product_name, product_manufacturer, ship_date 
      FROM products_tbl ORDER BY product_manufacturer DESC';

   mysql_select_db('PRODUCTS');
   $retval = mysql_query( $sql, $conn );

   if(! $retval ) {
      die('Could not get data: ' . mysql_error());
   }

   while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
      echo "Product ID :{$row['product_id']} <br> ".
         "Name: {$row['product_name']} <br> ".
         "Manufacturer: {$row['product_manufacturer']} <br> ".
         "Ship Date : {$row['ship_date']} <br> ".
         "--------------------------------<br>";
   }

   echo "Fetched data successfully\n";
   mysql_close($conn);
?>

成功检索数据后,您将看到以下输出 –

Product ID: 12347
Nomenclature: Orbitron 1000
Manufacturer: XYZ Corp
Ship Date: 01/01/17
----------------------------------------------
Product ID: 67891
Nomenclature: Zoomzoom 5000
Manufacturer: QFT Corp
Ship Date: 01/01/17
----------------------------------------------
Product ID: 56789
Nomenclature: SuperBlast 400
Manufacturer: LMN Corp
Ship Date: 01/04/17
----------------------------------------------
mysql> Fetched data successfully

MariaDB – 加入

在之前的讨论和示例中,我们研究了从单个表中检索,或从多个来源检索多个值。大多数现实世界的数据操作要复杂得多,需要从多个表中聚合、比较和检索。

JOIN允许将两个或多个表合并为一个对象。它们通过 SELECT、UPDATE 和 DELETE 语句使用。

查看使用 JOIN 的语句的一般语法,如下所示 –

SELECT column
FROM table_name1
INNER JOIN table_name2
ON table_name1.column = table_name2.column;

请注意 JOINS 的旧语法使用隐式连接并且没有关键字。可以使用 WHERE 子句来实现连接,但关键字最适合可读性、维护性和最佳实践。

JOIN 有多种形式,例如左联接、右联接或内联接。各种连接类型提供基于共享值或特征的不同类型的聚合。

在命令提示符下或使用 PHP 脚本使用 JOIN。

命令提示符

在命令提示符下,只需使用标准语句 –

root@host# mysql -u root -p password;
Enter password:*******
mysql> use PRODUCTS;
Database changed

mysql> SELECT products.ID_number, products.Nomenclature, inventory.inventory_ct
   FROM products
   INNER JOIN inventory
   ON products.ID_numbeer = inventory.ID_number;
+-------------+----------------+-----------------+
| ID_number   | Nomenclature   | Inventory Count |
+-------------+----------------+-----------------+
| 12345       | Orbitron 4000  | 150             |
+-------------+----------------+-----------------+
| 12346       | Orbitron 3000  | 200             |
+-------------+----------------+-----------------+
| 12347       | Orbitron 1000  | 0               |
+-------------+----------------+-----------------+

使用 JOIN 的 PHP 脚本

使用mysql_query()函数执行连接操作 –

<?php
   $dbhost = 'localhost:3036';
   $dbuser = 'root';
   $dbpass = 'rootpassword';
   $conn = mysql_connect($dbhost, $dbuser, $dbpass);

   if(! $conn ) {
      die('Could not connect: ' . mysql_error());
   }

   $sql = 'SELECT a.product_id, a.product_manufacturer, b.product_count   
      FROM products_tbl a, pcount_tbl b 
      WHERE a.product_manufacturer = b.product_manufacturer';

   mysql_select_db('PRODUCTS');
   $retval = mysql_query( $sql, $conn );

   if(! $retval ) {
      die('Could not get data: ' . mysql_error());
   }

   while($row = mysql_fetch_array($retval, MYSQL_ASSOC)) {
      echo "Manufacturer:{$row['product_manufacturer']} <br> ".
         "Count: {$row['product_count']} <br> ".
         "Product ID: {$row['product_id']} <br> ".
         "--------------------------------<br>";
   }

   echo "Fetched data successfully\n";
   mysql_close($conn);
?>

成功检索数据后,您将看到以下输出 –

ID Number: 12345
Nomenclature: Orbitron 4000
Inventory Count: 150
--------------------------------------
ID Number: 12346
Nomenclature: Orbitron 3000
Inventory Count: 200
--------------------------------------
ID Number: 12347
Nomenclature: Orbitron 1000
Inventory Count: 0
--------------------------------------
mysql> Fetched data successfully

MariaDB – 空值

使用 NULL 值时,请记住它们是未知值。它们不是空字符串或零,它们是有效值。在表创建中,列规范允许将它们设置为接受空值或拒绝它们。只需使用 NULL 或 NOT NULL 子句。这适用于缺少记录信息(如 ID 号)的情况。

在显式赋值之前,用户定义的变量的值为 NULL。存储的例程参数和局部变量允许设置 NULL 值。当局部变量没有默认值时,它的值为 NULL。

NULL 不区分大小写,并具有以下别名 –

  • UNKNOWN(布尔值)
  • \N

空运算符

标准比较运算符不能与 NULL 一起使用(例如 =、>、>=、<=、< 或 !=),因为所有与 NULL 值的比较都返回 NULL,而不是 true 或 false。与 NULL 或可能包含它的比较必须使用“<=>”(NULL-SAFE)运算符。

其他可用的运算符是 –

  • IS NULL – 它测试 NULL 值。

  • IS NOT NULL – 它确认不存在 NULL 值。

  • ISNULL – 发现 NULL 值时返回 1 值,不存在时返回 0 值。

  • COALESCE – 它返回列表的第一个非 NULL 值,或者在没有的情况下返回 NULL 值。

排序 NULL 值

在排序操作中,NULL 值具有最低值,因此 DESC 顺序导致 NULL 值在底部。MariaDB 允许为 NULL 值设置更高的值。

有两种方法可以做到这一点,如下所示 –

SELECT column1 FROM product_tbl ORDER BY ISNULL(column1), column1;

另一种方式 –

SELECT column1 FROM product_tbl ORDER BY IF(column1 IS NULL, 0, 1), column1 DESC;

空函数

当任何参数为 NULL 时,函数通常输出 NULL。但是,有专门设计用于管理 NULL 值的函数。他们是 –

  • IFNULL() – 如果第一个表达式不是 NULL,则返回它。当它计算为 NULL 时,它返回第二个表达式。

  • NULLIF() – 当比较表达式相等时返回 NULL,如果不相等,则返回第一个表达式。

SUM 和 AVG 等函数会忽略 NULL 值。

插入 NULL 值

在声明为 NOT NULL 的列中插入 NULL 值时,会发生错误。在默认 SQL 模式下,NOT NULL 列将根据数据类型插入默认值。

当字段是 TIMESTAMP、AUTO_INCREMENT 或虚拟列时,MariaDB 以不同方式管理 NULL 值。在 AUTO_INCREMENT 列中插入会导致序列中的下一个数字插入到它的位置。在 TIMESTAMP 字段中,MariaDB 会分配当前时间戳。在虚拟列(本教程稍后讨论的主题)中,分配了默认值。

UNIQUE 索引可以保存许多 NULL 值,但是,主键不能为 NULL。

NULL 值和 Alter 命令

当您使用 ALTER 命令修改列时,在没有 NULL 规范的情况下,MariaDB 会自动分配值。

MariaDB – 正则表达式

除了 LIKE 子句提供的模式匹配之外,MariaDB 还通过 REGEXP 运算符提供基于正则表达式的匹配。运算符根据给定的模式对字符串表达式执行模式匹配。

MariaDB 10.0.5 引入了 PCRE 正则表达式,它极大地增加了对递归模式、前瞻断言等领域的匹配范围。

查看下面给出的标准 REGEXP 运算符语法的使用 –

SELECT column FROM table_name WHERE column REGEXP '[PATTERN]';

REGEXP 返回 1 表示模式匹配或 0 表示不匹配。

相反的选项以 NOT REGEXP 的形式存在。MariaDB 还提供 REGEXP 和 NOT REGEXP、RLIKE 和 NOT RLIKE 的同义词,它们是出于兼容性原因而创建的。

比较的模式可以是文字字符串或其他内容,例如表列。在字符串中,它使用 C 转义语法,因此将任何“\”字符加倍。REGEXP 也不区分大小写,二进制字符串除外。

下面给出了可以使用的可能模式表 –

Sr.No 图案和描述
1

^

它匹配字符串的开头。

2

$

它匹配字符串的结尾。

3

.

它匹配单个字符。

4

[…]

它匹配括号中的任何字符。

5

[^…]

它匹配括号中未列出的任何字符。

6

p1|p2|p3

它匹配任何模式。

7

*

它匹配前面元素的 0 个或多个实例。

8

+

它匹配前一个元素的 1 个或多个实例。

9

{n}

它匹配前一个元素的 n 个实例。

10

{m,n}

它匹配前面元素的 m 到 n 个实例。

查看下面给出的模式匹配示例 –

以“pr”开头的产品 –

SELECT name FROM product_tbl WHERE name REGEXP '^pr';

以“na”结尾的产品 –

SELECT name FROM product_tbl WHERE name REGEXP 'na$';

以元音开头的产品 –

SELECT name FROM product_tbl WHERE name REGEXP '^[aeiou]';

MariaDB – 交易

事务是连续的组操作。它们作为一个单元运行,并且在组内的所有操作成功执行之前不会终止。组中的单个故障会导致整个事务失败,并且不会对数据库产生任何影响。

交易符合 ACID(原子性、一致性、隔离性和持久性) –

  • 原子性– 它通过中止失败和回滚更改来确保所有操作的成功。

  • 一致性– 它确保数据库对成功的事务应用更改。

  • 隔离– 它使交易的独立交易操作成为可能。

  • 持久性– 它确保在系统出现故障时成功交易的持久性。

事务语句的开头是 START TRANSACTION 语句,然后是 COMMIT 和 ROLLBACK 语句 –

  • START TRANSACTION 开始事务。

  • COMMIT 保存对数据的更改。

  • ROLLBACK 结束事务,销毁任何更改。

在成功的事务中,COMMIT 起作用。发生故障时,ROLLBACK 起作用。

注意– 某些语句会导致隐式提交,并且在事务中使用时也会导致错误。此类语句的示例包括但不限于 CREATE、ALTER 和 DROP。

MariaDB 事务还包括 SAVEPOINT 和 LOCK TABLES 等选项。SAVEPOINT 设置一个还原点以与 ROLLBACK 一起使用。LOCK TABLES 允许在会话期间控制对表的访问,以防止在特定时间段内进行修改。

AUTOCOMMIT 变量提供对事务的控制。设置为 1 会强制将所有操作视为成功的事务,设置为 0 会导致更改的持久性仅发生在显式 COMMIT 语句上。

交易结构

事务语句的一般结构包括以 START TRANSACTION 开头。下一步是插入一个或多个命令/操作,插入检查错误的语句,插入 ROLLBACK 语句来管理发现的任何错误,最后插入 COMMIT 语句以对成功的操作应用更改。

查看下面给出的示例 –

START TRANSACTION;
SELECT name FROM products WHERE manufacturer = 'XYZ Corp';
UPDATE spring_products SET item = name;
COMMIT;

MariaDB – 更改命令

ALTER 命令提供了一种更改现有表结构的方法,这意味着修改如删除或添加列、修改索引、更改数据类型或更改名称。当元数据锁处于活动状态时,ALTER 还会等待应用更改。

使用 ALTER 修改列

ALTER 与 DROP 配对删除现有列。但是,如果该列是唯一剩余的列,则它会失败。

查看下面给出的示例 –

mysql> ALTER TABLE products_tbl DROP version_num;

使用 ALTER…ADD 语句添加列 –

mysql> ALTER TABLE products_tbl ADD discontinued CHAR(1);

使用关键字 FIRST 和 AFTER 来指定列的位置 –

ALTER TABLE products_tbl ADD discontinued CHAR(1) FIRST;
ALTER TABLE products_tbl ADD discontinued CHAR(1) AFTER quantity;

请注意 FIRST 和 AFTER 关键字仅适用于 ALTER…ADD 语句。此外,您必须先删除一个表,然后再添加它以重新定位它。

通过在 ALTER 语句中使用 MODIFY 或 CHANGE 子句来更改列定义或名称。这些子句具有相似的效果,但使用的语法却大不相同。

查看下面给出的更改示例 –

mysql> ALTER TABLE products_tbl CHANGE discontinued status CHAR(4);

在使用 CHANGE 的语句中,指定原始列,然后指定将替换它的新列。查看下面的修改示例 –

mysql> ALTER TABLE products_tbl MODIFY discontinued CHAR(4);

ALTER 命令还允许更改默认值。回顾一个例子 –

mysql> ALTER TABLE products_tbl ALTER discontinued SET DEFAULT N;

您还可以通过将其与 DROP 子句配对来使用它来删除默认约束 –

mysql> ALTER TABLE products_tbl ALTER discontinued DROP DEFAULT;

使用 ALTER 修改表

使用 TYPE 子句更改表类型 –

mysql> ALTER TABLE products_tbl TYPE = INNODB;

使用 RENAME 关键字重命名表 –

mysql> ALTER TABLE products_tbl RENAME TO products2016_tbl;

MariaDB – 索引和统计表

索引是加速记录检索的工具。索引为索引列中的每个值生成一个条目。

有四种类型的索引 –

  • 主要(一条记录代表所有记录)

  • 唯一(一条记录代表多条记录)

  • 清楚的

  • 全文(允许在文本搜索中有许多选项)。

在这种用法中,术语“键”和“索引”是相同的。

索引与一列或多列相关联,支持快速搜索和高效的记录组织。创建索引时,请考虑查询中经常使用哪些列。然后在它们上创建一个或多个索引。此外,将索引视为本质上的主键表。

尽管索引可以加速搜索或 SELECT 语句,但由于对表和索引执行操作,它们会拖累插入和更新。

创建索引

您可以通过 CREATE TABLE…INDEX 语句或 CREATE INDEX 语句创建索引。支持可读性、维护和最佳实践的最佳选择是 CREATE INDEX。

查看下面给出的索引的一般语法 –

CREATE [UNIQUE or FULLTEXT or...] INDEX index_name ON table_name column;

查看其使用示例 –

CREATE UNIQUE INDEX top_sellers ON products_tbl product;

删除索引

您可以使用 DROP INDEX 或 ALTER TABLE…DROP 删除索引。支持可读性、维护和最佳实践的最佳选择是 DROP INDEX。

查看下面给出的 Drop Index 的一般语法 –

DROP INDEX index_name ON table_name;

查看其使用示例 –

DROP INDEX top_sellers ON product_tbl;

重命名索引

使用 ALTER TABLE 语句重命名索引。查看下面给出的一般语法 –

ALTER TABLE table_name DROP INDEX index_name, ADD INDEX new_index_name;

查看其使用示例 –

ALTER TABLE products_tbl DROP INDEX top_sellers, ADD INDEX top_2016sellers;

管理索引

您将需要检查和跟踪所有索引。使用 SHOW INDEX 列出与给定表关联的所有现有索引。您可以使用“\G”等指定垂直格式的选项来设置显示内容的格式。

查看以下示例 –

mysql > SHOW INDEX FROM products_tbl\G

表格统计

鉴于更快地访问记录和提供的统计信息,索引被大量用于优化查询。然而,许多用户发现索引维护很麻烦。MariaDB 10.0 提供了独立于存储引擎的统计表,可以计算每个存储引擎中每个表的数据统计信息,甚至是未索引列的统计信息。

MariaDB – 临时表

由于速度或一次性数据,某些操作可以从临时表中受益。无论您是从命令提示符、使用 PHP 脚本还是通过客户端程序使用临时表,临时表的生命周期都将在会话终止时结束。它也不会以典型的方式出现在系统中。SHOW TABLES 命令不会显示包含临时表的列表。

创建临时表

CREATE TABLE 语句中的 TEMPORARY 关键字产生一个临时表。查看下面给出的示例 –

mysql>CREATE TEMPORARY TABLE order (
   item_name VARCHAR(50) NOT NULL
   , price DECIMAL(7,2) NOT NULL DEFAULT 0.00
   , quantity INT UNSIGNED NOT NULL DEFAULT 0
);

在创建临时表时,您可以使用 LIKE 子句克隆现有表,这意味着它们的所有一般特征。由于 TEMPORARY 关键字,用于生成临时表的 CREATE TABLE 语句不会提交事务。

尽管临时表与非临时表分开并在会话结束时删除,但它们可能存在某些冲突 –

  • 它们有时会与过期会话中的幽灵临时表发生冲突。

  • 它们有时会与非临时表的影子名称冲突。

注意– 允许临时表与现有的非临时表具有相同的名称,因为 MariaDB 将其视为差异参考。

行政

MariaDB 需要授予用户创建临时表的权限。使用 GRANT 语句将此权限授予非管理员用户。

GRANT CREATE TEMPORARY TABLES ON orders TO 'machine122'@'localhost';

删除临时表

虽然临时表在会话结束时基本上被删除,但您可以选择删除它们。删除临时表需要使用 TEMPORARY 关键字,最佳实践建议在删除任何非临时表之前删除临时表。

mysql> DROP TABLE order;

MariaDB – 表克隆

某些情况需要生成现有表的精确副本。CREATE…SELECT 语句无法生成此输出,因为它忽略了诸如索引和默认值之类的内容。

复制表格的过程如下 –

  • 利用 SHOW CREATE TABLE 生成一个 CREATE TABLE 语句,详细说明源表的整个结构。

  • 编辑语句为表指定一个新名称,然后执行它。

  • 如果您还需要复制表数据,请使用 INSERT INTO…SELECT 语句。

mysql> INSERT INTO inventory_copy_tbl (
   product_id,product_name,product_manufacturer,ship_date)
   
   SELECT product_id,product_name,product_manufacturer,ship_date,
   FROM inventory_tbl;

创建副本的另一种方法是使用 CREATE TABLE AS 语句。该语句复制所有列、列定义,并使用源表的数据填充副本。

查看下面给出的语法 –

CREATE TABLE clone_tbl AS
   SELECT columns
   FROM original_tbl
   WHERE conditions];

在下面查看其使用示例 –

CREATE TABLE products_copy_tbl AS
   SELECT *
   FROM products_tbl;

MariaDB – 序列

在 10.0.3 版本中,MariaDB 引入了一个称为序列的存储引擎。它的 ad hoc 为操作生成一个整数序列,然后它终止。该序列包含按降序或升序排列的正整数,并使用起始值、结束值和增量值。

由于其虚拟(未写入磁盘)性质,它不允许在多个查询中使用,只能在其原始查询中使用。但是,可以通过 ALTER 命令将序列表转换为标准表。如果删除转换后的表,序列表仍然存在。序列也不能产生负数或以最小值/最大值旋转。

安装序列引擎

使用序列需要安装序列引擎,MariaDB 将其作为插件而不是二进制分发。使用以下命令安装它 –

INSTALL SONAME "ha_sequence";

安装后,验证它 –

SHOW ENGINES\G

请记住,引擎安装后,您无法创建名称使用序列语法的标准表,但可以创建一个带有序列语法名称的临时表。

创建序列

有两种序列创建方法 –

  • 创建一个表并使用 AUTO_INCREMENT 属性将列定义为自动增量。

  • 使用现有数据库并使用序列 SELECT 查询来生成序列。查询使用 seq_ [FROM] _to_[TO] 或 seq_[FROM]_to_[TO]_step_STEP 语法。

最佳实践更喜欢使用第二种方法。查看下面给出的序列创建示例 –

SELECT * FROM seq_77_to_99;

序列有很多用途 –

  • 在列中定位缺失值以防止操作中的相关问题 –

SELECT myseq.seq FROM seq_22_to_28 myseq LEFT JOIN table1 t ON myseq.seq
   = x.y WHERE x.y IS NULL;
  • 构建值的组合 –

SELECT x1.seq, x2.seq FROM seq_5_to_9 x1 JOIN seq_5_to_9 x2 ORDER BY 5, 6;
  • 查找数字的倍数 –

SELECT seq FROM seq_3_to_100_step_4;
  • 构建用于预订系统等应用程序的日期序列。
  • 构建时间序列。

MariaDB – 管理重复项

正如在前面的课程中所讨论的,MariaDB 在某些情况下允许重复的记录和表。由于不同的数据或对象类型,或者由于操作对象的独特生命周期或存储,这些重复中的一些实际上不是重复的。这些重复通常也不会造成问题。

在某些情况下,重复确实会导致问题,并且它们经常由于隐式操作或 MariaDB 命令的宽松策略而出现。有多种方法可以控制此问题、查找重复项、删除重复项和防止创建重复项。

策略和工具

管理重复项有四种关键方法 –

  • 使用 JOIN 为它们钓鱼,并使用临时表删除它们。

  • 使用 INSERT…ON DUPLICATE KEY UPDATE 在发现重复时进行更新。

  • 使用 DISTINCT 修剪 SELECT 语句的结果并删除重复项。

  • 使用 INSERT IGNORE 停止插入重复项。

对临时表使用连接

只需像内部连接一样执行半连接,然后删除临时表中找到的重复项。

使用插入

当 INSERT…ON DUPLICATE KEY UPDATE 发现重复的唯一键或主键时,它会执行更新。在发现多个唯一键时,它只更新第一个。因此,不要在具有多个唯一索引的表上使用它。

查看以下示例,该示例揭示了在插入填充字段时包含索引值的表中发生的情况 –

INSERT INTO add_dupl VALUES (1,'Apple');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

注意– 如果没有找到键,则 INSERT…ON DUPLICATE KEY UPDATE 语句像普通插入语句一样执行。

使用 DISTINCT

DISTINCT 子句从结果中删除重复项。DISTINCT 子句的一般语法如下 –

SELECT DISTINCT fields
FROM table
[WHERE conditions];

注意– 带有 DISTINCT 子句的语句的结果 –

  • 使用一个表达式时,它会为其返回唯一值。

  • 使用多个表达式时,它返回唯一的组合。

  • 它不会忽略 NULL 值;因此,结果也包含 NULL 作为唯一值。

对单个表达式使用 DISTINCT 子句查看以下语句 –

SELECT DISTINCT product_id
FROM products
WHERE product_name = 'DustBlaster 5000';

使用多个表达式查看以下示例 –

SELECT DISTINCT product_name, product_id
FROM products
WHERE product_id < 30

使用插入忽略

INSERT IGNORE 语句指示 MariaDB 在发现重复记录时取消插入。查看下面给出的使用示例 –

mysql> INSERT IGNORE INTO customer_tbl (LN, FN)
   VALUES( 'Lex', 'Luther');

另外,请注意重复背后的逻辑。根据该表数据的性质,某些表需要重复。在管理重复记录的策略中满足这种需求。

MariaDB – SQL 注入保护

接受用户输入的简单行为打开了漏洞利用的大门。问题主要源于数据的逻辑管理,但幸运的是,避免这些重大缺陷是相当容易的。

SQL 注入的机会通常发生在用户输入名称等数据时,并且代码逻辑无法分析此输入。相反,该代码允许攻击者插入将在数据库上运行的 MariaDB 语句。

在进行任何处理之前,始终考虑用户输入的、可疑的和需要严格验证的数据。通过模式匹配执行此验证。例如,如果预期的输入是用户名,则将输入的字符限制为字母数字字符和下划线,并限制为特定长度。查看下面给出的示例 –

if(check_match("/^\w{8,20}$/", $_GET['user_name'], $matches)) {
   $result = mysql_query("SELECT * FROM system_users WHERE user_name = $matches[0]");
} else {
   echo "Invalid username";
}

此外,在创建输入约束时利用 REGEXP 运算符和 LIKE 子句。

考虑所有类型的必要的输入显式控制,例如 –

  • 控制使用的转义字符。

  • 控制输入​​的特定适当数据类型。将输入限制为必要的数据类型和大小。

  • 控制输入​​数据的语法。不允许任何超出所需模式的东西。

  • 控制允许的条款。黑名单 SQL 关键字。

您可能不知道注入攻击的危险,或者可能认为它们无关紧要,但它们在安全问题列表中名列前茅。此外,考虑这两个条目的影响 –

1=1
-or-
*

允许将其中任何一个与正确命令一起输入的代码可能会导致泄露数据库中的所有用户数据或删除数据库中的所有数据,这两种注入都不是特别聪明。在某些情况下,攻击者甚至不会花时间检查漏洞;他们通过简单的输入进行盲目攻击。

此外,请考虑与 MariaDB 配对的任何编程/脚本语言提供的模式匹配和正则表达式工具,它们提供更多控制,有时甚至更好控制。

MariaDB – 备份方法

数据是业务和运营的基础,并且存在各种可能的威胁(例如,攻击者、系统故障、错误升级和维护错误),备份仍然至关重要。这些备份有多种形式,并且存在许多选项来创建它们,并在这些过程中使用更广泛的选项集。要记住的重要事项是数据库类型、关键信息和所涉及的结构。此信息决定了您的最佳选择。

选项

备份的主要选项包括逻辑备份和物理备份。逻辑备份保存用于恢复数据的 SQL 语句。物理备份包含数据副本。

  • 与物理备份相比,逻辑备份提供了在另一台具有不同配置的机器上恢复数据的灵活性,物理备份通常仅限于相同的机器和数据库类型。逻辑备份发生在数据库和表级别,物理备份发生在目录和文件级别。

  • 物理备份的大小比逻辑备份小,而且执行和恢复所需的时间也更少。物理备份还包括日志和配置文件,但逻辑备份不包括。

备份工具

用于 MariaDB 备份的主要工具是mysqldump它提供逻辑备份和灵活性。它还证明是小型数据库的绝佳选择。Mysqldump将数据转储为 SQL、CSV、XML 和许多其他格式。它的输出不会在没有明确指令的情况下保留存储过程、视图和事件。

mysqldump备份有三个选项

  • 原始数据– 通过 –tab 选项将表作为原始数据文件转储,该选项还指定了文件的目的地 –

$ mysqldump -u root -p --no-create-info \
   --tab=/tmp PRODUCTS products_tbl
  • 数据/定义导出– 此选项允许将单个或多个表导出到文件,并支持备份主机上的所有现有数据库。检查将内容或定义导出到文件的示例

$ mysqldump -u root -p PRODUCTS products_tbl > export_file.txt
  • Transfer – 您还可以将数据库和表输出到另一台主机

$ mysqldump -u root -p database_name \
   | mysql -h other-host.com database_name

使用 SELECT…INTO OUTFILE 语句

导出数据的另一个选项是使用 SELECT…INTO OUTFILE 语句。这个简单的选项将表格输出到一个简单的格式化文本文件中 –

mysql> SELECT * FROM products_tbl
   -> INTO OUTFILE '/tmp/products.txt';

它的属性允许将文件格式化为您的首选规范。

请注意此声明的以下品质 –

  • 文件名必须指定您想要的输出位置。

  • 您需要 MariaDB 文件权限才能执行该语句。

  • 输出文件名必须是唯一的。

  • 您需要主机上的登录凭据。

  • 在 UNIX 环境中,输出文件是全局可读的,但其服务器所有权会影响您删除它的能力。确保您拥有特权。

在备份中使用 CONNECT

CONNECT 处理程序允许导出数据。这证明主要在 SELECT…INTO OUTFILE 操作不支持文件格式的情况下很有用。

查看以下示例 –

create table products
engine = CONNECT table_type = XML file_name = 'products.htm' header = yes
option_list = 'name = TABLE,coltype = HTML,attribute = border = 1;cellpadding = 5'

select plugin_name handler, plugin_version version, plugin_author
author, plugin_description description, plugin_maturity maturity
from information_schema.plugins where plugin_type = 'STORAGE ENGINE';

其他工具

其他备份选项如下 –

  • XtraBackup – 此选项针对 XtraDB/InnoDB 数据库并适用于任何存储引擎。从 Percona 的官方网站了解有关此工具的更多信息。

  • 快照– 一些文件系统允许快照。该过程包括使用读锁刷新表、安装快照、解锁表、复制快照,然后卸载快照。

  • LVM – 这种流行的方法使用 Perl 脚本。它在每个表上获得一个读锁并将缓存刷新到磁盘。然后它获取快照并解锁表。有关更多信息,请咨询官方mylvmbackup网站。

  • TokuBackup – Percona 提供的这个解决方案提供热备份,考虑到 InnoDB 备份选项的问题和限制。当应用程序继续操作它们时,它会生成文件的事务性声音副本。有关更多信息,请访问 Percona 网站。

INNODB注意事项

InnoDB 使用缓冲池来增强性能。在备份中,配置 InnoDB 以避免将整个表复制到缓冲池中,因为逻辑备份通常执行全表扫描。

MariaDB – 备份加载方法

在本章中,我们将了解各种备份加载方法。从备份恢复数据库是一个简单的过程,有时甚至是非常漫长的过程。

加载数据有三个选项:LOAD DATA 语句、mysqlimport 和简单的 mysqldump 还原。

使用负载数据

LOAD DATA 语句用作批量加载程序。查看加载文本文件的使用示例 –

mysql> LOAD DATA LOCAL INFILE 'products_copy.txt' INTO TABLE empty_tbl;

请注意 LOAD DATA 语句的以下特性 –

  • 使用 LOCAL 关键字来防止 MariaDB 对主机进行深度搜索,并使用非常具体的路径。

  • 该语句采用由换行符(换行符)终止的行和由制表符分隔的数据值组成的格式。

  • 使用 FIELDS 子句显式指定行上字段的格式。使用 LINES 子句指定行结束。查看下面的示例。

mysql> LOAD DATA LOCAL INFILE 'products_copy.txt' INTO TABLE empty_tbl
   FIELDS TERMINATED BY '|'
   LINES TERMINATED BY '\n';
  • 该语句假定数据文件中的列使用表的相同顺序。如果您需要设置不同的顺序,您可以按如下方式加载文件 –

mysql> LOAD DATA LOCAL INFILE 'products_copy.txt' INTO TABLE empty_tbl (c, b, a);

使用 MYSQLIMPORT

mysqlimport 工具充当 LOAD DATA 包装器,允许从命令行执行相同的操作。

加载数据如下 –

$ mysqlimport -u root -p --local database_name source_file.txt

指定格式如下 –

$ mysqlimport -u root -p --local --fields-terminated-by="|" \
   --lines-terminated-by="\n" database_name source_file.txt

使用 — columns选项指定列顺序 –

$ mysqlimport -u root -p --local --columns=c,b,a \
   database_name source_file.txt

使用 MYSQLDUMP

使用mysqldump恢复需要这个简单的语句来将转储文件加载回主机 –

shell> mysql database_name < source_file.sql

特殊字符和引号

在 LOAD DATA 语句中,引号和特殊字符可能无法正确解释。该语句采用不带引号的值并将反斜杠视为转义字符。使用 FIELDS 子句指定格式。用“ENCLOSED BY”指向引号,这会导致从数据值中剥离引号。使用“ESCAPED BY”更改转义。

MariaDB – 有用的函数

本章包含最常用函数的列表,提供定义、解释和示例。

MariaDB 聚合函数

最常用的聚合函数如下 –

Sr.No 名称和描述
1

COUNT

它计算记录数。

示例– SELECT COUNT(*) FROM customer_table;

2

MIN

它揭示了一组记录的最小值。

示例– SELECT 组织,MIN(account) FROM 合同 GROUP BY 组织;

3

MAX

它揭示了一组记录的最大值。

示例– SELECT 组织,MAX(account_size) FROM 合同 GROUP BY 组织;

4

AVG

它计算一组记录的平均值。

示例– SELECT AVG(account_size) FROM contract;

5

SUM

它计算一组记录的总和。

示例– SELECT SUM(account_size) FROM contract;

MariaDB 年龄计算

TIMESTAMPDIFF功能提供了一个方法来计算年龄-

SELECT CURDATE() AS today;
SELECT ID, DOB, TIMESTAMPDIFF(YEAR,DOB,'2015-07-01') AS age FROM officer_info;

MariaDB 字符串连接

CONCAT函数返回一个级联操作后得到的字符串。您可以使用一个或多个参数。查看下面给出的语法 –

SELECT CONCAT(item, item,...);

查看以下示例 –

SELECT CONCAT('Ram', 'bu', 'tan');
Output:Rambutan

MariaDB 日期/时间函数

以下是重要的日期函数 –

Sr.No 名称和描述
1

CURDATE()

它以 yyyy-mm-dd 或 yyyymmdd 格式返回日期。

示例– SELECT CURDATE();

2

DATE()

它以多种格式返回日期。

示例-CREATE TABLE product_release_tbl (x DATE);

3

CURTIME()

它以 HH:MM:SS 或 HHMMSS.uuuuuu 格式返回时间。

示例– SELECT CURTIME();

4

DATE_SUB()

它从指定的日期增加或减少天数。

示例– SELECT DATE_SUB(‘2016-02-08’, INTERVAL 60 DAY);

5

DATEDIFF()

它确定两个日期之间的天数。

示例– SELECT DATEDIFF(‘2016-01-01 23:59:59′,’2016-01-03’);

6

DATE ADD()

它向/从日期和时间添加或减去任何时间单位。

示例– SELECT DATE_ADD(‘2016-01-04 23:59:59’, INTERVAL 22 SECOND);

7

EXTRACT()

它从日期中提取一个单位。

示例– SELECT EXTRACT(YEAR FROM ‘2016-01-08’);

8

NOW()

它以 yyyy-mm-dd hh:mm:ss 或 yyyymmddhhmmss.uuuuuu 格式返回当前日期和时间。

示例– SELECT NOW();

9

DATE FORMAT()

它根据指定的格式字符串格式化日期。

示例– SELECT DATE_FORMAT(‘2016-01-09 20:20:00’, ‘%W %M %Y’);

以下是一些重要的时间函数 –

Sr.No 名称和描述
1

HOUR()

它返回时间的小时数,或经过的小时数。

示例– SELECT HOUR(’19:17:09′);

2

LOCALTIME()

它的功能与 NOW() 完全一样。

3

MICROSECOND()

它返回时间的微秒。

示例– SELECT MICROSECOND(’16:30:00.543876′);

4

MINUTE()

它返回时间的分钟。

示例– SELECT MINUTE(‘2016-05-22 17:22:01’);

5

SECOND()

它返回日期的秒数。

示例– SELECT SECOND(‘2016-03-12 16:30:04.000001’);

6

TIME_FORMAT()

它根据指定的格式字符串格式化时间。

示例– SELECT TIME_FORMAT(’22:02:20′, ‘%H %k %h %I %l’);

7

TIMESTAMP()

它以 yyyy-mm-dd hh:mm:dd 格式为活动提供时间戳。

示例– CREATE TABLE orders_ (ID INT, tmst TIMESTAMP);

MariaDB 数值函数

以下是 MariaDB 中一些重要的数字函数 –

Sr.No 名称和描述
1

TRUNCATE()

它将截断的数字返回到小数位规范。

示例– SELECT TRUNCATE(101.222, 1);

2

COS()

它返回 x 弧度的余弦值。

示例– SELECT COS(PI());

3

CEILING()

它返回不低于 x 的最小整数。

示例– SELECT CEILING(2.11);

4

DEGREES()

它将弧度转换为度数。

示例– SELECT DEGREES(PI());

5

DIV()

它执行整数除法。

示例– SELECT 100 DIV 4;

6

EXP()

它返回 e 的 x 次方。

示例– SELECT EXP(2);

7

FLOOR()

它返回不大于 x 的最大整数。

示例– SELECT FLOOR(2.01);

8

LN()

它返回 x 的自然对数。

示例– SELECT LN(3);

9

LOG()

它返回自然对数或给定底数的对数。

示例– SELECT LOG(3);

10

SQRT()

它返回平方根。

示例– SELECT SQRT(16);

MariaDB 字符串函数

下面给出了重要的字符串函数 –

Sr.No 名称和描述
1

INSTR()

它返回子字符串的第一个实例的位置。

示例– SELECT INSTR(‘rambutan’, ‘tan’);

2

RIGHT()

它返回最右边的字符串字符。

示例– SELECT RIGHT(‘rambutan’, 3);

3

LENGTH()

它返回字符串的字节长度。

示例– SELECT LENGTH(‘rambutan’);

4

LOCATE()

它返回子字符串的第一个实例的位置。

示例– SELECT LOCATE(‘tan’, ‘rambutan’);

5

INSERT()

它返回一个字符串,在某个位置有一个指定的子字符串,它被修改了。

示例– SELECT INSERT(‘ramputan’, 4, 1, ‘b’);

6

LEFT()

它返回最左边的字符。

示例– SELECT LEFT(‘rambutan’, 3);

7

UPPER()

它将字符更改为大写。

示例– SELECT UPPER(lastname);

8

LOWER()

它将字符更改为小写。

示例– SELECT LOWER(lastname);

9

STRCMP()

它比较字符串并在它们相等时返回 0。

示例– SELECT STRCMP(‘egg’, ‘cheese’);

10

REPLACE()

它在替换字符后返回一个字符串。

示例– SELECT REPLACE(‘sully’, ‘l’, ‘n’);

11

REVERSE()

它反转字符串中的字符。

示例– SELECT REVERSE(‘racecar’);

12

REPEAT()

它返回一个重复给定字符 x 次的字符串。

示例– SELECT REPEAT(‘ha ‘, 10);

13

SUBSTRING()

它从一个字符串返回一个子字符串,从位置 x 开始。

示例– SELECT SUBSTRING(‘rambutan’,3);

14

TRIM()

它从字符串中删除尾随/前导字符。

示例– SELECT TRIM(LEADING ‘_’ FROM ‘_rambutan’);

觉得文章有用?

点个广告表达一下你的爱意吧 !😁