MySQL的初学者指南(附实例)

66 阅读15分钟

下面的文章摘自《PHP和MySQL。新手到忍者,第7版》,这是一本学习使用PHP和MySQL构建专业Web应用程序所需的所有工具、原理和技术的实践指南。在本教程中,你将学习什么是数据库,以及如何使用结构化查询语言(SQL)来处理自己的数据库。


正如我在上一章所解释的,PHP是一种服务器端的脚本语言,它可以让你在你的网页中插入指令,你的Web服务器软件在将这些网页发送给请求它们的浏览器之前会执行这些指令。我们已经看了一些基本的例子,包括生成随机数和使用表单来获取用户的输入。

现在,这一切都很好,但当数据库被添加到这个组合中时,它就真的变得有趣了。在本章中,我们将学习什么是数据库,以及如何使用结构化查询语言(SQL)来处理你自己的数据库。

数据库简介

数据库服务器是一个可以将大量的信息以一种有组织的格式存储起来的程序,通过像PHP这样的编程语言可以很容易地访问。例如,你可以告诉PHP在数据库中寻找一个你想在网站上出现的笑话列表。

在这个例子中,这些笑话将完全存储在数据库中。这种方法的优点是双重的。首先,你可以编写一个PHP脚本,从数据库中获取任何笑话,并通过生成HTML页面来显示它,而不是为每个笑话编写HTML页面。第二,在你的网站上添加一个笑话将是一个简单的问题,即把笑话插入数据库中。PHP代码将处理其余的事情,当它从数据库中获取列表时,自动显示新的笑话和其他的笑话。

让我们来看看这个例子,看看数据是如何存储在数据库中的。一个数据库是由一个或多个组成的,每个表都包含一个项目 或事物的列表。对于我们的笑话数据库,我们可能会从一个名为joke 的表开始,该表将包含一个笑话的列表。数据库中的每个表都有一个或多个,或字段。每一列都有关于表中每个项目的特定信息。在我们的例子中,我们的joke 表可能有一列是笑话的文本,另一列是笑话被添加到数据库的日期。以这种方式存储的每个笑话都可以说是表中的一个条目。这些行和列形成一个表格,如下图所示。

A typical database table containing a list of jokes

如果你曾经创建过电子表格,这对你来说会很熟悉。数据库表也是类似的,数据被存储在行和列中。唯一不同的是,与Excel不同的是--在Excel中列被命名为A,B,C, 等等--当你创建一个数据库表时,你为每一列选择一个名字。

请注意,除了笑话文本(joketext )和笑话日期(jokedate )的列之外,还有一列名为id 。作为一个好的设计,数据库表应该总是提供一种方法,使每一行都能被唯一地识别。由于有可能在同一日期输入两个相同的笑话,我们不能依靠joketextjokedate 列来区分所有的笑话。因此,id 列的功能是为每个笑话分配一个独特的数字,这样我们就有一个简单的方法来参考它们,并跟踪哪个笑话是哪个。我们将在第五章中仔细研究像这样的数据库设计问题。

注意:也可以使用列的组合作为唯一的标识符--比如制造商名称和产品名称一起。一个制造商很可能有不止一个产品,而两个制造商可能有相同名称的产品。通过结合这两个名称,就有可能唯一地识别每个产品。

回顾一下,上图中的表是一个有两行(或条目)的三栏表。表格中的每一行包含三个字段,表格中的每一列都有一个字段:笑话的ID,它的文本,以及笑话的日期。有了这些基本的术语,你就可以自己着手创建一个数据库了。

MySQL

本书的标题是《PHP和MySQL。新手到忍者--其中MySQL指的是我们正在使用的数据库。然而,如果你仔细阅读你作为设置Docker环境的一部分而下载的docker-compose.yml 文件,你会注意到它实际上安装了一个叫做MariaDB的数据库。

2009年,MySQL被一家大型软件公司Oracle收购。由于不确定MySQL的未来,Michael Widenius--最初MySQL数据库的创始人之一--决定将MySQL分叉,创建一个新的数据库,名为MariaDB。(分叉意味着从一个现有的项目创建一个新的项目,使用原始项目的源代码作为基础)。除了不受甲骨文的控制外,MariaDB比MySQL有一些性能上的优势,这使它成为一个很好的选择。

MariaDB是MySQL的替代品,任何教你如何使用MySQL的教程在MariaDB上都是完全一样的效果。作为一个PHP开发者,你不会注意到这两者之间有什么不同,而且有可能把一个换成另一个。

注意:随着时间的推移,MySQL和MariaDB的差异略有增加,但你将使用的基本命令、工具和技术都是一样的。当涉及到两个数据库所支持的一些更高级的功能时,有一些小的差异。

尽管这发生在10多年前,但大多数开发者和软件包管理系统都在交替使用这两个数据库。例如,在Arch Linux上,如果你安装mysql 包,它实际上是安装MariaDB,而我在第一章讨论的XAMPP包是安装MariaDB而不是MySQL。

尽管如此,如果你开始使用MariaDB开发PHP代码,你会看到不断地提到MySQL而不是MariaDB。这是因为客户端软件(任何连接到服务器与数据库交互的东西)不知道它是连接到MySQL还是MariaDB。对于这个客户端软件,MySQL是一个协议。就像你可以通过电脑上的USB端口插入键盘或鼠标一样,你可以通过MySQL协议连接到MySQL服务器或MariaDB服务器。

因此,当你听到开发人员谈论 "向MySQL数据库添加记录 "时,他们通常指的是使用MySQL协议来管理数据库,而不考虑正在使用的具体实现。

你会发现开发者经常使用 "MySQL "这个术语,即使他们实际上使用的是MariaDB。为了保持一致性,我在本书中也将这样做。在讨论从PHP连接时,我不会把服务器称为MariaDB而使用MySQL这个术语,而是自始至终使用MySQL。

使用MySQL Workbench运行SQL查询

就像Web服务器被设计为响应来自客户端(Web浏览器)的请求一样,数据库服务器也响应来自客户端程序的请求。在本书后面,我们将以PHP脚本的形式编写我们自己的MySQL客户端程序,但现在我们可以使用一个由编写MySQL的人编写的客户端程序。MySQL Workbench。你可以从mysql.com/products/wo…免费下载MySQL Workbench。

有许多不同的MySQL客户端可供使用,本书的早期版本使用了phpMyAdmin,这是一个基于网络的MySQL客户端,具有许多相同的功能。然而,它不像MySQL Workbench那样容易使用,而且往往会很慢。

一旦你下载并安装了MySQL Workbench,打开它,你应该看到一个像下面所示的屏幕。

If you can see this, you have MySQL Workbench running

在你向你的数据库添加任何数据之前,你需要连接到它。一个MariaDB服务器正在你在第一章中下载的Docker环境中运行,你可以使用MySQL客户端(如MySQL Workbench)连接到它。

连接到数据库需要三条信息。

  • 一个服务器地址
  • 一个用户名
  • 密码

对于我们使用的Docker环境来说,这些信息是。

  • 服务器v.je
  • 用户名v.je
  • 密码v.je

你会注意到,服务器名称与你在Web浏览器中连接到的查看PHP脚本的URL是一样的。Docker环境同时运行Web服务器和数据库服务器,所以你只需要记住一个地址。

要在MySQL Workbench中连接数据库,请按窗口中央的 "MySQL连接 "标签旁边的**+**按钮。(诚然,它的标签不是很清楚,其目的也不是很清楚,但不要紧!)。

Add a connection

当你按下**+**按钮时,你会看到一个新的窗口。

Add a connection

输入服务器地址和用户名。你还需要给你的连接起个名字。我把它叫做v.je ,但你可以叫它任何你喜欢的名字。这只是它在MySQL Workbench中列出的一个名称,供将来参考。

一旦你输入了用户名和服务器,你就可以按窗口底部的测试连接按钮来尝试连接到数据库。

你应该得到一个密码提示框。

Password prompt

如果你没有,请按照以下步骤操作。

  1. 仔细检查你的环境是否在运行。(如果你在设置后重新启动了你的电脑,你可能需要在项目的文件夹中再次运行docker-compose up ,使其运行!)
  2. 确保用户名、密码和服务器地址是正确的。

提示:你也许可以在这里使用docker-compose start 命令。start 将启动任何现有的容器,而up 将创建它们,如果它们不存在,然后启动它们。根据你在本书各章之间在你的电脑上所做的事情,如果需要的话,Docker创建的容器(以及其他东西,如网络连接)将被重新创建。如果你在不同的电脑之间移动,进行了系统恢复或某些软件更新,有可能需要重新创建容器。

因此,无论你的系统如何变化,up ,而start ,可能工作,也可能不工作,这取决于你上次运行它后发生了什么。

注意:用户名和密码是区分大小写的,所以请确保你用小写输入它们

在方框中输入密码v.je ,并在 "保存密码 "的方框中打勾。勾选该方框,你就不必在每次连接时都输入密码。然后按确定

如果密码输入正确,你会看到一条信息,告诉你连接成功了。在 "设置新连接 "窗口中按**"确定**",你会看到在MySQL主窗口中出现一个框,里面有你输入的一些信息。

The main MySQL window showing information that was entered

现在连接已经设置好了,每次你打开MySQL工作台时它都会在那里。你将不需要每次都添加连接。

你终于准备好实际连接到数据库了。要做到这一点,只需双击新创建的代表你的连接的框,你会看到一个不同的屏幕。

Initial screen

这看起来有点令人生畏,因为有很多不同的按钮和面板都代表不同的东西。左边是一个有很多不同选项的菜单。你唯一需要担心的是底部名为 "SCHEMAS "的部分。

Schema只是 "数据库 "的一个花哨的词。MySQL是一个数据库服务器。在实践中,这意味着它可以托管许多不同的数据库,类似于一个网络服务器可以托管许多不同的网站一样。

创建一个数据库

在你可以向数据库添加任何信息之前,你需要创建一个数据库。要创建一个数据库,在SCHEMAS面板上点击右键,选择创建模式。这将给你一个有几个选项的窗口,但你只需要输入一个:模式名称。

Creating a schema

我选择将数据库命名为ijdb ,即Internet Joke Database(向Internet Movie Database致敬),因为这符合我在本章开头所举的例子:一个显示笑话数据库的网站。不过,你可以随意给数据库起任何名字。(在你阅读本书的过程中,你将需要经常输入它,所以不要选择太复杂的东西!)。

一旦你输入了一个名字,你就可以安全地将其他选项保留为默认值,然后按**"应用"。当你这样做时,MySQL Workbench会要求你确认你的操作。(习惯于这些对话框。MySQL Workbench几乎对你所做的一切都坚持确认!)。在下面显示的屏幕上再按一次Apply**。

Confirming the schema creation

一旦你按了Apply,你就需要在下一个屏幕上按Finish。这是MySQL Workbench令人讨厌的地方之一:它强迫你确认,然后完成每个动作。然而,这比其他方法要好,我们很快就会看到

在上面的截图中,你会看到一个白色面板,上面写着CREATE SCHEMA `ijdb` 。这是一个SQL查询,在本书中你会看到很多这样的查询。你可以自己打出这个命令并运行它,避免使用图形用户界面,并节省你通过MySQL Workbench的确认对话框。而对于像CREATE SCHEMA `ijdb` 这样简单的命令,GUI可能是多余的。然而,正如你很快就会看到的,并不是所有的命令都这么简单,对于一些更复杂的查询,使用MySQL Workbench的GUI会容易得多。

如果你想能够删除数据库(考虑到我将在本书中鼓励你做大量的实验,这可能是一种很好的能力),MySQL Workbench使之变得简单。在主窗口的SCHEMAS面板上,右击你想删除的模式,选择DROP Schema。MySQL使用DROP 这个词来删除东西。(有点不一致的是,Delete也被用于某些事情!)

结构化查询语言

就像我们刚才看到的CREATE SCHEMA 命令一样,我们在本书其余部分用来指导MySQL的命令是一种叫做结构化查询语言,或SQL(发音为 "sequel "或 "ess-cue-ell",所以你可以选择)的标准的一部分。SQL中的命令也被称为查询,我将交替使用这两个术语。

SQL是与大多数数据库交互的标准语言,所以即使你将来从MySQL转移到像Microsoft SQL Server这样的数据库,你也会发现大多数命令是相同的。重要的是,你要了解SQL和MySQL之间的区别。MySQL是你正在使用的数据库服务器软件--而你正在使用的MariaDB也遵循同样的标准。SQL是你用来与该数据库互动的语言。

大多数这些命令可以由MySQL工作台生成,这就是我们要用来创建我们的数据库结构的东西。然而,你需要学习一些命令,因为你将从你的PHP脚本而不是MySQL Workbench中执行这些命令!

提示:在本书中,我将教你每个PHP开发者都需要知道的SQL的要点。如果你决定以建立数据库驱动的网站为职业,那么了解一些更高级的SQL细节是值得的,特别是当它涉及到使你的网站尽可能快速和顺利地运行时。要深入了解SQL,我强烈推荐Rudy Limeback的《Simply SQL》,或Timothy Boronczyk的《Jump Start MySQL》。

注意:大多数MySQL命令不区分大小写,这意味着你可以输入CREATE DATABASEcreate database ,甚至CrEaTe DaTaBaSe ,它将知道你的意思。然而,当MySQL服务器运行在具有区分大小写文件系统的操作系统上时(如Linux、macOS,或在Docker内运行时),数据库名称和表名称是区分大小写的。

此外,表、列和其他名称在同一查询中使用多次时,其拼写必须完全相同。

为了保持一致性,本书将尊重公认的惯例,即用大写字母输入数据库命令,而用小写字母输入数据库实体(数据库、表、列等等)。

这也使得人们(比如你!)更容易阅读查询。MySQL并不关心,但你将能够快速而容易地识别一个命令,因为它是大写的,而对一个表、列或数据库的引用是小写的。

一旦你的数据库被创建,它将出现在左侧的SCHEMAS列表中。

The Internet Joke Database schema

现在你有一个数据库,你需要告诉MySQL Workbench你想使用它。要做到这一点,只需双击新创建的模式,其名称将变成粗体。你一次只能选择一个模式,你需要告诉MySQL Workbench你想使用哪个模式。

The ijdb schema selected

现在你已经准备好使用你的数据库了。由于在你向数据库添加表之前,数据库是空的,所以我们的第一件事是创建一个表,用来存放你的笑话。(现在可能是想一些笑话的好时机!)。

继续阅读《介绍MySQL。初学者指南"在SitePoint上。