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 行受影响 (0.02 秒)
到目前为止展示的查询都是相对简短的单行语句。你甚至可以在一行上输入多个语句。只需用分号结束每个语句即可:
mysql> SELECT VERSION(); SELECT NOW(); +-----------+ | VERSION() | +-----------+ | 8.0.13 | +-----------+ 1 行受影响 (0.00 秒) +---------------------+ | NOW() | +---------------------+ | 2018-08-24 00:56:40 | +---------------------+ 1 行受影响 (0.00 秒)
一个查询不必全部在一行上给出,因此需要多行的长查询不是问题。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所处状态的含义。
提示符 | 含义 |
mysql> | 准备进行新的查询 |
-> | 等待多行查询的下一行 |
'> | 等待下一行,等待完成以单引号(')开头的字符串 |
"> | 等待下一行,等待完成以双引号(")开头的字符串 |
`> | 等待下一行,等待完成以反引号(`)开头的标识符 |
/*> | 等待下一行,等待完成以/*开头的注释 |
多行语句通常是在你打算在单行上发出查询但忘记终止分号时意外发生的。在这种情况下,mysql会等待更多的输入:
mysql> SELECT USER() ->
如果你遇到这种情况(你认为你已经输入了一个语句,但唯一的响应是一个->提示符),很可能是mysql在等待分号。如果你没有注意到提示符所告诉你的内容,你可能会坐在那里一段时间才意识到你需要做什么。输入一个分号来完成语句,mysql就会执行它:
mysql> SELECT USER() -> ; +---------------+ | USER() | +---------------+ | jon@localhost | +---------------+
'>和">提示符出现在字符串收集期间(另一种说法是MySQL在等待字符串完成)。在MySQL中,你可以用'或"字符括起来编写字符串(例如,'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忽略——包括包含QUIT的行。这可能会非常令人困惑,特别是如果你不知道需要在取消当前查询之前提供终止引号。