Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 Reference Manual  /  Tutorial  /  Entering Queries

5.2 输入查询

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

以下是一个简单的查询,询问服务器其版本号和当前日期。按照这里显示的格式输入,然后按回车键:

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 将查询结果以表格形式显示(行和列)。第一个行包含列的标签,后续行是查询结果。通常,列标签是从数据库表中fetch的列名。如果你正在检索表达式的值,而不是表列(如上面的示例),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 的状态。

Prompt Meaning
mysql> 准备新的查询
> 等待多行查询的下一行
'> 等待字符串开始的下一行,字符串以单引号 (') 开头
"> 等待字符串开始的下一行,字符串以双引号 (") 开头
'> 等待标识符开始的下一行,标识符以反引号 (`) 开头
/*> 等待注释开始的下一行,注释以 /* 开头

多行语句通常是意外出现的,当您想在单行中执行查询,但忘记结尾分号。在这种情况下,mysql 等待更多输入:

mysql> SELECT USER()
    ->

如果你遇到这种情况(你认为已经输入了语句,但是唯一的响应是一个 -> 提示),很可能是mysql 等待分号。如果你不注意提示,你可能会在那里等一会儿,直到意识到需要做什么。输入一个分号来完成语句,然后mysql 执行它:

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

在字符串收集过程中(MySQL 等待字符串完成),出现 '>"> 提示。在 MySQL 中,你可以使用 either '" 字符来括起字符串(例如,'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忽略—including 包含QUIT的行。这可能会很混乱,特别是如果你不知道需要在取消当前查询前提供终止引号。

Note

从现在开始的多行语句将不再包含次要(>或其他)提示,以便更方便地复制并粘贴语句来自己尝试。