MySQL / MariaDB一脉相承,是著名的开源数据库系统。本文将详细演示如何在MySQL/MariaDB系统中创建数据库(也被称作schema)、数据表以及如何使用数据操作语言(DML)来操作数据库中的数据。
本文假设你已经安装了MySQL/MariaDB数据库系统,并且执行了相关的数据库安全操作。如果自己的系统中没有安装MySQL/MariaDB,则可以依照官方教程将其安装到自己的系统。
为了简便起见,本文将以MariaDB为例,在Linux系统上进行演示。由于MariaDB同MySQL之间的特殊关系,本教程里面涉及的概念和命令对于MySQL同样适用。
创建数据库、表和对用户授权
众所周知的是,一个数据库可以使用简单的方式进行定义以进行信息存储。MariaDB是一种典型的关系型数据库管理系统(RDBMS),使用结构化查询语句(SQL)来操作数据库。另外需要提醒的是,在MariaDB系统中,数据库(Database)和图表(schema)的概念是可以互用的。
为了在数据库中存储信息,我们使用数据表来以按行的方式存储数据。通常,两张或多张数据表都具有一定的相关性,这种相关性就是组织关系型数据库的重要特征。
创建新的数据库
为了创建一个名叫RultrDB
的数据库,需要在MariaDB的命令提示符下输入如下命令(在以root用户登录时,需要输入正确的密码才可以进入到MariaDB的命令行界面):
# mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 5
Server version: 10.1.31-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> CREATE DATABASE RultrDB;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]>
一旦数据库创建完成,我们还需要在数据库中创建几张数据表来存储数据。在MySQL/MariaDB系统中,用户数据库只是存储文件的目录,数据库名就是目录名,而真正存储数据的载体是表文件。在使用数据表之前,我们首先要了解一下数据类型的概念。
MariaDB的数据类型
正如我们之前介绍的那样,数据表是用来存储信息的实际数据库对象,每个数据表都包含了两个或更多的字段(也被称作数据列),每个字段都可以保存不同类型的数据。
MariaDB常用的数据类型有以下几种:
数值型
- BOOLEAN 数值”0″表示假,其余数值表示真
- TINYINT 如果使用SIGNED参数,则取值范围为-128~127,UNSIGNED的取值范围为0~255
- SMALLINT 如果使用SIGNED参数,则取值范围为-32768~32767,UNSIGNED的取值范围为0~65535
- INT 如果使用SIGNED参数,则取值范围为-2147483648~2147483647,UNSIGNED的取值范围为0~4294967295
- DOUBLE(M,D) 其中M表示数据的所有数位,而D表示小数点后的位数,用于表示双精度浮点数。如果在定义时使用了UNSIGNED参数,则表示不允许使用负数
注意,对于TINYINT、SMALLINT和INT类型来说,默认是SIGNED的数据。
字符串
- VARCHAR(M) 可变长字符串,其中M是指字段允许的最大字节数(理论上是65535)。通常情况下,一个字节对应于一个字符,但是也有一些字符会占用多个字节。
- TEXT(M) 表示最长为65535的字符串,其中M是指字符串的最小长度
- MEDIUMTEXT(M)和LONGTEXT(M) 同TEXT(M)类似,只是最大允许字节数分别为16777215和4294967295
日期和时间
- DATE 表示YYYY-MM-DD日期格式
- TIME 表示HH:MM:SS.sss时间格式(小时:分钟:秒:毫秒)
- DATETIME 是将DATE和TIME组合起来的YYYY-MM-DD HH:MM:SS的日期时间格式
- TIMESTAMP 表示时间戳,是记录被添加或修改时的时间点
对以上的数据类型有了大致了解后,你就可以为每个数据表中的字段选择适合的数据类型了。例如一个用户的名字可以使用VARCHAR(50)来定义,而用户的文章则可以使用TEXT类型。
创建具有主键和外键的数据表
在我们创建数据表前,需要首先了解一下关系型数据库的两个基本概念:主键和外键。
主键是一个数据表中可以区分每行数据的唯一标识,另一方面,外键是两张数据表中数据的链接关系,可以根据外键来定位数据表中的数据。一般来说,主键和外键都使用INT数据类型。
为了更加形象的讲解,我们使用RultrDB数据库来新建两张数据表tbl_Authors
和tbl_Books
。以下的示例中NOT NULL参数表示该字段的数据不允许为空,而AUTO_INCREMENT参数多用于使用INT类型的数据表主键,默认情况下会为每条新增的数据记录自动产生一个新的加一数值:
MariaDB [(none)]> USE RultrDB; Database changed MariaDB [RultrDB]> CREATE TABLE tbl_Authors ( -> AuthorID INT NOT NULL AUTO_INCREMENT, -> AuthorName VARCHAR(100), -> PRIMARY KEY(AuthorID) -> ); Query OK, 0 rows affected (1.66 sec) MariaDB [RultrDB]> CREATE TABLE tbl_Books ( -> BookID INT NOT NULL AUTO_INCREMENT, -> BookName VARCHAR(100) NOT NULL, -> AuthorID INT NOT NULL, -> BookPrice DECIMAL(6,2) NOT NULL, -> BookLastUpdated TIMESTAMP, -> BookIsAvailable BOOLEAN, -> PRIMARY KEY(BookID), -> FOREIGN KEY(AuthorID) REFERENCES tbl_Authors(AuthorID) -> ); Query OK, 0 rows affected (2.57 sec)
数据表创建完成后,可以查看一下MariaDB数据文件存储目录:
图.1 MariaDB数据文件结构
MariaDB数据文件默认存储在”/var/lib/mysql”目录,可以看到,新建的数据库RultrDB就是以目录形式存在,而数据表会以表名分别生成”.frm”和”.ibd”文件。其中”.frm”是表的元数据,包括表结构的定义信息等;”.ibd”是表的数据文件。根据不同的数据存储引擎而使用不同的后缀,MyISAM引擎 用”.myd”作为扩展名,Innodb引擎用”.ibd” 作为扩展名。数据存储引擎可以在创建数据表时指定,MariaDB默认使用Innodb引擎。至于不同存储引擎的区别,有兴趣研究的朋友可查阅相关资料。
有了数据表,就可以向tbl_Authors
和tbl_Books
数据表中添加数据了。
数据的增、删、改、查操作
我们首先要向tbl_Authors
表添加数据,其原因在于向tbl_Books
表中添加数据时需要有其外键AuthoID
值存在。在MariaBD命令行输入如下语句用于添加数据(记录)至tbl_Authors
表:
MariaDB [RultrDB]> INSERT INTO tbl_Authors (AuthorName) VALUES ('Agatha Christie'), ('Stephen King'), ('Paulo Coelho');
之后就可查询tbl_Authors
表中的内容,注意我们需要记下每条记录的AuthorID
值,用于之后向tbl_Books
表中插入数据。
如果需要定位某些记录值,就需要在”SELECT”语句中加入”WHERE”条件,当然如果不用就将同时查询出所有的内容:
MariaDB [RultrDB]> SELECT * FROM tbl_Authors WHERE AuthorName='Agatha Christie'; +----------+-----------------+ | AuthorID | AuthorName | +----------+-----------------+ | 1 | Agatha Christie | +----------+-----------------+ 1 row in set (0.00 sec) MariaDB [RultrDB]> SELECT * FROM tbl_Authors; +----------+-----------------+ | AuthorID | AuthorName | +----------+-----------------+ | 1 | Agatha Christie | | 2 | Stephen King | | 3 | Paulo Coelho | +----------+-----------------+ 3 rows in set (0.00 sec)
图.2 SELECT语句查询数据
现在我们使用INSERT语句来向tbl_Books
表添加数据,注意AuthorID对应于前的面的tbl_Authors
表中的AuthorID,而BookIsAvailable字段用数值1用于表示可以获得,数值0表示不能得到。
MariaDB [RultrDB]> INSERT INTO tbl_Books (BookName, AuthorID, BookPrice, BookIsAvailable) -> VALUES ('And Then There Were None', 1, 14.95, 1), -> ('The Man in the Brown Suit', 1, 23.99, 1), -> ('The Stand', 2, 35.99, 1), -> ('Pet Sematary', 2, 17.95, 0), -> ('The Green Mile', 2, 29.99, 1), -> ('The Alchemist', 3, 25, 1), -> ('By the River Piedra I Sat Down and Wept', 3, 18.95, 0); Query OK, 7 rows affected (0.18 sec) Records: 7 Duplicates: 0 Warnings: 0 MariaDB [RultrDB]>
现在我们用SELECT语句来查询tbl_Books
表的内容,并使用UPDATE语句将BookName为”The Alchemist”记录的价格进行修改,可以观察表中”BookLastUpdated”数值的变化情况:
MariaDB [RultrDB]> SELECT * FROM tbl_Books; +--------+-----------------------------------------+----------+-----------+---------------------+-----------------+ | BookID | BookName | AuthorID | BookPrice | BookLastUpdated | BookIsAvailable | +--------+-----------------------------------------+----------+-----------+---------------------+-----------------+ | 1 | And Then There Were None | 1 | 14.95 | 2018-03-01 14:00:37 | 1 | | 2 | The Man in the Brown Suit | 1 | 23.99 | 2018-03-01 14:00:37 | 1 | | 3 | The Stand | 2 | 35.99 | 2018-03-01 14:00:37 | 1 | | 4 | Pet Sematary | 2 | 17.95 | 2018-03-01 14:00:37 | 0 | | 5 | The Green Mile | 2 | 29.99 | 2018-03-01 14:00:37 | 1 | | 6 | The Alchemist | 3 | 25.00 | 2018-03-01 14:00:37 | 1 | | 7 | By the River Piedra I Sat Down and Wept | 3 | 18.95 | 2018-03-01 14:00:37 | 0 | +--------+-----------------------------------------+----------+-----------+---------------------+-----------------+ 7 rows in set (0.00 sec) MariaDB [RultrDB]> UPDATE tbl_Books SET BookPrice=22.75 WHERE BookID=6; Query OK, 1 row affected (0.23 sec) Rows matched: 1 Changed: 1 Warnings: 0 MariaDB [RultrDB]> SELECT * FROM tbl_Books WHERE BookID=6; +--------+---------------+----------+-----------+---------------------+-----------------+ | BookID | BookName | AuthorID | BookPrice | BookLastUpdated | BookIsAvailable | +--------+---------------+----------+-----------+---------------------+-----------------+ | 6 | The Alchemist | 3 | 22.75 | 2018-03-01 14:12:55 | 1 | +--------+---------------+----------+-----------+---------------------+-----------------+ 1 row in set (0.00 sec) MariaDB [RultrDB]>
图.3 插入并更新表数据
当然,我们也可以使用”DELETE”语句来删除那些不再需要的记录,这里就不实际执行了。例如想将tbl_Books表中的”The Alchemist”的记录删除,可以使用如下语句:
MariaDB [RultrDB]> DELETE FROM tbl_Books WHERE BookID=6;
由于可能会受到”DELETE”语句的潜在影响,所以在”UPDATE”更新数据前最好用”SELECT”语句查询一下表中的内容,以免出错。
删除数据时注意要使用删除条件”WHERE”语句,以保证删除的数据确实是我们不想要的那些,不然可能会带来意料之外的结果。
如果想要组合两个(或多个)字段的内容,则可以使用”CONCAT”语句。例如我们想从”tbl_Books”表中取得书名,同时从”tbl_Authors”表中取得作者名,并在查询结果的一个字段中显示,而另一个字段则显示书的价格,那么”CONCAT”语句就派上了用场。
查询语句将同时使用”JOIN”语句来指定两个表中”AuthorID”的相同的内容:
MariaDB [RultrDB] SELECT CONCAT(tbl_Books.BookName, ' (',tbl_Authors.AuthorName,')') AS Description, tbl_Books.BookPrice FROM tbl_Authors JOIN tbl_Books ON tbl_Authors.AuthorID = tbl_Books.AuthorID;
可以看到,”CONTACT”语句允许我们将”,”号分隔的内容连接起来,并且使用了”AS”语句将查询返回结果字段名设定为”Description”,语句执行结果如下:
图.4 数据表多字段连接查询
创建可以访问”RultrDB”数据库的用户
使用”root”用户执行DML语句来操作数据库并不是一个好的方案,多数情况下会创建不同的MariaDB用户账户来操作不同的数据库,用不同的权限来控制用户的执行内容,这样可以有效提高数据的安全性。
现在假设我们要为”RultrDB”数据库创建一个用户”rultr”,并赋予这个用户对于数据库”RultrDB”的全部操作权限。
MariaDB [RultrDB]> CREATE USER rultr@1ocalhost IDENTIFIED BY 'rultr'; Query OK, 0 rows affected (0.00 sec) MariaDB [RultrDB]> GRANT ALL PRIVILEGES ON RultrDB.* TO rultr@localhost; ERROR 1133 (28000): Can't find any matching row in the user table MariaDB [RultrDB]> SET SESSION sql_mode='STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION'; Query OK, 0 rows affected (0.00 sec) MariaDB [RultrDB]> GRANT ALL PRIVILEGES ON RultrDB.* TO rultr@localhost; Query OK, 0 rows affected (0.00 sec) MariaDB [RultrDB]> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec)
以上的示例中,在向用户授权时会报错”找不到指定用户”,这是由于MariaDB的配置文件中”sql_mode”设置使用严格模式,未经验证的数据向权限表插入数据时会报错。解决办法可以采用示例中的方式临时将本次会话的模式修改为宽松模式,也可以使用如下语句进行用户授权:
CREATE USER rultr@1ocalhost IDENTIFIED BY 'rultr'; GRANT ALL PRIVILEGES ON RultrDB.* TO rultr@localhost IDENTIFIED BY 'rultr'; FLUSH PRIVILEGES;
MySQL的更多提示
MariaDB清屏命令:
MariaDB [RultrDB]> \! clear
查看数据表的设置:
MariaDB [RultrDB]> SHOW COLUMNS IN [TABLE NAME]; MariaDB [RultrDB]> SHOW COLUMNS IN tbl_Books; //示例 OR MariaDB [RultrDB]> DESC [TABLE NAME] MariaDB [RultrDB]> DESC tbl_Books; //示例
执行结果如下图所示:
图.5 显示数据表字段信息
调整数据表:
如果我们想修改表 tbl_Books中”BookIsAvailable”字段属性,将其设置为NOT NULL,则可以使用ALTER语句完成,示例如下:
MariaDB [RultrDB]> ALTER TABLE tbl_Books MODIFY BookIsAvailable BOOLEAN NOT NULL; Query OK, 7 rows affected (5.07 sec) Records: 7 Duplicates: 0 Warnings: 0 MariaDB [RultrDB]> DESC tbl_Books; +-----------------+--------------+------+-----+-------------------+-----------------------------+ | Field | Type | Null | Key | Default | Extra | +-----------------+--------------+------+-----+-------------------+-----------------------------+ | BookID | int(11) | NO | PRI | NULL | auto_increment | | BookName | varchar(100) | NO | | NULL | | | AuthorID | int(11) | NO | MUL | NULL | | | BookPrice | decimal(6,2) | NO | | NULL | | | BookLastUpdated | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | | BookIsAvailable | tinyint(1) | NO | | NULL | | +-----------------+--------------+------+-----+-------------------+-----------------------------+ 6 rows in set (0.00 sec)
可以看到,调整后的表设置中,”BookIsAvailable”字段将不再允许空值,其内容也由”YES”变为”NO”。
最后一个,查看服务器中所有的数据库:
语句比较简单,但是用处非常大,可以对数据库有一个全面的了解:
MariaDB [RultrDB]> SHOW DATABASES; OR MariaDB [RultrDB]> SHOW SCHEMAS;
需要注意的是,不同的用户使用该命令时,会依据其自身的权限显示对应的结果。例如之前的”rultr”用户执行这条语句时,其结果如下图所示:
图.6 显示用户所有数据库
以上就是使用DML语句对MySQL/MariaDB数据库进行的基本操作,包括创建数据库、数据表、用户以及对用户授权等。希望以上的教程可以让大家对于MySQL/MariaDB数据库有一个大致的了解,为更深入的使用MySQL/MariaDB数据库打下基础。