如上一節所述,請確保您已連線至伺服器。這樣做本身不會選取任何要使用的資料庫,但這沒關係。此時,更重要的是稍微了解如何發出查詢,而不是直接跳進建立表格、將資料載入其中以及從中檢索資料。本節描述輸入查詢的基本原則,使用您可以嘗試的幾個查詢,讓您熟悉 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
的行。這可能會非常令人困惑,特別是如果您不知道在取消目前查詢之前需要提供終止引號。
從此處開始,多行陳述式將不使用次要提示符號(->
或其他),以便更容易複製並貼上陳述式以自行嘗試。