Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  Tutorial  /  Entering Queries

5.2 输入查询

确保您已经连接到服务器,如前一节所讨论的那样。这样做不会选择任何要工作的数据库,但这没关系。在这个阶段,更重要的是了解如何发出查询,而不是立即创建表、加载数据到表中并从表中检索数据。本节描述了输入查询的基本原则,使用几个查询让您熟悉mysql的工作方式。

这里是一个简单的查询,询问服务器其版本号和当前日期。按照以下方式键入查询,紧跟着 mysql> 提示符,然后按 Enter:

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 语句,然后按下 Enter 并等待结果,但什么也没有发生。相比于想知道这个查询为什么花费了这么长时间,请注意提示提供的线索。它告诉你 mysql 期望看到未完成的字符串的其余部分。(你看到语句中的错误了吗?字符串 'Smith 缺少第二个单引号。)

现在你该怎么做?最简单的方法是取消查询。但是,你不能只是输入 \c,因为 mysql 将其解释为它正在收集的字符串的一部分。相反,输入关闭引号字符(以便 mysql 知道你已经完成了字符串),然后输入 \c

mysql> SELECT * FROM my_table WHERE name = 'Smith AND age < 30;
    '> '\c
mysql>

提示符变回 mysql>,表明 mysql 准备好接受新的查询。

`> 提示类似于 '>"> 提示,但表明你已经开始但尚未完成反引号引用的标识符。

了解 '>">`> 提示符的含义非常重要,因为如果您不小心输入了未终止的字符串,随后输入的所有行都会被mysql忽略——包括包含 QUIT 的行。这可能会非常混淆,特别是如果您不知道需要在取消当前查询之前提供终止引号。

Note

从现在开始,多行语句将不带次要提示(-> 或其他),以便您可以更方便地复制和粘贴语句来尝试。