3.2 Importing 查询

如上一节所述,确保您已连接到服务器。这样做本身并不选择要使用的任何数据库,但是可以。在这一点上,了解有关如何发出查询的知识比直接跳转到创建 table,将数据加载到 table 中以及从 table 中检索数据更重要。本节介绍了 Importing 查询的基本原理,您可以尝试使用几种查询来熟悉mysql的工作原理。

这是一个简单的查询,要求服务器告诉您其版本号和当前日期。在mysql>提示符后按如下所示 Importing 它,然后按 Enter:

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>提示符以 table 明它已准备好进行另一个查询。

  • mysql以 table 格形式(行和列)显示查询输出。第一行包含各列的标签。下面的行是查询结果。通常,列标签是您从数据库 table 中获取的列的名称。如果您要获取 table 达式而不是 table 列的值(如刚刚所示的示例),则mysql使用 table 达式本身来标记该列。

  • mysql显示了返回了多少行以及查询执行了多长时间,这使您对服务器性能有了一个大概的了解。这些值不精确,因为它们 table 示挂钟时间(而不是 CPU 或机器时间),并且受诸如服务器负载和网络延迟之类的因素的影响。 (为简便起见,本章的其余示例有时未显示“行数设置”行.)

可以在任何大写字母中 Importing 关键字。以下查询是等效的:

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)

到目前为止显示的查询是相对简短的单行语句。您甚至可以在一行上 Importing 多个语句。只需以分号结束每个人:

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通过查找终止分号(而不是通过查找 Importing 行的末尾)来确定语句的结尾。 (换句话说,mysql接受自由格式 Importing:它收集 Importing 行,但直到看到分号时才执行它们。)

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

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

在此示例中,请注意 Importing 多行查询的第一行后,提示如何从mysql>变为->。这就是mysqltable 示尚未看到完整的语句并正在 await 其余语句的方式。该提示是您的朋友,因为它提供了宝贵的反馈。如果您使用该反馈,则始终可以知道mysql正在 await 什么。

如果您决定不想执行正在 Importing 的查询,请 Importing\c取消查询:

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

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

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

PromptMeaning
mysql>准备进行新查询
->await 多行查询的下一行
'>await 下一行,await 以单引号(')开头的字符串的完成
">await 下一行,await 以双引号(")开头的字符串的完成
```>````'')开头的标识符的完成
/*>await 下一行,await 以/*开头的 Comment 的完成

当您打算在单行上发出查询时,多行语句通常是偶然发生的,但是会忘记终止的分号。在这种情况下,mysqlawait 更多 Importing:

mysql> SELECT USER()
    ->

如果您遇到这种情况(您认为自己已经 Importing 了一条语句,但是唯一的响应是->提示符),则很可能mysql正在 await 分号。如果您没有注意到提示所告诉的内容,则可以在这里坐一会儿,然后再意识到需要做的事情。Importing 分号以完成该语句,然后mysql执行该语句:

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

在字符串收集期间出现'>">提示(另一种说法是 MySQL 正在 await 字符串完成)。在 MySQL 中,您可以编写由'"字符包围的字符串(例如'hello'"goodbye"),而mysql可让您 Importing 跨多行的字符串。当看到'>">提示时,table 示您 Importing 的行包含以'"引号字符开头的字符串,但尚未 Importing 匹配的引号来终止该字符串。这通常 table 明您无意中省略了引号字符。例如:

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

如果 Importing 此SELECT语句,然后按 Enter 并 await 结果,则什么都不会发生。不用奇怪为什么这个查询要花这么长时间,请注意'>提示提供的线索。它告诉您mysql期望看到未终止字符串的其余部分。 (您是否在语句中看到错误?字符串'Smith缺少第二个单引号.)

此时,您该怎么办?最简单的事情是取消查询。但是,在这种情况下,您不能只键入\c,因为mysql会将其解释为所收集字符串的一部分。而是 Importing 右引号(因此mysql知道您已经完成了字符串),然后键入\c

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

提示将变回mysql>,table 明mysql已准备好进行新查询。

“''>提示符类似于'>">提示符,但 table 示您已经开始但未完成反引号引起的标识符。

重要的是要知道'>">和```>``提示的含义,因为如果您错误地 Importing 了一个未终止的字符串,则mysql似乎会忽略您键入的任何其他行,包括QUIT在内。这可能会造成混乱,尤其是在您不知道需要提供终止报价才能取消当前查询之前。

Note

此后的多行语句在编写时没有辅助(->或其他)提示,从而使复制和粘贴语句更容易进行尝试。