MySQL—一些实用技巧
我最近在 IRC 上与人交谈,他正在帮助我解决一个 PHP 应用程序的问题。这位非常有帮助的人让我告知他我的 MySQL 服务器上某条记录中某个字段的值。我很尴尬地承认,我需要安装像 PHPMyAdmin 或 Adminer 这样的工具才能找到该信息。他非常宽容,并发送给我一个简单的单行命令,我可以在命令行上运行以获取他需要的信息。我非常感谢,但不得不承认很尴尬。我想,如果我不知道如何从 MySQL 服务器获取简单信息,可能还有其他人也一样。所以,让我们一起学习一点 SQL。
获取数据库事实证明,互联网上有相当多的示例数据库可以下载。不幸的是,它们都比我想象的要复杂得多,不适合用于演示目的。所以,我创建了一个数据库。虽然您不必拥有我的数据库才能继续学习,但如果您这样做肯定会有所帮助。所以首先,让我们创建一个数据库并导入我的数据。
您需要做的第一件事是安装 MySQL。根据您的发行版,这可以是 apt-get
命令、yum
命令,或在 GUI 软件中心搜索。我将安装留给您自己完成——如果您遇到困难,请随时使用 Google。最重要的是记住您在安装过程中设置的 root 密码。这与您系统的 root 密码不同;而是您 MySQL 服务器中的 root 用户。如果您使用的是实时服务器,只需创建一个新的用户/密码并授予其创建数据库的权限即可。我假设您刚刚安装了 MySQL,并且您知道 root 用户的密码。
当您在命令行上使用 MySQL 时,您会使用 “mysql” 应用程序。因此,为了为此示例创建数据库,请输入
mysql -u root -p -e "CREATE DATABASE food"
系统应提示您输入密码,这是您在安装期间为 MySQL root 用户帐户设置的密码。如果您收到有关数据库已存在的错误,您可以为您的数据库选择一个新名称。请注意,您选择的名称将是稍后我提到 “food” 数据库时您将使用的名称。
接下来,您需要将我的数据导入到您的数据库中。我有一个 SQL 文件存储在 http://snar.co/foodsql。您可以下载该文件,或在命令行上使用 wget
获取它。如果您使用 wget
,则生成的文件名可能是 “foodsql” 或 “food.sql”,具体取决于您的 wget
版本的工作方式。任何文件名都可以,只需记下您拥有的文件名,以便您可以更改您将在下面使用的命令。要下载并导入数据,请输入
wget http://snar.co/foodsql
mysql -u root -p food < ./food.sql
请记住,如果您的下载文件是 “foodsql” 而不是 “food.sql”,您可以将命令更改为 ./foodsql
而不是 ./food.sql
。两者都有效。
mysql 程序可以交互式工作,也可以像上面那样作为单行命令工作。第一个命令在您的 MySQL 服务器上创建了一个名为 “food” 的数据库,您将使用它来学习本文。-u
标志允许您以特定用户(在本例中为 root)身份连接。输入 -p
告诉 mysql 要求您输入密码。您也可以像这样在命令行上输入密码
mysql -u root -pmypassword -e "CREATE DATABASE food"
但是,这让我感到困扰有两个原因。首先,密码清楚地显示在屏幕上,这让我感到毛骨悚然。而且,您可能也注意到 -p
和实际密码之间没有空格。这不是笔误;这就是您实际必须做的方式——很奇怪。我通常只是让它提示我输入密码。命令的最后一部分告诉 mysql 执行一个命令。我将在稍后介绍交互式使用命令,但在这里,您告诉它创建一个名为 “food” 的数据库,然后退出。CREATE
和 DATABASE
不必全部大写,但这在 SQL 世界中是标准做法。如果单词是命令或特殊单词,则全部大写。如果它是数据或名称,则全部小写。同样,这只是一种约定,但我会尽量坚持下去。您也应该这样做,因为它使阅读 SQL 内容更容易得多。
第二部分代码做了两件事。它使用 wget
下载了我的示例数据库,然后将 SQL 数据转储到 “food” 数据库中。下载的文件只是一个文本文件。您可以查看它,您会看到一堆 SQL 语句(带有大写命令)。这些命令通过 STDIN 管道输入并执行,很像您用于创建初始数据库的 -e
命令。最终结果是,您的本地 MySQL 服务器上有一个名为 “food” 的数据库,其中包含我的表和数据。让我们去查看一下数据。
如果您一直在学习,您实际上已经连接到 MySQL 和数据库了,但您创建的是执行并结束的单个命令。要进入交互模式,您只需输入
mysql -u root -p food
这将提示您输入密码,然后将您登录到 mysql 的交互模式,并打开 “food” 数据库供您浏览。您应该会看到类似这样的提示符
Welcome to the MySQL monitor. Commands end with ; or \g.
Copyright (c) 2000, 2014, Oracle and/or its affiliates.
All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or
its affiliates. Other names may be trademarks of their
respective owners.
Type 'help;' or '\h' for help. Type '\c' to clear the
current input statement.
mysql>
要检查您是否已登录到 “food” 数据库,以及 SQL 导入是否成功,让我们查看数据库中的表。输入以下内容
SHOW TABLES;
您应该看到这个
mysql> SHOW TABLES;
+----------------+
| Tables_in_food |
+----------------+
| fruit |
| vegetable |
+----------------+
2 rows in set (0.00 sec)
请注意,您输入的每个命令都必须以分号结尾。如果您忘记分号,它只会转到下一行并期望您输入更多命令。如果您这样做了(我大约有一半的时间会这样做),只需在下一行单独输入一个分号,它就会像您没有忘记分号一样执行。
您应该在 food 数据库中看到 fruit 和 vegetable 表。如果您没有看到,请返回到第一步,因为肯定出了问题。仔细阅读任何错误消息。
接下来您将要做的是查看每个表中的数据。为此,您将使用一个新命令 SELECT
,它在交互模式下只显示您根据您指定的任何条件 “选择” 的数据。因此,请输入
SELECT * FROM fruit;
在 mysql 中,星号是通配符。因此,SELECT
命令显示 “FROM” “fruit” 表中的所有内容。然后您应该看到整个表的数据的可视化显示
mysql> SELECT * FROM fruit;
+------------+-------+--------+
| name | size | color |
+------------+-------+--------+
| lemon | small | yellow |
| grape | small | purple |
| apple | small | red |
| banana | small | yellow |
| watermelon | big | green |
+------------+-------+--------+
5 rows in set (0.01 sec)
尝试对 vegetable 数据库执行相同的操作。您应该看到类似的数据集,但其中包含蔬菜信息而不是水果。
筛选产品!通常,当您操作充满数据的数据库时,您只想处理数据的子集。官方上这称为 “查询”,但不要让数据库术语吓跑您。您将只使用几乎是英语的命令来筛选结果以满足您的需求。
假设您只想查看小蔬菜的列表。如果您输入
SELECT * FROM vegetable WHERE size = "small";
您应该看到
mysql> SELECT * FROM vegetable WHERE size = "small";
+--------+-------+--------+
| name | size | color |
+--------+-------+--------+
| pea | small | green |
| radish | small | red |
| bean | small | green |
| corn | small | yellow |
+--------+-------+--------+
4 rows in set (0.01 sec)
您会注意到 “pumpkin” 未列出,因为其大小为 “big” 而不是 “small”。
您也可以只显示与您的查询匹配的蔬菜名称,而不是显示所有字段。因此,如果您输入
SELECT name FROM vegetable WHERE size = "big";
您应该只会看到
mysql> SELECT name FROM vegetable WHERE size = "big";
+---------+
| name |
+---------+
| pumpkin |
+---------+
1 row in set (0.00 sec)
这有一个有趣的结果,即显示了所有大型蔬菜的名称,而实际上没有显示大小数据。这显然要求您对数据库的结构有所了解(因此您知道 “size” 信息在那里),但您可以根据您实际上不显示的数据设置过滤器。
更改数据到目前为止,您只查看了现有数据。交互式 mysql 程序还允许您修改和添加数据库中的数据。要进行更改,您可以使用 UPDATE
命令。因此,如果您想将玉米从小蔬菜更改为大蔬菜,您可以输入
UPDATE vegetable SET size = "big" WHERE name = "corn";
您最终应该得到现在是大的而不是小的玉米,因此运行您之前运行的相同命令
SELECT name FROM vegetable WHERE size = "big";
应该得到类似这样的结果
mysql> SELECT name FROM vegetable WHERE size = "big";
+---------+
| name |
+---------+
| pumpkin |
| corn |
+---------+
2 rows in set (0.00 sec)
但是,您可以做的不仅仅是修改现有数据;您还可以添加新数据。它比更新现有值稍微复杂一些,但仍然相当清楚。假设您想将蜜瓜添加到您的数据库中。要向表中添加行,请输入
INSERT INTO fruit (name, color, size)
↪VALUES ('honeydew', 'green', 'big');
然后,如果您 SELECT
fruit 表中的所有内容,您应该看到这个
mysql> SELECT * FROM fruit;
+------------+-------+--------+
| name | size | color |
+------------+-------+--------+
| lemon | small | yellow |
| grape | small | purple |
| apple | small | red |
| banana | small | yellow |
| watermelon | big | green |
| honeydew | big | green |
+------------+-------+--------+
6 rows in set (0.00 sec)
冰山一角!
mysql 命令行交互式程序是一种非常强大的方式来访问、显示甚至操作数据,而无需任何 GUI。基本命令非常值得学习,因此如果您遇到像我一样的情况,您可以提取一些 MySQL 数据,而无需安装 GUI 工具来执行此操作。话虽如此,GUI 工具很棒,而且它们可以用作学习命令行内容的一种方式。例如,图 1 显示了 Adminer (http://www.adminer.org) 查看数据库。搜索、筛选、排序和无数其他 SQL 功能都可以通过下拉菜单轻松访问。真正酷的部分是 Adminer 向您显示了它用于获取结果的确切查询。因此,如果您想使用 GUI 工具来学习命令行选项,Adminer 是一种很好的方法。

图 1. Adminer 是一个非常强大的工具,而且它还能教你它在做什么!
这个关于水果和蔬菜的愚蠢小数据库显然比您将为 Web 应用程序进行故障排除的数据库类型简单得多。值得庆幸的是,无论是搜索数千笔金融交易还是一小撮农产品,概念都是完全相同的。同样重要的是要意识到,仅仅在实时数据库中 SELECT
记录不会更改任何数据,因此您不必担心仅仅查看就会破坏任何东西。事实上,尝试在现有数据库上构建复杂的查询以查看您是否可以正确地执行它是非常好的实践。如果您遇到困难,只需启动 Adminer 并查看您做错了什么。祝您好运,数据库操作愉快!