您可以使用 select()
方法來查詢並傳回資料庫中表格的記錄。X DevAPI 提供其他方法與 select()
方法搭配使用,以篩選和排序傳回的記錄。
MySQL 提供以下運算子來指定搜尋條件:OR
(||
)、AND
(&&
)、XOR
、IS
、NOT
、BETWEEN
、IN
、LIKE
、!=
、<>
、>
、>=
、<
、<=
、&
、|
、<<
、>>
、+
、-
、*
、/
、~
和 %
。
若要發出查詢以傳回現有表格中的所有記錄,請使用不指定搜尋條件的 select()
方法。下列範例會選取 world_x
資料庫中城市表格的所有記錄。
請限制將空的 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()
方法,並在方括號之間指定要傳回的資料行。此查詢會傳回城市表格中的 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)
若要指定多個條件運算子,您可以使用括號括住搜尋條件,以變更運算子優先順序。以下範例示範 AND
和 OR
運算子的放置方式。
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()
方法。例如,下列查詢會傳回國家/地區表格中的前五筆記錄。
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()
方法。將一或多個要排序的資料行清單以及選擇性的遞減 (desc
) 或遞增 (asc
) 屬性傳遞給 order_by()
方法(視情況而定)。遞增順序是預設的順序類型。
例如,下列查詢會依 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)
MySQL 參考手冊提供有關函式和運算子的詳細文件。
如需完整語法定義,請參閱 TableSelectFunction。