文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美國信紙尺寸) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


22.4.4.2 選擇表格

您可以使用 select() 方法來查詢並傳回資料庫中表格的記錄。X DevAPI 提供了其他方法與 select() 方法搭配使用,以篩選和排序傳回的記錄。

MySQL 提供以下運算子來指定搜尋條件:OR (||)、AND (&&)、XORISNOTBETWEENINLIKE!=<>>>=<<=&|<<>>+-*/~%

選擇所有記錄

若要發出查詢以傳回現有表格中的所有記錄,請使用 select() 方法,而不指定搜尋條件。以下範例會選取 world_x 資料庫中 city 表格的所有記錄。

注意

請將空白 select() 方法的使用限制於互動式陳述式。請務必在您的應用程式程式碼中使用明確的欄名選取。

mysql-py> db.city.select()
+------+------------+-------------+------------+-------------------------+
| ID   | Name       | CountryCode | District   | Info                    |
+------+------------+-------------+------------+-------------------------+
|    1 | Kabul      | AFG         | Kabol      |{"Population": 1780000}  |
|    2 | Qandahar   | AFG         | Qandahar   |{"Population": 237500}   |
|    3 | Herat      | AFG         | Herat      |{"Population": 186800}   |
...    ...          ...           ...          ...
| 4079 | Rafah      | PSE         | Rafah      |{"Population": 92020}    |
+------+------- ----+-------------+------------+-------------------------+
4082 rows in set (0.01 sec)

空集合 (沒有相符的記錄) 會傳回以下資訊

Empty set (0.00 sec)
篩選搜尋

若要發出查詢以傳回一組表格欄,請使用 select() 方法,並在方括號之間指定要傳回的欄。此查詢會傳回 city 表格的 Name 和 CountryCode 欄。

mysql-py> db.city.select(["Name", "CountryCode"])
+-------------------+-------------+
| Name              | CountryCode |
+-------------------+-------------+
| Kabul             | AFG         |
| Qandahar          | AFG         |
| Herat             | AFG         |
| Mazar-e-Sharif    | AFG         |
| Amsterdam         | NLD         |
...                 ...
| Rafah             | PSE         |
| Olympia           | USA         |
| Little Falls      | USA         |
| Happy Valley      | USA         |
+-------------------+-------------+
4082 rows in set (0.00 sec)

若要發出查詢以傳回符合特定搜尋條件的列,請使用 where() 方法來包含這些條件。例如,以下範例會傳回開頭為字母 Z 的城市名稱和國家代碼。

mysql-py> db.city.select(["Name", "CountryCode"]).where("Name like 'Z%'")
+-------------------+-------------+
| Name              | CountryCode |
+-------------------+-------------+
| Zaanstad          | NLD         |
| Zoetermeer        | NLD         |
| Zwolle            | NLD         |
| Zenica            | BIH         |
| Zagazig           | EGY         |
| Zaragoza          | ESP         |
| Zamboanga         | PHL         |
| Zahedan           | IRN         |
| Zanjan            | IRN         |
| Zabol             | IRN         |
| Zama              | JPN         |
| Zhezqazghan       | KAZ         |
| Zhengzhou         | CHN         |
...                 ...
| Zeleznogorsk      | RUS         |
+-------------------+-------------+
59 rows in set (0.00 sec)

您可以使用 bind() 方法將值與搜尋條件分開。例如,不要使用 "Name = 'Z%' " 作為條件,而是替換成一個由冒號開頭,後面接著字母開頭的名稱組成的具名預留位置,例如 name。然後在 bind() 方法中包含預留位置和值,如下所示

mysql-py> db.city.select(["Name", "CountryCode"]).where(
"Name like :name").bind("name", "Z%")
提示

在程式中,繫結可讓您在運算式中指定預留位置,這些預留位置會在執行前填入值,並且可以適當地受益於自動跳脫。

務必使用繫結來清理輸入。請避免使用字串串連在查詢中引入值,這可能會產生無效的輸入,在某些情況下,還會導致安全性問題。

專案結果

若要使用 AND 運算子發出查詢,請在 where() 方法中的搜尋條件之間新增運算子。

mysql-py> db.city.select(["Name", "CountryCode"]).where(
"Name like 'Z%' and CountryCode = 'CHN'")
+----------------+-------------+
| Name           | CountryCode |
+----------------+-------------+
| Zhengzhou      | CHN         |
| Zibo           | CHN         |
| Zhangjiakou    | CHN         |
| Zhuzhou        | CHN         |
| Zhangjiang     | CHN         |
| Zigong         | CHN         |
| Zaozhuang      | CHN         |
...              ...
| Zhangjiagang   | CHN         |
+----------------+-------------+
22 rows in set (0.01 sec)

若要指定多個條件運算子,您可以使用括號括住搜尋條件,以變更運算子的優先順序。以下範例示範了 ANDOR 運算子的放置方式。

mysql-py> db.city.select(["Name", "CountryCode"]).where(
"Name like 'Z%' and (CountryCode = 'CHN' or CountryCode = 'RUS')")
+-------------------+-------------+
| Name              | CountryCode |
+-------------------+-------------+
| Zhengzhou         | CHN         |
| Zibo              | CHN         |
| Zhangjiakou       | CHN         |
| Zhuzhou           | CHN         |
...                 ...
| Zeleznogorsk      | RUS         |
+-------------------+-------------+
29 rows in set (0.01 sec)
限制、排序和偏移結果

您可以使用 limit()order_by()offset() 方法來管理 select() 方法傳回的記錄數量和順序。

若要指定結果集中包含的記錄數量,請將含有值的 limit() 方法附加到 select() 方法。例如,以下查詢會傳回 country 表格中的前五筆記錄。

mysql-py> db.country.select(["Code", "Name"]).limit(5)
+------+-------------+
| Code | Name        |
+------+-------------+
| ABW  | Aruba       |
| AFG  | Afghanistan |
| AGO  | Angola      |
| AIA  | Anguilla    |
| ALB  | Albania     |
+------+-------------+
5 rows in set (0.00 sec)

若要指定結果的順序,請將 order_by() 方法附加到 select() 方法。將一個或多個要排序的欄的清單傳遞到 order_by() 方法,並視情況選擇性地傳遞遞減 (desc) 或遞增 (asc) 屬性。遞增順序是預設的排序類型。

例如,以下查詢會依 Name 欄排序所有記錄,然後依遞減順序傳回前三筆記錄。

mysql-py> db.country.select(["Code", "Name"]).order_by(["Name desc"]).limit(3)
+------+------------+
| Code | Name       |
+------+------------+
| ZWE  | Zimbabwe   |
| ZMB  | Zambia     |
| YUG  | Yugoslavia |
+------+------------+
3 rows in set (0.00 sec)

依預設,limit() 方法會從表格中的第一筆記錄開始。您可以使用 offset() 方法來變更起始記錄。例如,若要忽略第一筆記錄並傳回符合條件的後三筆記錄,請將值 1 傳遞到 offset() 方法。

mysql-py> db.country.select(["Code", "Name"]).order_by(["Name desc"]).limit(3).offset(1)
+------+------------+
| Code | Name       |
+------+------------+
| ZMB  | Zambia     |
| YUG  | Yugoslavia |
| YEM  | Yemen      |
+------+------------+
3 rows in set (0.00 sec)
相關資訊