select()
メソッドを使用して、データベース内のテーブルに対してクエリーを実行し、レコードを戻すことができます。 X DevAPI には、返されたレコードをフィルタおよびソートするために select()
メソッドとともに使用する追加のメソッドが用意されています。
MySQL には、検索条件を指定する次の演算子が用意されています: OR
(||
)、AND
(&&
)、XOR
, IS
, NOT
, BETWEEN
, IN
, LIKE
, !=
, <>
, >
, >=
, <
, <=
, &
, |
, <<
, >>
, +
, -
, *
, /
, ~
および %
。
既存のテーブルからすべてのレコードを返すクエリーを発行するには、検索条件を指定せずに 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)
複数の条件演算子を指定するには、検索条件をカッコで囲んで演算子の優先順位を変更します。 次の例は、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()
メソッドの値を追加します。 たとえば、次のクエリーでは、国テーブルの最初の 5 つのレコードが返されます。
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()
メソッドに渡します。 昇順がデフォルトのオーダータイプです。
たとえば、次のクエリーでは、すべてのレコードが名前カラムでソートされ、最初の 3 つのレコードが降順で返されます。
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()
メソッドを使用して、開始レコードを変更できます。 たとえば、最初のレコードを無視し、条件に一致する次の 3 つのレコードを返すには、offset()
メソッドに値 1 を渡します。
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 Reference Manual には、関数および演算子に関する詳細なドキュメントが用意されています。
完全な構文の定義は、TableSelectFunction を参照してください。