当您编写程序或配置服务时,您最终会持久存储信息。有时,您只需要一个INI或YAML配置文件。有时,自定义格式的XML或JSON或类似的东西更好。但有时您也需要验证输入、快速查询信息、关联数据以及通常巧妙地处理用户的请求。这就是数据库的设计目的,而MariaDB(由MySQL的原始开发人员开发的分支)是一个很好的选择。在本文中,我使用的是MariaDB,但这些信息同样适用于MySQL。通过编程语言与数据库进行交互是很常见的。因此,有大量用于Java、Python、Lua、PHP、Ruby、C++和其他语言的SQL库。但是,在使用这些库之前,了解数据库引擎的作用以及选择数据库的重要性的原因是有帮助的。本文介绍了MariaDB和mysql命令,以帮助您熟悉数据库处理数据的基础知识。如果您还没有安装MariaDB,请查看我的文章在Linux上安装MariaDB。如果您使用的不是Linux,请按照MariaDB下载页面上提供的说明进行操作。1.与MariaDB交互您可以使用mysql命令与MariaDB交互。首先使用子命令ping来确认你的服务正在运行,并在提示时输入密码:$mysqladmin-uroot-ppingEnterpassword:mysqldisalive打开一个交互式MariaDB会话供读者了解:$mysql-uroot-pEnterpassword:WelcometotheMariaDBmonitor。Commandsendwith;or\g.[...]Type'help;'or'\h'forhelp.Type'\c'toclearthecurrentinputstatement.MariaDB[(none)]>YounowareinaMariaDBsubshel??l提示符为MariaDB提示符。这里不能使用普通的Bash命令,只能使用MariaDB命令。键入帮助(或?)以查看命令列表。这些是MariaDBshell的管理命令,允许您自定义shell,但它们不是SQL语言的一部分。二、学习SQL基础结构化查询语言是根据其能力定义的:一种通过规则一致的语法查询数据库内容以获得有用结果的方法。SQL看起来像普通的英文语句,有点生硬。例如,如果您登录到数据库服务器并想查看哪些库可用,请键入SHOWDATABASES;然后按Enter查看结果。SQL命令以分号结尾。如果你忘记输入分号,MariaDB会认为你想在下一行继续输入你的查询命令,你可以继续输入命令或者在下一行输入分号结束命令。MariaDB[(NONE)]>SHOWDATABASES;+----------------+|DATABASE|+---------------------+|information_schema||mysql||performance_schema||test|+--------------------+4ROWSINSET(0.000sec)上面的例子说明了当前有有四个数据库:information_schema、mysql、performance_schema和test。您必须指定MariaDB使用哪个库,以便对该库使用查询。指定数据库的命令是use。当您选择一个库时,MariaDB工具提示将切换到所选库。MariaDB[(NONE)]>USEtest;MariaDB[(test)]>1.显示数据库中的表数据库有表,类似于电子表格:有一系列的行(在数据库中称为记录)和列。一行和一列唯一标识一个字段。查看一个数据库中的可用表(可以理解为多表单电子表格中的一页),使用SQL关键字SHOW:MariaDB[(test)]>SHOWTABLES;emptySETtest数据库为空,所以使用use命令切换到mysql数据库:MariaDB[(test)]>USEmysql;MariaDB[(mysql)]>SHOWTABLES;+---------------------------+|Tables_in_mysql|+----------------------------+|column_stats||columns_priv||db|[...]|time_zone_transition_type||transaction_registry||USER|+----------------------------+31ROWSINSET(0.000sec)这个数据库有很多表!mysql数据库就是这个MariaDB实例系统管理的数据库。它包含重要数据,例如用于管理数据库权限的用户结构。这个数据库非常重要,您不需要经常直接与它交互,但通常使用SQL脚本来操作它。了解mysql数据库在学习MariaDB时很有用,因为它有助于说明一些基本的SQL命令。2.查一张表本实例mysql数据库中最后一张表名为USER。该表包含可以访问该数据库的用户。目前只有一个root用户,但您可以添加不同权限的用户,并授予他们查看、更新或创建数据的权限。您可以通过查看表的列标题来查看MariaDB用户的所有属性:>SHOWCOLUMNSINUSER;MariaDB[mysql]>SHOWCOLUMNSINUSER;+------------+-------------+-----+-----+--------+|FIELD|TYPE|NULL|KEY|DEFAULT|+------------+----------------+------+-----+----------+|主机|CHAR(60)|NO|PRI|||USER|CHAR(80)|NO|PRI|||密码|CHAR(41)|NO||||Select_priv|enum('N','Y')|NO||N||Insert_priv|enum('N','Y')|NO||N||Update_priv|enum('N','Y')|NO||N||Delete_priv|enum('N','Y')|NO||N||Create_priv|enum('N','Y')|NO||N||Drop_priv|enum('N','Y')|NO||N|[...]47ROWSINSET(0.001sec)3.创建一个新用户无论您需要一个通用帐户来管理数据库还是为计算机配置数据库(例如在安装WordPress、Drupal或Joomla时),在MariaDB中再创建一个用户帐户很常见。您可以通过向mysql数据库的USER表中添加用户或使用SQL关键字CREATE来提示MariaDB创建MariaDB用户。使用CREATE创建新用户默认会执行一些有用的方法,所以你不需要手动生成所有信息:>CREATEUSER'tux'@'localhost'IDENTIFIEDBY'really_secure_password';4.查看表的字段,可以使用SELECT关键字查看数据库表的字段和值。在此示例中,您创建了一个名为tux的用户,因此查询USER表中的列:>SELECTUSER,hostFROMUSER;+------+------------+|USER|host|+------+------------+|root|localhost|[...]|tux|localhost|+------+------------+7ROWSINSET(0.000sec)5.授予用户权限通过查看USER表中列出的信息,可以看到用户的状态。例如,新用户tux对该数据库没有权限。使用WHERE语句,只能查看tux记录。>SELECTUSER,select_priv,insert_priv,update_privFROMUSERWHEREUSER='tux';+------+----------+------------+-------------+|USER|select_priv|insert_priv|update_priv|+------+------------+-------------+------------+|tux|N|N|N|+-----+--------------+------------+------------+使用GRANT命令修改用户权限:>GRANTSELECTON*.*TO'tux'@'localhost';>FLUSHPRIVILEGES;验证您的更改:>SELECTUSER,select_priv,insert_priv,update_privFROMUSERWHEREUSER='tux';+------+------------+-----------+------------+|USER|select_priv|insert_priv|update_priv|+------+--------------+------------+------------+|tux|Y|N|N|+------+-------------+------------+------------+tux用户现在拥有查询记录的权限.三、创建自定义数据库到目前为止,您一直在与默认数据库进行交互。除了用户管理,大多数人很少与默认数据库交互。通常,您将使用自定义数据填充创建的数据库。1.创建一个MariaDB数据库您可能已经能够自己在MariaDB中创建新的数据库。创建数据库类似于创建新用户。使用use命令将新建的数据库作为当前库:>CREATEDATABASEexample;QueryOK,1ROWaffected(0.000sec)>SHOWDATABASES;+--------------------+|DATABASE|+--------------------+|example|[...]使用use命令将新建的数据库作为当前库:>USEexample;2.创建表创建表比创建数据库更复杂,因为您必须定义列标题。MariaDB提供了许多方便的功能,可用于创建列、引入数据类型定义、自增选项、空值约束、自动时间戳等。下面是一个用来描述一系列用户的简单表:>CREATETABLEIFNOTEXISTSmember(->idINTAUTO_INCREMENTPRIMARYKEY,->nameVARCHAR(128)NOTNULL,->startdateTIMESTAMPDEFAULTCURRENT_TIMESTAMP);QueryOK,0ROWaffected(0.030sec)这个表使用自增的方式以唯一标识每一行。表示用户名的字段不能为空(或null),每行创建时会自动生成一个时间戳。使用SQL关键字INSERT用一些示例数据填充此表:>INSERTINTOmember(name)VALUES('Alice');QueryOK,1ROWaffected(0.011sec)>INSERTINTOmember(name)VALUES('Bob');QueryOK,1ROWaffected(0.011sec))>INSERTINTOmember(name)VALUES('Carol');QueryOK,1ROWaffected(0.011sec)>INSERTINTOmember(name)VALUES('David');QueryOK,1ROWaffected(0.011sec)验证表中的数据:>SELECT*FROMmember;+----+--------+--------------------+|id|名称|开始日期|+----+------+--------------------+|1|爱丽丝|2020-10-0315:25:06||2|鲍勃|2020-10-0315:26:43||3|卡罗尔|2020-10-0315:26:46||4|大卫|2020-10-0315:26:51|+----+-------+--------------------+4ROWSINSET(0.000sec)3。同时添加多行数据,建表:>CREATETABLEIFNOTEXISTSlinux(->idINTAUTO_INCREMENTPRIMARYKEY,->distroVARCHAR(128)NOTNULL);QueryOK,0ROWSaffected(0.030sec)填充一些示例数据,这次使用VALUES快捷方式,以便您可以一次添加多行。VALUES关键字将括在圆括号中的列表作为参数,或以逗号分隔的多个列表作为参数。>INSERTINTTOlinux(distro)->VALUES('Slackware'),('RHEL'),('Fedora'),('Debian');QueryOK,4ROWSaffected(0.011sec)Records:4Duplicates:0Warnings:0>SELECT*FROMlinux;+----+------------+|id|distro|+----+------------+|1|Slackware||2|RHEL||3|Fedora||4|Debian|+----+------------+4.关联多个表现在你有两个表,它们之间没有任何关系。两个表中的数据是独立的,但您可能需要表一中的值来标识表二中的记录。可以在表1中添加一个新的列对应表2中的值。由于两个表都有唯一标识符(自动递增的id字段),最简单的关联方式是使用表一中的id字段作为表二的查询条件。在表1中创建一列以表示表??2中的值:>ALTERTABLEmemberADDCOLUMN(osINT);QueryOK,0ROWSaffected(0.012sec)Records:0Duplicates:0Warnings:0>DESCRIBEMember;DESCRIBEMember;+----------+------------+------+-----+--------+------+|FIELD|TYPE|NULL|KEY|DEFAULT|Extra|+------------+------------+------+-----+--------+------+|id|INT(11)|NO|PRI|NULL|auto_||name|VARCHAR(128)|NO||NULL|||开始日期|TIMESTAMP|NO||cur[...]|||os|INT(11)|YES||NULL||+------------+--------------+-----+-----+--------+-----+将linux表中的唯一ID分配给每个成员。因为记录已经存在,所以使用UPDATE关键字而不是INSERT。特别是当你想查询某一行,然后更新某一列的值时。从句法上看,表达式有点颠倒,先更新再查询:>UPDATEmemberSETos=1WHEREname='Alice';QueryOK,1ROWaffected(0.007sec)ROWSmatched:1Changed:1Warnings:0要填充数据,请对其他名称重复此过程。为了数据的多样性,在四行记录中分配了三个不同的值。联表:既然两张表已经关联起来了,那么就可以使用SQL来展示关联的数据了。数据库的连接方式有很多,大家可以尽量多尝试。以下示例将member表中的os字段与linux表中的id字段相关联:SELECT*FROMmemberJOINlinuxONmember.os=linux.id;+----+--------+---------------------+------+----+------------+|id|name|startdate|os|id|发行版|+----+--------+--------------------+------+----+------------+|1|爱丽丝|2020-10-0315:25:06|1|1|Slackware||2|鲍勃|2020-10-0315:26:43|3|3|Fedora||4|David|2020-10-0315:26:51|3|3|Fedora||3|Carol|2020-10-0315:26:46|4|4|Debian|+----+------+--------------------+-----+----+-----------+4ROWSINSET(0.000sec)连接os和id字段。在图形应用中,你可以想象在下拉菜单中可以设置os字段,取值的来源是linux表中的distro字段。通过在多个表中使用独立但相关的数据,可以保证数据的一致性和有效性,并且可以使用SQL动态关联它们。5.下载MariaDB和MySQL备忘单MariaDB是一个企业级数据库。它是一个健壮、强大且高效的数据库引擎。学习它是朝着管理Web应用程序和编写语言库迈出的重要一步。您可以下载MariaDB和MySQL备忘单,以便在您使用MariaDB时快速参考。
