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
的行。这可能会很混乱,特别是如果你不知道需要在取消当前查询前提供终止引号。
从现在开始的多行语句将不再包含次要(>或其他)提示,以便更方便地复制并粘贴语句来自己尝试。