3.2 输入查询
确保已连接到服务器,如前一节所述。这样做本身不会选择要使用的任何数据库,但这是可以的。此时,了解一些如何发出查询比直接创建表、将数据加载到表中以及从表中检索数据更重要。本节介绍了输入查询的基本原理,你可以使用几个查询来熟悉 mysql 的工作原理。
这里有一个简单的查询,要求服务器告诉你它的版本号和当前日期。在 mysql>
提示符下按如下所示键入它,然后按回车键:
mysql> SELECT VERSION(), CURRENT_DATE;
+-----------+--------------+
| VERSION() | CURRENT_DATE |
+-----------+--------------+
| 5.8.0-m17 | 2015-12-21 |
+-----------+--------------+
1 row in set (0.02 sec)
mysql>
这个查询说明了mysql的几个方面:
- 查询通常由 SQL 语句后跟分号组成。(有些例外情况下可以省略分号。前面提到的
QUIT
就是其中之一。我们稍后再讨论其他问题。) - 当你发出一个查询时,mysql 将其发送到服务器执行并显示结果,然后打印另一个
mysql>
提示以指示它已准备好进行另一个查询。 - mysql 以表格形式(行和列)显示查询输出。第一行包含列的标签。下面的行是查询结果。通常,列标签是从数据库表中获取的列的名称。如果检索的是表达式的值而不是表列(如刚才所示的示例),mysql 将使用表达式本身来标记列。
- mysql 显示了返回的行数和执行查询所需的时间,这让你大致了解了服务器性能。这些值是不精确的,因为它们表示墙上的时钟时间(而不是 CPU 或机器时间),并且受服务器负载和网络延迟等因素的影响。(为简洁起见,本章其余示例中有时未显示“集合中的行”这行字。)
关键字可以用任何字母大小写输入。以下查询是等效的:
mysql> SELECT VERSION(), CURRENT_DATE;
mysql> select version(), current_date;
mysql> SeLeCt vErSiOn(), current_DATE;
这里是另一个查询。它演示了你可以使用 mysql 作为一个简单的计算器:
mysql> SELECT SIN(PI()/4), (4+1)*5;
+------------------+---------+
| SIN(PI()/4) | (4+1)*5 |
+------------------+---------+
| 0.70710678118655 | 25 |
+------------------+---------+
1 row in set (0.02 sec)
到目前为止,显示的查询都是相对简短的单行语句。你甚至可以在一行中输入多个语句。只需以分号结尾:
mysql> SELECT VERSION(); SELECT NOW();
+-----------+
| VERSION() |
+-----------+
| 8.0.13 |
+-----------+
1 row in set (0.00 sec)
+---------------------+
| NOW() |
+---------------------+
| 2018-08-24 00:56:40 |
+---------------------+
1 row in set (0.00 sec)
一个查询不需要在一行中全部给出,所以需要几行的冗长查询不是问题。mysql 通过查找终止分号而不是查找输入行的结尾来确定语句的结尾。(换句话说,mysql 接受自由格式输入:它收集输入行,但在看到分号之前不会执行它们。)
下面是一个简单的多行语句:
mysql> SELECT
-> USER()
-> ,
-> CURRENT_DATE;
+---------------+--------------+
| USER() | CURRENT_DATE |
+---------------+--------------+
| jon@localhost | 2018-08-24 |
+---------------+--------------+
在本例中,请注意在输入多行查询的第一行后,提示如何从 mysql>
变为 ->
。这就是 mysql 表示它还没有看到完整的语句,正在等待剩下的语句。提示是你的朋友,因为它提供了宝贵的反馈。如果你使用该反馈,你可以随时了解 mysql 正在等待什么。
如果你决定不执行正在输入的查询,请键入 \c
:
mysql> SELECT
-> USER()
-> \c
mysql>
在这里,也要注意提示。在你键入 \c
后,它会切换回 mysql>
,提供反馈以指示 mysql 已准备好进行新查询。
下表显示了你可能看到的每个提示,并总结了它们对 mysql 所处状态的含义。
提示 | 含义 |
---|---|
mysql> | 等待新的查询 |
-> | 等待多行查询的下一行 |
'> | 等待下一行,等待以单引号(' )开头的字符串完成 |
"> | 等待下一行,等待以双引号(" )开头的字符串完成 |
`> | 等待下一行,等待以倒勾(`)开头的标识符完成 |
/*> | 等待下一行,等待以开头的注释完成 /* |
当你打算在单行上发出查询,但忘记了终止分号时,通常会意外出现多行语句。在这种情况下,mysql 等待更多的输入:
mysql> SELECT USER()
->
如果发生这种情况(你认为你输入了一条语句,但唯一的响应是->提示符),那么 mysql 很可能正在等待分号。如果你没有注意到提示告诉你什么,你可能会在那里坐一会儿,然后意识到你需要做什么。输入分号来完成语句,mysql 就会执行它:
mysql> SELECT USER()
-> ;
+---------------+
| USER() |
+---------------+
| jon@localhost |
+---------------+
'>
和 ">
提示出现在字符串收集过程中(换个说法是 MySQL 正在等待字符串的完成)。在 MySQL 中,你可以编写由 '
或 "
字符包围的字符串(例如,'hello'
或 "goodbye"
),mysql 允许你输入跨多行的字符串。当你看到 '>
或 ">
提示时,表示你输入了一行包含以 '
或 "
引号字符开头的字符串,但尚未输入终止该字符串的匹配引号。这通常表示你无意中遗漏了引号字符。例如:
mysql> SELECT * FROM my_table WHERE name = 'Smith AND age < 30;
'>
如果输入此 SELECT 语句,然后按回车并等待结果,则不会发生任何情况。不要想知道为什么这个查询需要这么长时间,请注意 '>
提示符提供的线索。它告诉你 mysql 希望看到未终止字符串的其余部分。(你看到语句中的错误了吗?字符串 'Smith
缺少第二个单引号。)
此时,你该怎么做?最简单的方法是取消查询。然而,在这种情况下不能只键入 \c
,因为 mysql 将其解释为它正在收集的字符串的一部分。相反,输入右引号字符(这样 mysql 就知道你已经完成了字符串),再键入 \c
:
mysql> SELECT * FROM my_table WHERE name = 'Smith AND age < 30;
'> '\c
mysql>
提示变回 mysql>
,表示 mysql 已准备好进行新查询。
`> 提示与 '> 和 "> 提示类似,但表示你已开始但尚未完成倒勾引号标识符。
了解 `>、'> 和 "> 提示的含义非常重要,因为如果你错误地输入了一个未终止的字符串,mysql 会忽略你键入的任何其他行,包括一行包含 QUIT
的行。这可能非常令人困惑,尤其是如果你不知道在取消当前查询之前需要提供终止引号。
从这一点开始,多行语句在编写时不需要辅助(->
或其他)提示,复制和粘贴语句可以更容易,你可以自己试试。