## 3.2 輸入查詢
如上一節所述, 確認你已連接到服務器. 這樣做并沒有選擇任何要使用的數據庫, 但這樣是可以的. 此時, 了解一下如何發出查詢比直接創建表, 將數據加載到表中并從中檢索數據更重要. 本節描述了輸入查詢的基本規則, 你可以使用幾個查詢來熟悉 [mysql](mysql.md) 的工作原理.
下面是一個簡單的查詢, 要求服務器告訴你它的版本號和當前日期. 如下面所示, 在 `mysql>` 提示符下輸入, 然后回車:
```sql
mysql> SELECT VERSION(), CURRENT_DATE;
+-----------+--------------+
| VERSION() | CURRENT_DATE |
+-----------+--------------+
| 5.8.0-m17 | 2015-12-21 |
+-----------+--------------+
1 row in set (0.02 sec)
mysql>
```
這個查詢說明了 [mysql](mysql.md) 的幾個特點:
- 一個查詢通常由 SQL 語句和分號組成. (有一些例外, 分號可以省略. 前面提到的 `QUIT` 就是其中之一. 我們稍后討論其他問題.)
- 當發出一個查詢, [mysql](mysql.md) 發送它到服務器執行并顯示結果, 然后打印另一個 `mysql>` 提示符, 說明它已經準備好進行另一個查詢.
- [mysql](mysql.md) 以表格(行和列)的形式顯示查詢輸出. 第一行包含列的標簽. 下面的行是查詢結果. 通常, 列的標簽是從數據庫的表中獲取的列的名稱. 如果檢索的是表達式的值而不是表的列(如剛才的示例), [mysql](mysql.md) 使用表達式很深來標記列.
- [mysql](mysql.md) 顯示了返回多少行以及查詢執行了多長時間, 這能讓你大致了解服務器性能. 這些值并不精確, 因為他們顯示的是系統時間(不是 CPU 或者機器時間), 而且收到服務器負載和網絡延遲等因素的影響. (為簡介起見, 本節中的其余示例又是沒有顯示 “rows in set” 行.)
關鍵字可以不區分大小寫. 下列查詢是等價的:
```sql
mysql> SELECT VERSION(), CURRENT_DATE;
mysql> select version(), current_date;
mysql> SeLeCt vErSiOn(), current_DATE;
```
下面是另一個查詢. 它演示了可以將 [mysql](mysql.md) 用作簡單的計算器:
```sql
mysql> SELECT SIN(PI()/4), (4+1)*5;
+------------------+---------+
| SIN(PI()/4) | (4+1)*5 |
+------------------+---------+
| 0.70710678118655 | 25 |
+------------------+---------+
1 row in set (0.02 sec)
```
到目前位置顯示的查詢都是相對簡短的單行語句. 你甚至可以在一行中輸入多個語句, 用分號結尾即可:
```sql
mysql> SELECT VERSION(); SELECT NOW();
+-----------+
| VERSION() |
+-----------+
| 8.0.13 |
+-----------+
1 row in set (0.00 sec)
+---------------------+
| NOW() |
+---------------------+
| 2018-08-24 00:56:40 |
+---------------------+
1 row in set (0.00 sec)
```
查詢不需要再一行中給出所有的內容, 因此需要多行內容的長查詢不是問題. [mysql](mysql.md) 通過查找結束分號來確定語句的結束位置, 而不是通過查找輸入行的末尾. (換句話說, [mysql](mysql.md) 接受自由格式的輸入: 它收集輸入行, 但直到看到分號才執行它們.)
下面是一個簡單的多行語句:
```bash
mysql> SELECT
-> USER()
-> ,
-> CURRENT_DATE;
+---------------+--------------+
| USER() | CURRENT_DATE |
+---------------+--------------+
| jon@localhost | 2018-08-24 |
+---------------+--------------+
```
在本例中, 注意在你輸入多行查詢的第一行之后, 提示符從 `mysql>` 更改為 `->` . 這就是 [mysql](mysql.md) 表示它還沒看到完整的語句, 正等待其它語句. 提示符是你的朋友, 因為它提供了有價值的反饋. 如果你使用這種反饋, 你總是可以直到 [mysql](mysql.md) 在等待什么.
如果你決定不執行正在輸入的查詢, 請輸入 `\c`:
```sql
mysql> SELECT
-> USER()
-> \c
mysql>
```
這里也注意提示符. 輸入`\c`后, 它會切換回 `mysql>`, 提供反饋提示 [mysql](mysql.md) 已經準備好進行新的查詢.
下表顯示了你可能看到的每個提示符, 并總結了它們對于 [mysql](mysql.md) 所處狀態的含義.
| 提示符 | 含義 |
|:---:|:---:|
| `mysql>` | 準備好進行新的查詢 |
| `->` | 等待多行查詢中的下一行 |
| `'>` | Waiting for next line, waiting for completion of a string that began with a single quote (`) |
| `">` | Waiting for next line, waiting for completion of a string that began with a double quote (`) |
| ``>` | Waiting for next line, waiting for completion of an identifier that began with a backtick (`) |
| `/*>` | Waiting for next line, waiting for completion of a comment that began with `/*` |
當你打算在一行上發出查詢, 但忘記終止分號時, 多行語句通常意外的發生. 在這種情況下, [mysql](mysql.md) 等待更多輸入:
```sql
mysql> SELECT USER()
->
```
如果發生在你身上(你認為你已經輸入語句, 但唯一的響應是 `->` 提示符), 則可能是 [mysql](mysql.md) 在等待分號. 如果你沒有注意到提示告訴你什么, 你可能會坐在那里一段時間, 然后意識到你需要做什么. 輸入分號完成語句, 并且 [mysql](mysql.md) 執行它:
```sql
mysql> SELECT USER()
-> ;
+---------------+
| USER() |
+---------------+
| jon@localhost |
+---------------+
```
`'>` 和 `">` prompts occur during string collection (另外一種 MySQL 等待字符串完成的方法). 在 MySQL, 你可以編寫由 `'` 或者 `"` 字符包圍的字符串(例如, `'hello'` 或者 `"goodbye"`), 并且 [mysql](mysql.md) 允許你輸入跨多行的字符串. 當你看到 `'>` 或者 `">` 提示符時, 它意味著你輸入了包含以 `'` 或者 `"` 引號字符開頭的字符串, 但尚未輸入終止該字符串的匹配引號使其終止. 這通常表示你無意中漏掉了引號字符. 例如:
```sql
mysql> SELECT * FROM my_table WHERE name = 'Smith AND age < 30;
'>
```
如果你輸入此 [`SELECT`](https://dev.mysql.com/doc/refman/8.0/en/select.html) 語句, 然后按 `Enter` 等待結果, 什么都沒有發生. 不要想為什么這個查詢要花費這么久的時間, 注意 `'>` 提示符提供的線索. 它告訴你 [mysql](mysql.md) 期望看到未結束的字符串的剩余部分. (你看到語句中的錯誤了嗎? 字符串 `'Smith` 缺少第二個單引號.)
此時, 你需要做什么? 最簡單的方法就是取消查詢. 然而, 在本例中你不能只輸入 `\c`, 因為 [mysql](mysql.md) 將其解釋為正在收集的字符串的一部分. 相反, 輸入結束引號字符(這樣 [mysql](mysql.md) 就直到你已經完成了字符串輸入), 然后輸入 `\c`:
```sql
mysql> SELECT * FROM my_table WHERE name = 'Smith AND age < 30;
'> '\c
mysql>
```
提示符更改為 `mysql>`, 表示 [mysql](mysql.md) 已經準備好進行新的查詢.
``>` 提示符類似于 `'>` 和 `">` 提示符, 但表示你已經開始但尚未結束反引號的標識符.
知道 `'>`, `">`, 和 ``>` 提示符表示什么是非常重要的, 因為如果你錯誤的輸入了一個未停止字符串, 那么你輸入的任何其它行都被會 [mysql](mysql.md) 忽略 —— 包括包含 `QUIT` 的行. 這可能非常讓人疑惑, 特別是如果你不知道在取消當前查詢之前需要提供停止引號.
> **注意**
>
> 從現在開始, 多行語句的編寫不再需要輔助 (`->` 或者其它)提示符, 以便更容易的復制和粘貼語句, 以便你自己嘗試.
- 簡介
- 前言和法律條款
- 安裝和更新 MySQL
- 在 Linux 上安裝 MySQL
- 在 Linux 上使用 APT 庫安裝 MySQL
- 在 Linux 上使用 Docker 部署 MySQL
- 使用 Docker 部署 MySQL 服務器的基本步驟
- 使用 Docker 部署 MySQL 服務器的更多主題
- 教程
- 連接到服務器和從服務器斷開
- 輸入查詢
- 創建和使用數據庫
- 創建和選擇數據庫
- 創建表
- 將數據加載到表中
- 從表中檢索數據
- 選擇所有數據
- 選擇特定行
- 選擇指定列
- 行排序
- 日期計算
- 處理 NULL 值
- 模式匹配
- 計算行數
- 使用多個表
- 獲取數據庫和表的信息
- 在批處理模式使用 mysql
- 常見查詢示例
- 列的最大值
- 包含某一行最大值的記錄
- 每組中列的最大值
- 擁有某個字段的組間最大值的行
- 使用用戶自定義變量
- 使用外鍵
- 兩個鍵上搜索
- 計算每日訪問量
- 使用 AUTO_INCREMENT
- 在 Apache 中使用 MySQL
- MySQL 程序
- MySQL 客戶端程序
- mysql — MySQL 命令行客戶端
- 優化
- 優化概述
- 優化 SQL 語句
- 優化和索引
- 優化數據庫結構
- 優化 InnoDB 表
- 優化 MyISAM 表
- 優化 MEMORY 表
- 理解查詢執行計劃
- 控制查詢優化器
- 緩沖和緩存
- 優化鎖操作
- 優化 MySQL 服務器
- 測量性能 (Benchmarking)
- 檢查線程信息