输入查询
确保已连接到服务器,如上一节中所述。这样做本身并不会选择任何可以使用的数据库,但这没关系,此时,更重要的是要找到一些关于如何发出查询的信息,而不是直接创建表,将数据加载到它们中以及从中检索数据。本节介绍了输入查询的基本原则,使用你可以尝试的几个查询来熟悉mysql
的工作原理。
这是一个简单的查询,要求服务器告诉你它的版本号和当前日期,在mysql>
提示符后面输入如下所示,然后按Enter键:
mysql> SELECT VERSION(), CURRENT_DATE;
+-----------+--------------+
| VERSION() | CURRENT_DATE |
+-----------+--------------+
| 5.8.0-m17 | 2019-07-09 |
+-----------+--------------+
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() |
+---------------------+
| 2019-07-09 00:01:40 |
+---------------------+
1 row in set (0.00 sec)
不需要在一行上给出全部查询,所以需要多行的长查询不是问题。mysql
通过查找终止分号来确定语句的结束位置,而不是查找输入行的结尾(换句话说,mysql
接受自由格式输入:它收集输入行但在看到分号之前不执行它们)。
这是一个简单的多行语句:
mysql> SELECT
-> USER()
-> ,
-> CURRENT_DATE;
+---------------+--------------+
| USER() | CURRENT_DATE |
+---------------+--------------+
| jon@localhost | 2019-07-09 |
+---------------+--------------+
在此示例中,请注意在输入多行查询的第一行后,提示如何从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
语句,则按回车键并等待结果,没有任何反应,而不是想知道为什么这个查询花了这么长时间,请注意'>
提示符提供的线索。它告诉你mysql希望看到未终止的字符串的其余部分(你是否在语句中看到错误?字符串'Smith
缺少第二个单引号)。
此时,你要做什么?最简单的方法是取消查询,但是,在这种情况下,你不能只键入\c
,因为mysql
将其解释为它正在收集的字符串的一部分。相反,输入结束引号字符(所以mysql
知道你已经完成了字符串),然后键入\c
:
mysql> SELECT * FROM my_table WHERE name = 'Smith AND age < 30;
'> '\c
mysql>
提示符更改回mysql>
,表示mysql
已准备好进行新查询。
`>
提示符类似于'>
和“>
提示符,但表示你已经开始但未完成反引号引用的标识符。
重要的是要知道'>
、“>
和`>
提示符号是什么意思,因为如果你错误地输入了一个未终止的字符串,你输入的任何其他行似乎都会被mysql
忽略 — 包括一行包含QUIT
的行。这可能非常令人困惑,特别是如果你不知道在取消当前查询之前需要提供终止引用。
此时的多行语句是在没有辅助(
->
或其他)提示符的情况下编写的,以便更容易地复制和粘贴语句,以便你自己尝试。