MySQL 9.0 参考手册  /  教程  /  输入查询

5.2 输入查询

确保您已连接到服务器,如上一节所述。这样做本身不会选择任何数据库来使用,但这没关系。在这一点上,了解如何发出查询比直接创建表、将数据加载到表中以及从表中检索数据更重要。本节介绍输入查询的基本原理,使用几个可以尝试的查询让您熟悉 mysql 的工作方式。

以下是一个简单的查询,要求服务器告诉您它的版本号和当前日期。在 mysql> 提示符后按所示输入并按 Enter 键

mysql> SELECT VERSION(), CURRENT_DATE;
+-----------+--------------+
| VERSION() | CURRENT_DATE |
+-----------+--------------+
| 8.4.0-tr  | 2024-01-25   |
+-----------+--------------+
1 row in set (0.00 sec)

mysql>

此查询说明了有关 mysql 的几点内容

  • 查询通常由一个 SQL 语句和一个分号组成。(在某些情况下,可以省略分号。QUIT(前面提到过)就是其中之一。我们稍后会讲到其他情况。)

  • 当您发出查询时,mysql 会将查询发送到服务器以执行,并显示结果,然后打印另一个 mysql> 提示符,表明它已准备好接受另一个查询。

  • mysql 以表格形式(行和列)显示查询输出。第一行包含列的标签。接下来的行是查询结果。通常,列标签是您从数据库表中提取的列的名称。如果您检索的是表达式的值而不是表列(如刚才所示的示例),mysql 会使用表达式本身作为列的标签。

  • mysql 显示返回了多少行以及查询执行花费了多长时间,这可以粗略地了解服务器性能。这些值是不精确的,因为它们代表的是时钟时间(而不是 CPU 或机器时间),并且会受到服务器负载和网络延迟等因素的影响。(为了简洁起见,在本章中剩余的示例中,有时不会显示 rows in set 行。)

关键字可以以任何字母大小写输入。以下查询是等效的

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.4.0-tr  |
+-----------+
1 row in set (0.00 sec)

+---------------------+
| NOW()               |
+---------------------+
| 2024-01-25 18:33:04 |
+---------------------+
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 的行。这可能会非常令人困惑,尤其是在您不知道需要提供终止引号才能取消当前查询的情况下。

注意

从现在起,多行语句将不带辅助提示符(-> 或其他),以便更轻松地复制和粘贴语句以供您自己尝试。