确保您已连接到服务器,如上一节所述。这样做本身不会选择任何数据库来处理,但这没关系。在这一点上,更重要的是了解如何发出查询,而不是直接创建表、将数据加载到表中以及从中检索数据。本节介绍输入查询的基本原则,使用几个您可以尝试的查询来熟悉 mysql 的工作原理。
以下是一个简单的查询,它要求服务器告诉您其版本号和当前日期。按照此处所示输入 mysql>
提示符,然后按 Enter 键
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 以表格形式(行和列)显示查询输出。第一行包含列的标签。后面的行是查询结果。通常,列标签是您从数据库表中获取的列的名称。如果您要检索表达式的值而不是表列(如刚才的示例所示),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.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 所处状态的含义。
提示符 | 含义 |
---|---|
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
的行。这可能会造成很大困扰,尤其是在您不知道需要先提供终止引号才能取消当前查询的情况下。
从此处开始,多行语句在编写时不使用辅助提示符(->
或其他),以便于您复制和粘贴语句以自行尝试。