相關文件 下載本手冊
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  教學  /  輸入查詢

5.2 輸入查詢

如上一節所述,請確保您已連線至伺服器。這樣做本身不會選取任何要使用的資料庫,但這沒關係。此時,更重要的是稍微了解如何發出查詢,而不是直接跳進建立表格、將資料載入其中以及從中檢索資料。本節描述輸入查詢的基本原則,使用您可以嘗試的幾個查詢,讓您熟悉 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 或機器時間),並且會受到伺服器負載和網路延遲等因素的影響。(為簡潔起見,本章其餘範例中有時不會顯示 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 處於什麼狀態的意義。

提示符號 意義
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 的行。這可能會非常令人困惑,特別是如果您不知道在取消目前查詢之前需要提供終止引號。

注意

從此處開始,多行陳述式將不使用次要提示符號(-> 或其他),以便更容易複製並貼上陳述式以自行嘗試。