> For the complete documentation index, see [llms.txt](https://404dream.gitbook.io/mysql/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://404dream.gitbook.io/mysql/summary/entering-queries.md).

# 4.2 简单查询

按照上一章的操作连接到服务器。连接之后并没有选择任何数据库，但这没关系。在这一点上，更重要的是找到一点关于如何进行数据查询，而不是在创建表、加载数据、检索数据。本节介绍了数据查询的基本原理，使用几种查询方式可以尝试一下熟悉MySQL如何工作。

这是一个简单的查询，要求服务器告诉您它的版本号和当前日期。在MySql命令行中键入如下所示的命令并回车：

```
mysql>SELECT VERSION(), CURRENT_DATE;
+--------------+--------------+
| VERSION()    | CURRENT_DATE |
+--------------+--------------+
| 5.7.1-m4-log | 2012-12-25   |
+--------------+--------------+
1 row in set (0.01 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()        |
+------------------+
| 5.7.10-ndb-7.5.1 |
+------------------+
1 row in set (0.00 sec)

+---------------------+
| NOW()               |
+---------------------+
| 2016-01-29 18:02:55 |
+---------------------+
1 row in set (0.00 sec)
```

当查询语句过长时可以分行显示。 mysql通过查找终止分号来确定语句的结尾，而不是通过查找输入行的结尾。 （换句话说，mysql接受自由格式输入：它收集输入行，但不执行它们，直到它看到分号。）：

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

在此示例中，请注意在输入多行查询的第一行之后，提示符从mysql>更改为 - >。这就是mysql如何表示它还没有看到一个完整的语句，并等待其余的。提示是你的得力助手，因为它提供了有价值的反馈。如果你使用这个反馈，你总是可以知道mysql正在等待什么。

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

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

在这里，也注意提示。在键入 c后，它将切换回mysql>，提供反馈以指示mysql已准备好进行新的查询。

下表显示了您可能看到的每个提示，并总结了它们对mysql所在的状态的含义。

| Prompt   | Meaning                  |
| -------- | ------------------------ |
| `mysql>` | 准备好新的查询                  |
| `->`     | 等待多行查询的下一行               |
| `'>`     | 等待下一行，等待以单引号（'）开始的字符串的完成 |
| `">`     | 等待下一行，等待以双引号（“）开头的字符串的完成 |
| `` `> `` | 等待下一行，等待完成以反引号开头的标识符（\`） |
| /\*>     | 等待下一行，等待完成一个以/ \*开头的注释，  |

多行语句通常在命令行单行上发出查询但是忘记终止分号时意外发生。在这种情况下，mysql会等待更多的输入：

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

如果这发生在你（你认为你输入了一个语句，但唯一的响应是一个 - >提示），很可能mysql正在等待分号。如果你没有注意到提示告诉你什么，你可能会坐在那里一段时间，然后才意识到你需要做什么。输入一个分号来完成语句，mysql执行它：

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

在MySQL中，你可以写出由 'or' 字符包围的字符串（例如'hello' or '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的行，特别是如果你不知道你需要提供终止符，然后才能取消当前查询。
