MySQL 8.0 参考手册  / 第 3 章教程  /  3.2 输入查询

3.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>

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

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

迅速的 意义
mysql> 准备好接受新查询
-> 等待下一行多行查询
'> 等待下一行,等待以单引号 ( ')开头的字符串的完成
"> 等待下一行,等待以双引号 ( ")开头的字符串的完成
`> 等待下一行,等待以反引号 ( `)开头的标识符的完成
/*> 等待下一行,等待以 开头的评论完成/*

当您打算在单行上发出查询但忘记了终止分号时,多行语句通常是偶然出现的。在这种情况下,mysql 等待更多输入:

mysql> SELECT USER()
    ->

如果这发生在你身上(你认为你已经输入了一个语句,但唯一的反应是一个->提示),很可能mysql正在等待分号。如果您没有注意到提示告诉您的内容,您可能会坐在那里一会儿,然后才意识到您需要做什么。输入分号完成语句,mysql 执行:

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

和提示出现在字符串收集期间'>">另一种表示 MySQL 正在等待字符串完成的方式)。'在 MySQL 中,您可以编写由or "字符(例如, 'hello'or "goodbye") 包围的字符串,而mysql允许您输入跨越多行的字符串。当您看到'>or ">提示符时,表示您输入了包含以' or"引号字符开头的字符串的行,但尚未输入终止该字符串的匹配引号。这通常表示您无意中遗漏了引号字符。例如:

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. 这可能会让人非常困惑,尤其是当您不知道在取消当前查询之前需要提供终止引号时。

笔记

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