Entering Queries
确定你已经连接至服务,像上面章节讨论的。这样做不会查询任何数据库也是可以的。在这点,对于找出怎么查询很重要,而不是创建表,加载数据到表中,并从表中提取数据。此章节描述了输入查询的基本原则,使用几条查询你可以试着熟悉mysql是怎样工作的。
这是一条简单的查询像服务询问其版本号和当前的日期。在mysql>提示符键入下面的语句并敲回车:
mysql> SELECT VERSION(), CURRENT_DATE;
+-----------+--------------+
| VERSION() | CURRENT_DATE |
+-----------+--------------+
| 5.7.17 | 2017-08-23 |
+-----------+--------------+
1 row in set (0.00 sec)
mysql>
此条查询举例说明了mysql几点东西:
- 一条查询通常由SQL语句后紧跟;组成(也有一些例外;可以缺失。QUIT,前面提到的是其中一个。我们稍后将知道其他的)。
- 当你查询时,mysql发送查询到服务用来执行并显示结果,然后打印另外的mysql>提示符表示已经准备好另外的查询了。
- mysql以表格的形式展示查询的输出(行和列)。第一行包含列的标签,接下来的行是查询的结果。通常情况下,列标签通常是你从数据库表中提取的名字。如果你取表达式的值而不是表格的列(像上面的例子),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.7071067811865475 | 25 |
+--------------------+---------+
1 row in set (0.00 sec)
相当短的,仅一行的查询语句。可以在一行输入多个语句。仅在每个语句后具有一个分号:
mysql> SELECT VERSION(); SELECT NOW();
+-----------+
| VERSION() |
+-----------+
| 5.7.17 |
+-----------+
1 row in set (0.00 sec)
+---------------------+
| NOW() |
+---------------------+
| 2017-08-23 09:47:55 |
+---------------------+
1 row in set (0.00 sec)
一条查询不需要在一行中指定,因此需要多行的较长的查询也不是问题。mysql通过分号终止符来决定你语句的结束,而不是输入行的结束。(换句话说,mysql接受自由格式的输入: 他收集输入行但不执行直到他找到了分号)
下面是一个简单的多行语句:
mysql> SELECT
-> USER(),
-> CURRENT_DATE;
+----------------+--------------+
| USER() | CURRENT_DATE |
+----------------+--------------+
| root@localhost | 2017-08-23 |
+----------------+--------------+
1 row in set (0.00 sec)
在这个例子中,注意到提示符由mysql>变成了->在你输入多行查询的第一行时。这是mysql表示它还没有看见一条完成的语句他正在等待余下的语句。提示符是你的朋友,因为他提供了有价值的反馈。如果你使用这样的的反馈,你可以总是意识到mysql在等待什么。
如果你决定你不想执行你输入的查询,通过键入\c来取消他:
mysql> SELECT
-> USER()
-> \c
mysql>
在这里,注意到提示符。在你键入\c后提示符又回到了mysql>,提供反馈表示mysql已经准备好接受新的查询了。
下表展示了每个你将见到的提示符并总结了他们分别代表的什么状态。
提示符 | 表示 |
---|---|
mysql> | 准备好新的查询 |
-> | 等待多行查询的下一行 |
'> | 等待下一行,等待单引号的完成 |
“> | 等待下一行,等待双引号的完成 |
`> | 等待下一行,等待反引号的完成 |
/*> | 等待下一行,待待以/* 开始的完在 |
多行语句通常会意外的发生当你打算在一行查询,但忘记终止分号时。在种情况下,mysql会等待更多的输入:
mysql> select user()
->
当这种情况发生在你身上(你认为你输入的语句但仅影响了->提示符),大多数情况下mysql在等待分号。如果你没有注意到提示符告诉你,你可能作在那里好一会在你意识到你需要做的事之前。输入分号来完成你的语句,然后mysql会执行他:
mysql> SELECT USER()
-> ;
+----------------+
| USER() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
'> 和 “>提示符发生在字符串收集期间(换另一种说法是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忽略-包括QUIT。这可能相当另人困惑,由其在如果你不知道在退出当前查询前你需要提供终止的引号