## 3.2 输入查询

[](<>)[](<>)[](<>)

确保您已连接到服务器，如上一节所述。这样做本身并不会选择要使用的任何数据库，但这没关系。此时，了解如何发出查询比直接创建表、将数据加载到表中以及从表中检索数据更重要。本节介绍输入查询的基本原则，您可以尝试使用几个查询来熟悉如何[**mysql**](mysql.html)作品。

这是一个简单的查询，要求服务器告诉您它的版本号和当前日期。如下所示键入它`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**](mysql.html)：

-   查询通常由一个 SQL 语句和一个分号组成。（有一些例外情况可以省略分号。`放弃`，前面提到的，就是其中之一。我们稍后会联系其他人。）

-   当您发出查询时，[**mysql**](mysql.html)将其发送到服务器执行并显示结果，然后打印另一个`mysql>`提示指示它已准备好进行另一个查询。

-   [**mysql**](mysql.html)以表格形式（行和列）显示查询输出。第一行包含列的标签。以下行是查询结果。通常，列标签是您从数据库表中获取的列的名称。如果您正在检索表达式而不是表列的值（如刚刚显示的示例中所示），[**mysql**](mysql.html)使用表达式本身标记列。

-   [**mysql**](mysql.html)显示返回了多少行以及查询执行了多长时间，这让您大致了解服务器性能。这些值是不精确的，因为它们代表挂钟时间（不是 CPU 或机器时间），并且因为它们受服务器负载和网络延迟等因素的影响。（为简洁起见，本章其余示例中有时未显示“集合中的行”行。）

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


```
mysql> SELECT VERSION(), CURRENT_DATE;
mysql> select version(), current_date;
mysql> SeLeCt vErSiOn(), current_DATE;
```

这是另一个查询。它表明您可以使用[**mysql**](mysql.html)作为一个简单的计算器：

```
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.html)通过查找终止分号而不是查找输入行的结尾来确定语句的结束位置。（换一种说法，[**mysql**](mysql.html)接受自由格式输入：它收集输入行但在看到分号之前不执行它们。）

这是一个简单的多行语句：

```
mysql> SELECT
    -> USER()
    -> ,
    -> CURRENT_DATE;
+---------------+--------------+
| USER()        | CURRENT_DATE |
+---------------+--------------+
| jon@localhost | 2018-08-24   |
+---------------+--------------+
```

在此示例中，请注意提示如何从`mysql>`到`->`在您输入多行查询的第一行之后。这是如何[**mysql**](mysql.html)表示它还没有看到完整的语句，正在等待其余的。提示是您的朋友，因为它提供了有价值的反馈。如果您使用该反馈，您可以随时了解[**mysql**](mysql.html)正在等待。

如果您决定不想执行您正在输入的查询，请通过键入取消它`\c`：

```
mysql> SELECT
    -> USER()
    -> \c
mysql>
```

在这里，也请注意提示。它切换回`mysql>`键入后`\c`，提供反馈以表明[**mysql**](mysql.html)已准备好进行新查询。

下表显示了您可能会看到的每个提示，并总结了它们对当前状态的含义[**mysql**](mysql.html)在。

[](<>)

| 迅速的 | 意义 |
| --- | --- |
| `mysql>` | 准备好新的查询 |
| `->` | 等待多行查询的下一行 |
| `'>` | 等待下一行，等待以单引号 (`'`) |
| `">` | 等待下一行，等待以双引号 (`"`) |
| ``>\` \|等待下一行，等待以反引号（\```) |  |
| `/*>` | 等待下一行，等待以开头的注释完成`/*` |

当您打算在单行上发出查询时，通常会意外出现多行语句，但忘记了终止分号。在这种情况下，[**mysql**](mysql.html)等待更多输入：

```
mysql> SELECT USER()
    ->
```

如果这种情况发生在您身上（您认为您已经输入了一个声明，但唯一的回应是`->`提示），很可能[**mysql**](mysql.html)正在等待分号。如果您没有注意到提示告诉您什么，您可能会坐在那里一段时间，然后才意识到您需要做什么。输入分号以完成语句，然后[**mysql**](mysql.html)执行它：

```
mysql> SELECT USER()
    -> ;
+---------------+
| USER()        |
+---------------+
| jon@localhost |
+---------------+
```

这`'>`和`">`在字符串收集期间出现提示（另一种说法是 MySQL 正在等待字符串的完成）。在 MySQL 中，您可以编写由以下任一包围的字符串`'`要么`"`字符（例如，`'你好'`要么`“再见”`）， 和[**mysql**](mysql.html)允许您输入跨越多行的字符串。当你看到一个`'>`要么`">`提示，这意味着您输入了一行，其中包含以`'`或`"`引号字符，但尚未输入终止字符串的匹配引号。这通常表示您无意中漏掉了引号字符。例如：

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

如果你输入这个[`选择`](select.html)声明，然后按**进来**等待结果，什么都不会发生。与其想知道为什么这个查询需要这么长时间，不如注意`'>`促使它告诉你[**mysql**](mysql.html)希望看到未终止字符串的其余部分。（你看到语句中的错误了吗？字符串`“史密斯`缺少第二个单引号。）

在这一点上，你会怎么做？最简单的方法是取消查询。然而，你不能只是打字`\c`在这种情况下，因为[**mysql**](mysql.html)将其解释为正在收集的字符串的一部分。相反，请输入结束引号字符（因此[**mysql**](mysql.html)知道你已经完成了字符串），然后键入`\c`:

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

提示变回`mysql>`，表明[**mysql**](mysql.html)已准备好进行新查询。

这个``>`提示符类似于`'>`和`“>\`提示，但表示您已开始但尚未完成倒勾引号标识符。

重要的是要知道`'>`, `">`和``>`提示意味着，因为如果您错误地输入了一个未终止的字符串，那么[**mysql**]（mysql.html）会忽略您输入的任何其他行，包括包含`退出\`。这可能会让人非常困惑，尤其是如果您不知道需要在取消当前查询之前提供终止报价。

笔记

从这一点开始，多行语句是在没有辅助语句的情况下编写的(`->`或其他）提示，以便更容易地复制和粘贴语句，以便自己尝试。
