用PHP和MySQL构建一个数据库驱动的网站(二)
处处
第二章: MySQL入门
欢迎回到这个教程!在上一章,我们学习了安装和配置PHP和MySQL这两个软件。在这一章,我们将集中学习如果使用结构化查询语言(SQL)在MySQL数据库中工作。
数据库入门
正如我在上一章简要说明的那样,PHP是一个服务器端的脚本语言,通过这个语言你可以在你的Web页面中添加指令,这样你的Web服务软件(可能是Apache,Personal Web Server或其他任何软件)会在向发出请求的浏览器发送这些页面前首先执行它。在那个简单的例子中,我展示了如何每次在接受请求的Web页面中插入当前的日期。
现在一切都很清楚了,但是如果在其中添加一个数据库会真正引起我们的兴趣。一个数据库服务器(我们这里是MySQL)是一个使用一定格式存储大量信息的程序,通过这个程序你可以很简单地使用象PHP这样的脚本语言来访问数据。例如,你可以使用PHP在数据库中获得一个笑话的列表并将其显示到你的Web站点。
在这个例子中,笑话被完全存储在数据库中。这样做有两个好处。首先,你不再需要为你的每个笑话写一个HTML文件,你只需要写一个PHP文件来从数据库中引出任何的笑话并显示它;其次,要添加笑话到你的Web站点中,也仅仅是添加笑话到数据库中。PHP代码在新笑话包含在列表中时可以自动显示新的笑话。
现在让我们通过这个例子来看看数据是如何在数据库中存储的。一个数据库包含一个或几个数据表(table),每一个数据表包含了一个事物的列表。对于我们的笑话数据库来说,我们一开始可能需要一个名为“jokes”的数据表,这个数据表包含了一个笑话列表。数据库中每个数据表包含一个或几个数据列(column)或数据域(field)。回到我们的例子中来,我们的“jokes”数据表可能有这样的两列:笑话的正文以及笑话添加到数据库中的日期。每个存储在数据表中的笑话我们称之为一行。要了解这儿提到的所有术语,你可以看下面这张图:
请注意,在笑话正文(“JokeText”)和添加日期(“JokeDate”)这两个数据列之外,我还增加了一个叫做“ID”的数据列。这个数据列的作用是给每个笑话分配一个唯一的号码,这样我们可以很容易地查阅并区分这些笑话。
现在再复习一下,上面的数据表中有三个数据列、两行。每一行包含了一个笑话的ID、它的正文以及它的添加日期。掌握了这些基本术语后,我们将开始使用MySQL。
登录MySQL
操作MySQL数据库的标准界面是连接到MySQL服务软件(在第一章内安装)并同时输入命令。要连接上服务器,我们需要使用MySQL客户端程序。如果你自己安装了MySQL服务软件,不管你是在Windows下安装的,还是在一些Unix的版本下安装的,你应该已经在安装服务程序的同一地点安装了这个客户端程序。在Linux,这个程序被称之为mysql,其位置默认是/usr/local/mysql/bin 目录。在Windows下,这个程序被称之为mysql.exe,其位置默认是C:mysqlin目录。
如果你不是自己安装的MySQL服务器(例如,你是在你的Web主机提供商的MySQL服务器上工作),那么有两个方法连接到MySQL服务器,第一个方法是使用telnet登录到你的Web主机的服务器上,然后在那儿运行mysql。第二种方法是从http://www.mysql.com/(for Windows和for Linux的都可以免费获得) 下载并安装MySQL客户端程序。这两种方法都可以很好地工作,你的Web主机可能支持其中的一种,或者两种都支持(你需要去问清楚)。
不管你选择了哪种方法,不管你使用的是哪种系统,你最终都应该在一个命令行执行MySQL客户端程序去连接你的MySQL服务器,你需要输入下面的命令:
mysql -h <hostname> -u <username> -p
你需要将<hostname>换成你的MySQL服务器正在其上运行的计算机的主机名或IP地址。如果你在运行服务的同一台计算机上运行客户端程序,你可以不使用-h <hostname> 而且直接使用-h localhost。<username>应该是你的MySQL用户名。如果你是自己安装的MySQL服务器,这应该就是root。如果你是使用的你的Web主机提供商的MySQL服务,这应该是他们为你指定的MySQL用户。
“-p”参数告诉程序提示你输入你的口令,这将在你输入上面的命令后立即显示。如果你是自己安装的MySQL,你的口令就是你在第一章内选择的root的口令。如果你是使用的你的Web主机提供商的MySQL服务,这应该是他们给你的MySQL口令。
如果你一切都输入好了,MySQL客户端程序会连接上MySQL服务器并返回给你一个MySQL的命令行:
mysql>
现在,MySQL服务器实际上是连接了好几个数据库(这使得一个Web主机可以为几个用户设置同一个MySQL服务器)。所以你的下一步应该是选择一个工作的数据库。首先,获得当前服务器上的数据库列表。输入下面的命令(不要忘了分号!),然后打回车。
mysql> SHOW DATABASES;
MySQL会显示给你服务器上的数据库列表。如果这是一个新安装的服务器(也就是说,这是你在第一章里自己安装的)。这个列表将会是这样:
+----------+
| Database |
+----------+
| mysql |
| test |
+----------+
2 rows in set (0.11 sec)
MySQL服务器使用第一个被称之为mysql的数据库来管理用户及其口令和权限。现在我们暂时不会关心这个数据库,在以后的章节中,我们会讨论它。第二个叫test是一个数据模块。你可以删除这个数据库,在我们的教程中不会使用到它(我们会自己建立一些数据库)。删除什么东西在MySQL中被称之为“dropping”,要删除test数据库,其正确的命令应该是:
mysql> DROP DATABASE test;
如果你输入了这个命令,并打了回车,MySQL会删除这个数据库,并返回Query OK。注意,并不会提示你诸如“这是否确定”这样的信息。所以你在MySQL输入命令必须十分小心。就象我们在这儿看到的,你可以完全删除数据库--包含它其中的所有信息--仅仅只用一个命令!
在我们进入下一步之前,让我们先来看看MySQL命令行的连接。正如我们已经注意到的,在MySQL中的所有命令都必须以分号(;)结束。如果你忘记了这个分号,MySQL会认为你还没有结束输入你的命令,并会让你这下一行中继续录入:
mysql> SHOW
-> DATABASES;
MySQL在等待你输入命令中的剩余部分时,提示符会从mysql>改变为->。对于一个长命令,这是很有用的,你可以将你的命令分几行输入。
如果你中途发现你的命令出错了,你可以完全取消当前的命令(译者注:是指尚未执行的命令)并从头来过。要完成这个工作,你只需要输入c并按回车:
mysql> DROP DATABASEcmysql>
MySQL会完全忽略你刚才输入的命令,并返回到提示符等待你的下一个命令。
最后,当你要退出MySQL客户端程序时,你只需要输入quit或者exit (这两个命令是完全一样的)。这是唯一不用以分号结尾就可以执行的命令。
mysql> quitBye
什么是SQL?
在这篇教程中我们用来告诉MySQL去做什么的命令其实是一个叫结构化查询语言(SQL)的规范的一部分。SQL中的命令也被称之为查询(在这篇教程中,我们会交替地采用这两种称呼)。
SQL是实现与绝大多数的数据库的交互的标准语言,所以即使你将来不再使用MySQL,转而使用Microsoft SQL Server,你会发现绝大多数命令是相同的。你必须理解SQL和MySQL的区别。MySQL是你正在使用的数据库服务软件。SQL是你用来实现和数据库的交互的语言。
建立一个数据库
如果你的Web主机提供商已经为你分配了一个用来工作的数据库。你先耐心地等待一下,等一下我们会和你继续讨论下面的问题。如果你是在自己安装的MySQL服务器上工作。执行下面的命令,很容易地你就可以建立一个数据库了:
mysql> CREATE DATABASE jokes;
我的数据库的名字是jokes,这是为了与我们工作的例子一致。其实你可以给你的数据库起任何你自己喜欢的名字。不过,如果你是在Web主机提供商的MySQL服务器上工作,它们可能已经为你建立了一个数据库,你就没法选择数据库的名字了。
现在我们已经有了一个数据库,我们需要告诉MySQL我们想要使用这个数据库。下面这个命令应该也不太难记:
mysql> USE jokes;
现在你可以开始使用你的数据库了。在你在其中添加数据表之前,这个数据库将是空的,我们的第一步工作应该是建立一个数据表来保存我们的笑话。
建立一个数据表
我们之前遇到的SQL命令都是非常简单的,但是因为数据表是比较灵活的,相应地建立它们的命令就要复杂得多了。建立数据表的基本格式是这样的:
mysql> CREATE TABLE <table name> (
-> <column 1 name> <col. 1 type> <col. 1 details>,
-> <column 2 name> <col. 2 type> <col. 2 details>,
-> ...
-> );
现在回到我们的例子“Jokes”表。这个表有三个数据列:ID(一个数字)、JokeText(笑话的正文)和JokeDate(加入的日期)。建立这个表的命令应该是这样的:
mysql> CREATE TABLE Jokes (
-> ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> JokeText TEXT,
-> JokeDate DATE NOT NULL
-> );
看上去很复杂,是吧?让我们将它分解一下:
第一行是比较简单的;它说明我们想要建立一个新的名为Jokes的数据表。
第二行说明我们需要一个数据列叫ID,这个列的类型应该是一个整数(INT)。这一行还定义了这个数据列的其他一些信息。首先,这一行不允许为空(NOT NULL)。第二,如果你没有为一列指定一个值,MySQL会选择使用一个比当前最大值大的值(AUTO_INCREMENT)。最后,这个数据列还是这数据表的唯一的标识符,所以这个数据列中的所有值都应该是不重复的(PRIMARY KEY)。
第三行是非常简单的;这说明我们需要一个数据列叫JokeText,这个列的类型应该是一个文本(TEXT)。
第四行定义了我们的最后一列,列名是JokeDate,这个列的类型是日期型(DATE)这个列也不能为空(NOT NULL)。
请注意,我们在输入SQL命令时,大小写是完全自由的,但是在一个Unix-based系统下运行的MySQL服务,因为我们必须与MySQL数据目录下的目录和文件一致,当遇到数据库名和表名时,我们必须区分大小写。否则,MySQL是完全对大小写不敏感的,只有一种情况例外,在同一命令中多次出现的表名、列名以及其他名字必须在拼写上完全一致。
我们还应该注意到,我们为我们建立的每一列指定了一个指定的类型。 ID是一个整型,JokeText是一个文本型,JokeDate是一个日期型。MySQL允许我们为每一个列定义一个类型。 这不仅仅可以帮助你组织数据,而且你可以利用它对数据进行比较(我们在下面会看到)。要想得到一个关于MySQL支持的数据类型的完整的列表,你可以参看MySQL用户手册。
总之,如果你正确输入了上面的命令,MySQL会返回 Query OK并会为你建立你的第一个数据表。如果你在输入中出了什么错误,MySQL会告诉你输入的语名有问题,而且会给你一些提示,说明什么地方它不能理解。
对于这样一个复杂的命令,最终只出现Query OK是相当单调的。让我们看看你的新数据表是不是正常地建立了。输入下面的命令:
mysql> SHOW TABLES;
响应应该是这样的:
+-----------------+
| Tables in jokes |
+-----------------+
| Jokes |
+-----------------+
1 row in set
这是一个关于我们的数据库(我们在前面将其命名为jokes)中的所有表的列表。这个列表仅仅包含了一个数据表:Jokes,这个表是我们刚刚建立的。看来一切都好了,让我们再来近看一下这个Jokes表:
mysql> DESCRIBE Jokes;
+----------+---------+------+-----+------------+- -
| Field | Type | Null | Key | Default | ...
+----------+---------+------+-----+------------+- -
| ID | int(11) | | PRI | 0 | ...
| JokeText | text | YES | | NULL |
| JokeDate | date | | | 0000-00-00 |
+----------+---------+------+-----+------------+- -
3 rows in set
这儿提供了一个数据列的列表。正如我们看到的,这个表中有三个列,在返回的结果表中这被表示为三行。详细资料比较难以看懂,但是你认真看一下,应该还是能了解其大致的含义的。不要为这件事过于担心。我们还会继续学习,我们还会在这个表中添加一些笑话。
我们还需要知道一些其他的事,例如删除一个表。这和删除一个数据库一样的简单,简单得令人恐怖。命令也几乎一样:
mysql> DROP TABLE <tableName>;
向数据库中添加数据
我们的数据库和数据表都已经建立好了,现在我们该向我们的数据库中添加笑话了。向数据库中添加数据的命令被称之为INSERT。这个命令有两种基本格式:
mysql> INSERT INTO <table name> SET
-> columnName1 = value1,
-> columnName2 = value2,
-> ...
-> ;
mysql> INSERT INTO <table name>
-> (columnName1, columnName2, ...)
-> VALUES (value1, value2, ...);
所以要向我们的数据表中添加笑话,我们可以在下面的两个命令中选择一个:
mysql> INSERT INTO Jokes SET
-> JokeText = "Why did the chicken cross theroad? To get to the other side!",
-> JokeDate = "2000-04-01";
mysql> INSERT INTO Jokes
-> (JokeText, JokeDate) VALUES (
-> "Why did the chicken cross the road? Toget to the other side!",
-> "2000-04-01"
-> );
请注意在INSERT命令的第二种格式中,你给出的列的顺序必须与你给出的数据的顺序一致。
现在你知道如何向表中添加了,下面让我们来看看如何显示表的内容。
显示存储的数据
显示你的数据库中表的存储数据的命令,被称之为SELECT,这个命令无疑是SQL语言中最复杂的命令。说它复杂,是因为数据库的最主要的优点就是可以机动地给出数据。而机动性就是通过这个命令实现的。
下面的命令会列出存储在表Jokes中的所有数据:
mysql> SELECT * FROM Jokes;
这个命令意味着“从Jokes中挑选所有的东西”。如果你试着输入这个命令,你会看到这样的显示:
+----+---------------------------------------
------------------------+------------+
| ID | JokeText
| JokeDate |
+----+---------------------------------------
------------------------+------------+
| 1 | Why did the chicken cross the road? To
get to the other side! | 2000-04-01 |
+----+---------------------------------------
------------------------+------------+
1 row in set (0.05 sec)
这看上去有点混乱,这是因为JokeText列实在是太长了。因为这个原因,我们可能想要告诉MySQL省去JokeText列,这个命令会实现这个功能:
mysql> SELECT ID, JokeDate FROM Jokes;
这一次我们不再告诉它“挑选所有的东西”了,我们告诉它我们对显示哪些列感兴趣。结果应该是这样的:
+----+------------+
| ID | JokeDate |
+----+------------+
| 1 | 2000-04-01 |
+----+------------+
1 row in set (0.00 sec)
但是我们是不是可以多少显示一点笑话正文的内容呢?作为对我们所想显示的列的补充,我们可用“函数”来更改我们所要显示的列。有一个叫做LEFT的函数,可以让我们告诉MySQL当我们显示一个数据列时最多显示几个字符。例如,如果我们只想显示JokeText列的前20个字符:
mysql> SELECT ID, LEFT(JokeText,20), JokeDate FROM Jokes;
+----+----------------------+------------+
| ID | LEFT(JokeText,20) | JokeDate |
+----+----------------------+------------+
| 1 | Why did the chicken | 2000-04-01 |
+----+----------------------+------------+
1 row in set (0.05 sec)
明白它是如果工作的了吗?另一个有用的函数是COUNT,通过这个函数,我们可以很简单地得到返回结果的个数。例如,如果我们想要找出在我们的表中我们存储了多少笑话,我们可以用下面这个命令:
mysql> SELECT COUNT(*) FROM Jokes;
+----------+
| COUNT(*) |
+----------+
| 1 |
+----------+
1 row in set (0.06 sec)
正如我们看到的,在我们的表中只有一个笑话。
到目前为止,我们的所有的例子都是针对表中的所有记录的。作为对SELECT命令的补充,我们可以使用“WHERE子句”,这样我们可以对返回的结果进行限制。看看下面这个例子:
mysql> SELECT COUNT(*) FROM Jokes
-> WHERE JokeDate >= "2000-01-01";
这个查询语句会数出所有日期“大于或等于”2000年1月1日的记录,对于一个日期来说“大于或等于”意味着“在当天或在此之后”。
有一种比较特殊的用法可以找出包含某一段文字的记录。你可以看看这个查询语句:
mysql> SELECT JokeText FROM Jokes
-> WHERE JokeText LIKE "%chicken%";
这个查询语句显示了所有JokeText列包含单词chicken的笑话的正文。LIKE关键字告诉MySQL指定的列必须匹配给定的表达式。在这里,我们使用的表达式是"%chicken%"。这儿的%说明单词chicken可以出现在任何字符串的前面或后面。
条件也可以在WHERE子句中组合使用,这样可以做更复杂的查询。例如我们要显示2000年4月份的knock-knock笑话,我们可以使用下面的查询语句:
mysql> SELECT JokeText FROM Jokes WHERE
-> JokeText LIKE "%knock knock%" AND
-> JokeDate >= "2000-04-01" AND
-> JokeDate < "2000-05-01";
在表中添加再一些笑话,再试验试验SELECT语句。熟悉SELECT语句会有助于学习这个教程。
我们还可以用SELECT语句做很多事,但是我们在这里将不再详细讨论它,我们在需要的时候才会再讲到其他一些高级的功能。如果你太好奇,没法再等下去的话,你可以去看MySQL用户手册。
修改存储的数据
一旦你已经向数据库的表中输入了一些数据,你可能想要进行一些修改。例如改正拼写错误,以及其他有关笑话的数据,所有的这些改变都可以用UPDATE命令来完成。这个命令包含了一些INSERT命令(在设置列的数值方面)和 SELECT命令(在选取改变对象方面)的基本原理。UPDATE命令的基本格式是这样的:
mysql> UPDATE <tableName> SET
-> <col_name>=<new_value>, ...
-> WHERE <where clause>;
例如,如果你想要改变上面输入的笑话的日期,你需要输入下面的命令:
mysql> UPDATE Jokes SET JokeDate="1990-04-01" WHERE ID=1;
这儿我们用到了ID列。通过它你可以很方便地指定你要改变的笑话。WHERE子句也可以用在这里,就象在SELECT命令中那样。下面的命令是改变所有正文中包含单词chicken的笑话的日期:
mysql> UPDATE Jokes SET JokeDate="1990-04-01"
-> WHERE JokeText LIKE "%chicken%";
删除存储数据
在SQL中删除一个内容是令人恐怖的简单,下面是这个命令的格式:
mysql> DELETE FROM <tableName> WHERE <where clause>;
要删除所有包含chicken的笑话,你只需要输入下面的命令:
mysql> DELETE FROM Jokes WHERE JokeText LIKE "%chicken%";
这里的WHERE子句是可选的,但是如果你不用它,你应该清楚你在干什么,因为这时其实你是在清空这个数据表。下面这个命令将清空Jokes数据表:
mysql> DELETE FROM Jokes;
结语
事实上除了我们在这里已经看到的这些基本的命令,MySQL数据库系统和SQL语句还有许多其它值得学的东西,但是我们提到的这些命令是一些最常用的命令。到目前为止,我们只是在一个数据表中工作。要理解关系型数据库引擎的真正的强大功能,你还需要学会如果同时使用几个表以描述表之间可能存在的复杂的关系。
所有的这些内容以及一些其他的内容,我们都会在我们的这个教程的第四章内讲到,在第四章中,我们会讨论数据库的设计原理并参考一些复杂一点的例子。现在,我们需要能够熟练地使用命令行界面来操作MySQL。
在第三章内,我们将深入研究PHP这个服务器端的脚本语言,并且学习使用它来建立一个动态的Web页面。
发布人:netbull 来自:LinuxAid