在这篇文章中,我们将展示如何创建一个数据库(也称为模式),表(数据类型),并解释如何与一个MySQL / MariaDB的服务器上的数据进行数据操纵语言 (DML)操作。
假定您以前1)安装在你的Linux系统上所需的软件包,以及2)执行mysql_secure_installation提高数据库服务器的安全性。 如果没有,请按照以下指南安装MySQL / MariaDB服务器。
为简便起见,我们将把MariaDB的专门整篇文章,但这里介绍的概念和命令适用于MySQL的为好。
创建数据库,表和授权用户
正如你所知,数据库可以简单地定义为有组织的信息集合。 具体地讲,MariaDB的是关系数据库管理系统(RDBMS),并使用结构化查询语言来执行数据库操作。 另外,请记住MariaDB使用术语数据库和模式可互换。
以存储在数据库中的持久性信息,我们将使用存储数据的行的表 。 通常,两个或多个表将以某种方式彼此相关。 这是表征关系数据库的使用的组织的一部分。
创建新数据库
要创建一个名为新的数据库BooksDB
,用下面的命令进入MariaDB的提示符(你会被提示输入根MariaDB的用户的密码):
[root@youcl ~]# mysql -u root -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 2 Server version: 10.1.14-MariaDB MariaDB Server Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> CREATE DATABASE BookstoreDB; Query OK, 1 row affected (0.00 sec) MariaDB [(none)]>
一旦创建了数据库,我们需要在其上创建至少两个表。 但首先让我们探讨数据类型的概念。
MariaDB数据类型简介
正如我们前面所解释的, 表是数据库中的对象,我们将保持持续的信息。 每个表由一个给定的数据类型(信息类型)该字段可以存储两个或多个字段(也称为列 )。
在MariaDB的最常见的数据类型有以下几种(你可以咨询在完整列表官方MariaDB的在线文档 ):
数字:
- 布尔认为0为假和任何其他价值为真。
- TINYINT,如果有符号使用,涵盖了从-128到127的范围内,而无符号的范围是0到255。
- SMALLINT,如果有符号使用,涵盖了从-32768范围到32767无符号的范围是0到65535。
- INT,如果有符号使用,覆盖范围从0到4294967295,并-2147483648到2147483647,否则。
注 :在TINYINT,SMALLINT,和INT,假设签署了默认。
双(M,D),其中,M是数字的总数和D是小数点后的位数,代表一个双精度浮点数。 如果指定UNSIGNED,则不允许使用负值。
串:
- VARCHAR(M)表示可变长度的串,其中M是在字节允许的最大列长度(65,535理论上)。 在大多数情况下,字节数与字符数相同,除了一些字符可以占用多达3个字节。 例如,西班牙字母ñ表示一个字符,但占用2个字节。
- TEXT(M)表示具有65,535个字符,最大长度为列。 然而,因为它与VARCHAR(M)的情况时,实际的最大长度,如果存储多字节字符减小。 如果指定M,则列作为能够存储这样的字符数最小类型创建。
- MEDIUMTEXT(M)和LONGTEXT(M)是类似的文本(M),仅允许的最大长度分别为16,777,215和4,294,967,295字符。
日期和时间:
- Date表示YYYY-MM-DD格式的日期。
- TIME代表HH时间:MM:SS.SSS格式(小时,分,秒和毫秒)。
- DATETIME是YYYY-MM-DD HH 日期和时间组合:MM:SS格式。
- 时间戳被用于定义被添加或更新的行的时刻。
在检查了这些数据类型之后,您将能够更好地确定需要将哪些数据类型分配给表中的给定列。
例如,一个人的名字,可以轻松适应一个VARCHAR(50),而博客文章将需要一个文本类型(选择中号根据您的具体需求)。
使用主键和外键创建表
在我们深入创建表,大约有,我们需要检讨的关系型数据库两个基本概念: 主键和外键。
主键包含一个唯一标识每一行,或记录,在表中的值。 另一方面, 外键是用来在两个表来创建数据之间的链接,并且控制可以存储在将外键所在的表中的数据。 主键和外键通常是INT。
为了说明这一点,让我们使用BookstoreDB
并创建一个名为两个表AuthorsTBL
和BooksTBL
如下。 NOT NULL约束表明相关领域需要非NULL值。
此外,AUTO_INCREMENT时使用一个新的记录被插入到表由一个增加的INT主键列的值。
MariaDB [(none)]> USE BookstoreDB; MariaDB [(none)]> CREATE TABLE AuthorsTBL ( AuthorID INT NOT NULL AUTO_INCREMENT, AuthorName VARCHAR(100), PRIMARY KEY(AuthorID) ); MariaDB [(none)]> CREATE TABLE BooksTBL ( 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 AuthorsTBL(AuthorID) );
MariaDB [(none)]> USE BookstoreDB; Database changed MariaDB [BookstoreDB]> CREATE TABLE AuthorsTBL ( -> AuthorID INT NOT NULL AUTO_INCREMENT, -> AuthorName VARCHAR(100), -> PRIMARY KEY(AuthorID) -> ); Query OK, 0 rows affected (0.05 sec) MariaDB [BookstoreDB]> CREATE TABLE BooksTBL ( -> 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 AuthorsTBL(AuthorID) -> ); Query OK, 0 rows affected (0.05 sec) MariaDB [BookstoreDB]>
现在我们可以继续前进,开始插入记录AuthorsTBL
和BooksTBL
。
选择,插入,更新和删除行
首先,我们将填充AuthorsTBL
表。 为什么? 因为我们需要有价值观AuthorID
插入记录BooksTBL之前。
从MariaDB提示符执行以下查询:
MariaDB [BookstoreDB]> INSERT INTO AuthorsTBL (AuthorName) VALUES ('Agatha Christie'), ('Stephen King'), ('Paulo Coelho');
在这之后,我们将会选择从AuthorsTBL的所有记录。 请记住,我们将需要的AuthorID每个记录创造BooksTBL 插入查询。
如果你想在一次检索一条记录,您可以使用WHERE子句来表示一个条件,一个行必须符合退换。 例如,
MariaDB [BookstoreDB]> SELECT * FROM AuthorsTBL WHERE AuthorName='Agatha Christie';
或者,您可以同时选择所有记录:
MariaDB [BookstoreDB]> SELECT * FROM AuthorsTBL;
MariaDB [BookstoreDB]> SELECT * FROM AuthorsTBL WHERE AuthorName='Agatha Christie'; +----------+-----------------+ | AuthorID | AuthorName | +----------+-----------------+ | 1 | Agatha Christie | +----------+-----------------+ 1 row in set (0.00 sec) MariaDB [BookstoreDB]> SELECT * FROM AuthorsTBL; +----------+-----------------+ | AuthorID | AuthorName | +----------+-----------------+ | 1 | Agatha Christie | | 2 | Stephen King | | 3 | Paulo Coelho | +----------+-----------------+ 3 rows in set (0.00 sec) MariaDB [BookstoreDB]>
在MySQL数据库中选择并查询字符串
现在,让我们创造BooksTBL 插入查询,使用相应的AuthorID匹配每本书的作者。 在BookIsAvailable值为1表示这本书的股票,否则为0:
MariaDB [BookstoreDB]> INSERT INTO BooksTBL (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);
MariaDB [BookstoreDB]> INSERT INTO BooksTBL (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.03 sec) Records: 7 Duplicates: 0 Warnings: 0
在这一点上,我们会做一个SELECT看到BooksTBL的记录。 那么让我们更新的“炼金术士 ”由保罗科埃略的价格,再次选择特定的记录。
注意BookLastUpdated场现在怎么显示不同的值。 正如我们前面所解释的,一个时间戳字段显示记录插入或最后修改时的数值。
MariaDB [BookstoreDB]> SELECT * FROM BooksTBL; MariaDB [BookstoreDB]> UPDATE BooksTBL SET BookPrice=22.75 WHERE BookID=6; MariaDB [BookstoreDB]> SELECT * FROM BooksTBL WHERE BookID=6;
MariaDB [BookstoreDB]> SELECT * FROM BooksTBL; +--------+-----------------------------------------+----------+-----------+---------------------+-----------------+ | BookID | BookName | AuthorID | BookPrice | BookLastUpdated | BookIsAvailable | +--------+-----------------------------------------+----------+-----------+---------------------+-----------------+ | 1 | And Then There Were None | 1 | 14.95 | 2016-10-01 23:31:41 | 1 | | 2 | The Man in the Brown Suit | 1 | 23.99 | 2016-10-01 23:31:41 | 1 | | 3 | The Stand | 2 | 35.99 | 2016-10-01 23:31:41 | 1 | | 4 | Pet Sematary | 2 | 17.95 | 2016-10-01 23:31:41 | 0 | | 5 | The Green Mile | 2 | 29.99 | 2016-10-01 23:31:41 | 1 | | 6 | The Alchemist | 3 | 25.00 | 2016-10-01 23:31:41 | 1 | | 7 | By the River Piedra I Sat Down and Wept | 3 | 18.95 | 2016-10-01 23:31:41 | 0 | +--------+-----------------------------------------+----------+-----------+---------------------+-----------------+ 7 rows in set (0.00 sec) MariaDB [BookstoreDB]> UPDATE BooksTBL SET BookPrice=22.75 WHERE BookID=6; Query OK, 1 row affected (0.04 sec) Rows matched: 1 Changed: 1 Warnings: 0 MariaDB [BookstoreDB]> SELECT * FROM BooksTBL WHERE BookID=6; +--------+---------------+----------+-----------+---------------------+-----------------+ | BookID | BookName | AuthorID | BookPrice | BookLastUpdated | BookIsAvailable | +--------+---------------+----------+-----------+---------------------+-----------------+ | 6 | The Alchemist | 3 | 22.75 | 2016-10-01 23:35:00 | 1 | +--------+---------------+----------+-----------+---------------------+-----------------+ 1 row in set (0.00 sec) MariaDB [BookstoreDB]>
插入和更新数据库表记录
虽然我们不会在这里做,你也可以删除一个记录,如果不再使用了。 例如,假设我们要删除BooksTBL“炼金术士 ”。
要做到这一点,我们会按如下方式使用DELETE语句:
MariaDB [BookstoreDB]> DELETE FROM BooksTBL WHERE BookID=6;
作为更新的情况下,这是一个好主意,以查看可能潜在的DELETE受到影响的结果首先做一个SELECT。
另外,不要忘记添加WHERE子句和条件(的BookID = 6)来选择特定的记录被删除。 否则,您可能会删除表中的所有行!
如果你希望连接两个(或更多)的字段,可以使用CONCAT声明。 举例来说,假设我们要返回的结果集的形式组成的书名和作者一个字段的“炼金术士(保罗·科埃略)”,并与价格的另一列。
这将需要对两个表( 的AuthorID)共享的公共领域AuthorsTBL和BooksTBL之间的连接 :
MariaDB [BookstoreDB]> SELECT CONCAT(BooksTBL.BookName, ' (', AuthorsTBL.AuthorName, ')') AS Description, BooksTBL.BookPrice FROM AuthorsTBL JOIN BooksTBL ON AuthorsTBL.AuthorID = BooksTBL.AuthorID;
正如我们所看到的,CONCAT使我们能够参加由逗号分隔的多个字符串表达式。 您还会注意到,我们选择了别名说明来表示结果集并置。
上面的查询的输出如下图所示:
MariaDB [BookstoreDB]> SELECT CONCAT(BooksTBL.BookName, ' (', AuthorsTBL.AuthorName, ')') AS Description, BooksTBL.BookPrice FROM AuthorsTBL JOIN BooksTBL ON AuthorsTBL.AuthorID = BooksTBL.AuthorID; +--------------------------------------------------------+-----------+ | Description | BookPrice | +--------------------------------------------------------+-----------+ | And Then There Were None (Agatha Christie) | 14.95 | | The Man in the Brown Suit (Agatha Christie) | 23.99 | | The Stand (Stephen King) | 35.99 | | Pet Sematary (Stephen King) | 17.95 | | The Green Mile (Stephen King) | 29.99 | | The Alchemist (Paulo Coelho) | 25.00 | | By the River Piedra I Sat Down and Wept (Paulo Coelho) | 18.95 | +--------------------------------------------------------+-----------+ 7 rows in set (0.00 sec)
在数据库表中查询多个字段
创建用户以访问BookstoreDB数据库
利用根在数据库中执行所有DML操作是一个坏主意。 为了避免这种情况,我们可以创建一个新的MariaDB的用户帐户(我们将其命名为bookstoreuser),并设置BookstoreDB所有必要的权限:
MariaDB [BookstoreDB]> CREATE USER bookstoreuser@localhost IDENTIFIED BY 'YourPasswordHere'; MariaDB [BookstoreDB]> GRANT ALL PRIVILEGES ON BookstoreDB.* to bookstoreuser@localhost; MariaDB [BookstoreDB]> FLUSH PRIVILEGES;
MariaDB [BookstoreDB]> CREATE USER bookstoreuser@localhost IDENTIFIED BY 'youcl'; Query OK, 0 rows affected (0.00 sec) MariaDB [BookstoreDB]> GRANT ALL PRIVILEGES ON BookstoreDB.* to bookstoreuser@localhost; Query OK, 0 rows affected (0.00 sec) MariaDB [BookstoreDB]> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec)
为每个数据库设置一个专用的,单独的用户将防止损坏整个数据库,如果单个帐户受损。
额外的MySQL提示
要清理MariaDB的提示符下,键入以下命令,然后按Enter键 :
MariaDB [BookstoreDB]> \! clear
要检查给定表的配置,请执行:
MariaDB [BookstoreDB]> SELECT COLUMNS IN [TABLE NAME HERE ];
例如,
MariaDB [BookstoreDB]> SHOW COLUMNS IN BooksTBL;
MariaDB [BookstoreDB]> SHOW COLUMNS IN BooksTBL; +-----------------+--------------+------+-----+-------------------+-----------------------------+ | 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) | YES | | NULL | | +-----------------+--------------+------+-----+-------------------+-----------------------------+ 6 rows in set (0.02 sec)
列出数据库表中的列
快速检查显示,BookIsAvailable领域承认NULL值。 因为我们不希望允许,我们会修改表如下:
MariaDB [BookstoreDB]> ALTER TABLE BooksTBL MODIFY BookIsAvailable BOOLEAN NOT NULL;
(随时再次显示列-上面的图片中突出显示的是 ,现在应该是一个NO)。
最后,要查看服务器上的所有数据库,请执行:
MariaDB [BookstoreDB]> SHOW DATABASES; OR MariaDB [BookstoreDB]> SHOW SCHEMAS;
[root@youcl ~]# mysql -u bookstoreuser -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 3 Server version: 10.1.14-MariaDB MariaDB Server Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [BookstoreDB]> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | BookstoreDB | | information_schema | +--------------------+ 2 rows in set (0.00 sec) MariaDB [BookstoreDB]> SHOW SCHEMAS; +--------------------+ | Database | +--------------------+ | BookstoreDB | | information_schema | +--------------------+ 2 rows in set (0.00 sec)
下图显示了访问MariaDB的提示为bookstoreuser后,上述命令的结果(注意如何帐户无法“看到”比BookstoreDB和INFORMATION_SCHEMA(适用于所有用户)之外的任何数据库:
列出所有MySQL数据库
概要
在这篇文章中,我们介绍了如何运行DML操作以及如何创建一个数据库,表和MariaDB的数据库专用用户。 此外,我们共享了一些提示,可能使您的生活作为一个系统/数据库管理员更容易。
如果您对本文有任何疑问,请随时与我们联系! 请随时使用以下评论表格与我们联系。